LINUX.ORG.RU

stm32 мигаем светодиодом

 


0

1

здрасьте здрасьте люди добрые. пришел контроллер и программатор STM32F103C8T, ST-LINK/V2. операционная система Ubuntu. если может кто-то то напишите пожалуйста пример програмки на assembler чтобы мигнуть светодиодом.

ее я скомпилирую и зашью. компилировать думаю

arm-none-eabi-as -o myfile.o myfile.s 

arm-none-eabi-objcopy mf.elf mf.bin -O binary
st-flash write my.bin 0x8000000
чего не могу? мигнуть светодиодом. или программка корявая или котроллер не работает. если можете дайте пример 100% рабочей программки на ассемблер чтобы проверить.



Последнее исправление: Assembler (всего исправлений: 3)

Ответ на: комментарий от Eddy_Em

Это - не базовый адрес! Это - bit_band_base

нo мне показалась что там не один базовый адрес, а несколько, но базовые они от разных областей. и смещение находил бы путем посмотрев в мануал там адрес порта

0x40010C00
вычитаю из него базовый Peripherals
40010C00-40000000=смещение
будьте добры, скажите еще это магическое число
 MAGICK 0x0200`0000
мы откуда взяли?

Assembler
() автор топика
Ответ на: комментарий от Assembler

я к тому что мы говорили смотри memory map. я смотрю и не вижу там 420000000

Его там и не должно быть, 0x4200’0000 это отображение БИТОВ начиная с 0x4000’0000, мы же тут с Анонимусом привели расчет как перевести одно в другое. Почитайте тот скриншот и алгоритмы.

И точно такое же отображение есть с 0x2000’0000 на 0x2200’0000

Сами регистры лежат, естественно, начиная с 0x4000’0000, но к их БИТАМ можно обратиться по адресам 0x4200’0000 при желании.

Но еще раз говорю: не надо так делать. Вы пока и с обычным доступом не разобрались, рано вам лезть в bit-band.

COKPOWEHEU
()
Ответ на: комментарий от Assembler

вычитаю из него базовый Peripherals

40010C00-40000000=смещение

Да

или тут у вас опечатка?

MAGICK 0x0200`0000

Да. Должно быть начало оперативки 0x2000’0000

Наверное, это я его сбил просьбой пропечатывать все цифры. Для начала флеша это важно, он как раз по 0x0800’0000

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

но к их БИТАМ можно обратиться по адресам 0x4200’0000 при желании.

вы запутали меня. их биты лежат по адресу

0x20000000
?

Assembler
() автор топика
Ответ на: комментарий от COKPOWEHEU

Да. Должно быть начало оперативки 0x2000’0000

Нет, 0x2000`0000 - это начало SRAM, а нужно брать адрес базы и к нему прибавлять 32МБ (MAGICK), чтобы получить адрес битбанд-региона. 32МБ — это 0x0200`0000.

Битбанд есть (где есть) только для срама и периферии, поэтому для срама начало битбанд-региона лежит в 0x2200`0000, а для периферии — в 0x4200`0000.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Assembler

вы запутали меня. их биты лежат по адресу

0x20000000

Нет, там лежит обычная память, состоящая из обычных байтов.

А по адресу 0x4000’0000 лежат регистры периферии.

А по адресу 0x4200’0000 можно получить доступ к отдельным их битам.

Нет, 0x2000’0000 - это начало SRAM, а нужно брать адрес базы и к нему прибавлять 32МБ (MAGICK), чтобы получить адрес битбанд-региона. 32МБ — это 0x0200’0000.

Думаю, это только больше запутает. У нас есть две области данных и две области битбандов. Какие у них абсолютные адреса нам в общем-то безразлично, важно смещение от начала области.

То есть не 0x2000'0000 + 0x0200'0000 = 0x2200'0000 а 0x2000'0000 -> 0x2200'0000

COKPOWEHEU
()
Последнее исправление: COKPOWEHEU (всего исправлений: 1)
Ответ на: комментарий от COKPOWEHEU

ну нормально вы меня огородами провели! я даже вспотел. Все господа, вроде нашел. спасибо

Так вам сразу сказали не страдать фигней, а учить сначала базовые вещи. Если вы не понимаете где в контроллере лежит программа, оперативка и периферия, какой смысл пытаться разобраться с битовой магией?

COKPOWEHEU
()
Ответ на: комментарий от Assembler

Не пытайтесь разобраться во всем одновременно. Сначала помигайте диодиком как все - на Си или даже на Кубе. А потом погружаться все глубже и глубже. А не хвататься за первый попавшийся код, которым никто не пользуется и который вам все равно бесполезен.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

на Си

думаю, что это умоляет достоинства CИ. это серьезный язык и не для мигания светодиодом. Ладно, как будет так будет. все равно без помощи форума не разобраться, какой бы язык не взять.

Assembler
() автор топика
Ответ на: комментарий от Assembler

Можно подумать мигалка светодиодом не умаляет достоинств контроллера. Для задачи, на решение которой достаточно двух транзисторов и горсти пассивки, используют цифрового монстра с 72 МГц частоты, 20 кБ оперативки и 64 кБ флеша.

«если ничто другое не помогает, используй грубую силу». Не можете с ходу развести плату и запрограммировать ее на ассемблере - возьмите готовую, возьмите генератор кода и проверьте так. Получилось? Переводите полученное решение на тот стек технологий, который вам больше нравится.

без помощи форума не разобраться, какой бы язык не взять.

Это вы просто не пробовали. Я что с AVR, что с STM разбирался без помощи форумов, по книжкам, статьям и документации.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Я что с AVR, что с STM разбирался без помощи форумов, по книжкам, статьям и документации

вы просто огромный молодец. спасибо что вы есть здесь. начинающим нужны такие учителя

Assembler
() автор топика

Пацаны, новый рекорд! :) Это для Blue Pill, у которой светодиод включается нулевым уровнем.

.syntax unified
.cpu cortex-m3
.thumb
.global _start

.text
    .word   0x424200d0, _start+1
    _start:
        sub     r1, sp, #0x200000
        adds    r2, #1
        lsrs    r3, r2, #16
        str     r3, [r1]                @; PC13 MODE0
        str     r3, [sp, #0x310-0xd0]   @; port C enable
        b.n _start

Собирать как обычно:

arm-none-eabi-as blinky.s -o blinky.o
arm-none-eabi-ld blinky.o -Ttext=0x08000000 -o blinky.elf
arm-none-eabi-objcopy blinky.elf -O binary blinky.bin
$ stat -c %s blinky.bin 
22
anonymous
()
Ответ на: комментарий от anonymous

Вот только никакого отношения к реальной жизни этот пример не имеет. Ну и толку блинк в три байта впихнуть пытаться?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А ты попробуй, может тебе тоже понравится :)

anonymous
()
Ответ на: комментарий от Assembler

скоро увидим программу в три строки) вы гений

Только это решение не масштабируется, а значит грош ему цена. Но тебе рано (или поздно) о таком думать.

anonymous
()
Ответ на: комментарий от burato

Владимир, перелогинься

Подмигиваю вам светодиодом ;)

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Но тебе рано (или поздно) о таком думать.

вы как всегда правы. наши одногрупницы, когда увидили эту программку, сказали, что хотят от вас ребенка. я вам завидую)

Assembler
() автор топика
Ответ на: комментарий от COKPOWEHEU

Лучше бы полезное что реализовали

Халфлайф 3? Что такое польза? И лучше для кого? Оne man’s trash is another man’s treasure.

Эдик, вон, свой кошмарный sysreset(), который в несколько раз больше этого блинки, в каждую поделку вставляет и ещё и пропагандирует за подобный стиль. Чем он такую «пользу» мотивирует? Неуверенностью в компиляторе, своих знаниях или в глюках контроллера?

anonymous
()
Ответ на: комментарий от anonymous

Это тот, которым можно будет потом воспользоваться, или который решает какую-то задачу, или хотя бы выглядит красиво.

Эдик, вон, свой кошмарный sysreset(), который в несколько раз больше этого блинки, в каждую поделку вставляет

А вы что, предлагаете вставлять в каждую поделку свою?! В смысле без таблицы прерываний, без инициализации, без расширяемости.

Уж лучше то, что ST предлагают или вариант Эдди.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Это тот, которым можно будет потом воспользоваться, или который решает какую-то задачу, или хотя бы выглядит красиво.

Всё подходит под мой блинки: пользуйтесь хоть сейчас, хоть потом; задачу мигания СД решает; а выглядит так просто блистательно!

без таблицы прерываний

А для чего захламлять код неиспользуемыми векторами? То, что они там будут в этой табличке не сделает их полезными, получается. По всем трём пунктам.

без инициализации

Без инициализации чего? Все регистры уже инициализированы при старте контроллера. Возможно вам стоит уточнить значение слова «сброс» (re set).

без расширяемости

Что такое расширяемость? Наворотить ненужных слоёв абстракции? Так тогда почему вы Кубом или Ардуино не пользуетесь? Очень удобно, «расширяемо» и красиво. Полезно, в общем.

Да и вы видели тот sysreset()? Ничего там и не сбрасываетя. Какой-то дичи наворочено. Почти 40 строк чтобы только изменить три регистра. Никакой определённости после её вызова. Совершенно бесполезная функция. Уж лучше мой блинки вместо него запихать, хотя бы меньше места будет занимать.

anonymous
()
Ответ на: комментарий от anonymous

Всё подходит под мой блинки: пользуйтесь хоть сейчас, хоть потом; задачу мигания СД решает; а выглядит так просто блистательно!

Не бывает задачи «просто мигать светодиодом». Это либо первая программа новичка (для этого ваш код не подходит абсолютно), либо мигалка чем-то еще, но там либо нужна настройка, либо хватит двух транзисторов.

Про красоту или качество кода можно и не говорить - оно ужасно.

Без инициализации чего? Все регистры уже инициализированы при старте контроллера.

Стека, прерываний, секций data и bss, естественно

Что такое расширяемость? Наворотить ненужных слоёв абстракции?

Хорошо документированный код с минимумом зависимостей, который можно дописывать или перемещать, не опасаясь что все развалится.

Так тогда почему вы Кубом или Ардуино не пользуетесь?

Именно поэтому: что ваш код, что их, слабо расширяемый и с кучей ненужных зависимостей

Да и вы видели тот sysreset()?

Сейчас увидел. Тоже говнокод, сравнимый с вашим. Но в отличие от вашего, можно хоть приблизительно представить что он делает. Хотя, конечно, магические константы - зло.

Но вон ниже более вменяемый код, Возможно, предыдущий - копипаст чего-то антикварного.

Уж лучше мой блинки вместо него запихать

Разумеется, нет.

COKPOWEHEU
()
Ответ на: комментарий от anonymous

Чем он такую «пользу» мотивирует?

Тем, что в этом моем sysreset настраивается все необходимое + сбрасывается все необходимое. Без него никакой уверенности, что main запустилась после сброса МК нет. Да и те же базовые таймеры нужно сразу настроить правильно, флеш настроить и т.п. Нельзя без этой функции никак!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от COKPOWEHEU

Что такое расширяемость?

Хорошо документированный код с минимумом зависимостей

Ну так опять мой блинки с этим справляется лучше. Докумнетация — Technical Manual, Programmin Manual, RM — куда уж лучше? Из зависимостей — только ассемблер и линкер.

который можно дописывать или перемещать, не опасаясь что все развалится.

Так кто вам мешает его перемещать и дописывать? Попереживать, что развалится, конечно, можете, но если вы почитаете документацию и сделаете всё, как полагается, то любые переживания окажутся напрасными.

Тоже говнокод, сравнимый с вашим.

А вот сейчас обидно было. У меня код на гораздо более детерминированный.

магические константы - зло

Прикол, что даже сам Эдик так же считает. Но не все константы магиеские, конечно. Например, если мы рассматриваем адреса регистров, то там нет никакой магии и всё очевидно.

Разумеется, нет.

Да почему же? Вы вот можете сказать, какое будет состояние регистров после выхода из функции. К примеру, пускай до вызова функции у нас отключен HSI и HCLK настроен на частоту 72 MHz от PLL. Учтите, что время старта HSI может быть до 2 микросекунд и ни биты HSE ни PLL ни множителей не могут быть сброшены, если в текущий момент используются эти источники. На каждую операцию чтения-изменения-записи, допустим, уходит по 6 тактов.

anonymous
()
Ответ на: комментарий от Eddy_Em

Без него никакой уверенности, что main запустилась после сброса МК нет.

Боже, ну что за бред? Через какую там магию у тебя main() запускается?

anonymous
()
Ответ на: комментарий от Eddy_Em

Тем, что в этом моем sysreset настраивается все необходимое + сбрасывается все необходимое.

Но оформить через константы, без магических чисел, все же стоит.

COKPOWEHEU
()
Ответ на: комментарий от anonymous

Ну так опять мой блинки с этим справляется лучше.

Да ни с чем он не справляется. В 5 строчках кода умудрились кашу наворотить, в которой всегда надо помнить какое значение к каком регистре.

Докумнетация — Technical Manual, Programmin Manual, RM — куда уж лучше?

Про это я и говорю: документации на ВАШ код нет, приходится его реверсить.

Так кто вам мешает его перемещать и дописывать? Попереживать, что развалится, конечно, можете, но если вы почитаете документацию и сделаете всё, как полагается, то любые переживания окажутся напрасными.

Если для использования куска кода в 5 строчек надо читать 100500 страниц документации, я лучше с нуля напишу.

А вот сейчас обидно было. У меня код на гораздо более детерминированный.

А толку если он ничего не делает и для чтения непригоден?

Например, если мы рассматриваем адреса регистров, то там нет никакой магии и всё очевидно.

Да неужели? И где же в вашем коде имена регистров?

Да почему же? Вы вот можете сказать, какое будет состояние регистров после выхода из функции.

Ни малейшего желания разбираться. У меня свои стартапы.

COKPOWEHEU
()
Ответ на: комментарий от Eddy_Em

Нет смысла: оно и так находится в заголовочном файле, где задаются всякие разные макросы.

Ваш код - ваше дело. Но в том варианте, что сейчас, я его никому не порекомендую. Хотя, конечно, лучше, чем ассемблерное извращение Анонимуса.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

приходится его реверсить.

Не реверсить, а читать. Вы же не реверсите сишные выражения, даже когда для этого приходится заглянуть в сишный стандарт.

Но если хотите, то я прокомментирую, конечно.

Если для использования куска кода в 5 строчек надо читать 100500 страниц документации, я лучше с нуля напишу.

И что вы напишете не читая документацию к своему МК? Один уже, вон, понаписал.

А толку если он ничего не делает

Вот пусть лучше ничего не делает, чем делает не пойми что.

Например, если мы рассматриваем адреса регистров, то там нет никакой магии и всё очевидно.

Да неужели? И где же в вашем коде имена регистров?

А я не про свой код, я вообще. В моём последнем варианте, для неизощрённой публики, безусловно, присутствует «магия». Но я думал, что в этом чате все шарят. К тому же уже были похожие варианты и с комментариями и с нормальными именами символов.

anonymous
()
Ответ на: комментарий от anonymous

Не реверсить, а читать. Вы же не реверсите сишные выражения, даже когда для этого приходится заглянуть в сишный стандарт.

Но если хотите, то я прокомментирую, конечно.

Не припомню случаев, когда бы это было нужно. Си-шные выражения обычно понятны и так. В стандарт мне приходилось лезть только ради срачей на форумах, где обсуждались всякие тонкости языка.

Вашему коду нужны не столько комментарии, сколько именованные константы и макрофункции (вот там уже с комментарием откуда они взялись и как работают).

И что вы напишете не читая документацию к своему МК?

Как это относится к необходимости чтения ее еще раз для понимания вашего кода? Адреса регистров я наизусть не помню. Не говоря уж о переводе в битовое представление в уме.

Вот пусть лучше ничего не делает, чем делает не пойми что.

Тогда уж лучше обойтись и без вашего кода, раз «лучше ничего, чем непойми что».

В моём последнем варианте, для неизощрённой публики, безусловно, присутствует «магия». Но я думал, что в этом чате все шарят.

Раз уж рекомендуете свой код новичкам, оформляйте соответственно. А что до магии - я все еще не помню адресов всех регистров и назначения каждого бита в них.

COKPOWEHEU
()
Ответ на: комментарий от anonymous

А для чего захламлять код неиспользуемыми векторами?

скажите пожалуйста, а зачем они, эти вектора? какую роль они выполняют?

Assembler
() автор топика
Ответ на: комментарий от Assembler

Таблица векторов прерываний. Когда с контроллером что-то случается - таймер сработал, юзер кнопочку нажал, байт по UART прилетел или на ноль неудачно поделили - можно, конечно, проверять все возможные события вручную. Но это медленно. Поэтому в микросхему добавляют специальную железку, которая аппаратно за этим следит и если что вызывает прерывание. То есть приостанавливает выполнение основной программы и передает управление на обработчик соответствующего события, который и разбирается что с этим делать. А чтобы определить какой именно обработчик умеет данное событие обслуживать, их адреса сведены в таблицу.

Плюс прерывание может вывести контроллер из режима сна, который использовался для экономии энергии.

Почти во всех реальных программах хоть пара прерываний используется, поэтому таблицу проще один раз настроить и потом просто использовать по мере необходимости. А не лазить потом в стартап-код, как предлагает (по-видимому) Анонимус.

COKPOWEHEU
()
Ответ на: комментарий от Assembler

Это адрес метки _start. Он находится в таблице векторов прерываний. В каком-то смысле можно считать его прерыванием по ресету, но вообще-то это просто адрес.

COKPOWEHEU
()
Ответ на: комментарий от anonymous

гуру stm32, помоги нам рассчитать адрес правильно при подключении тактирования. научи

0x40021000=1073876992
0x40000000=1073741824
0x42000000=1107296256
из 16 в 10 перевел
нашел смещение
(0x40021000=1073876992)-(0x40000000=1073741824)=135168
и так как в таблице номер бита IOPC =4 то (135168*32)+(4*4)=4325392 прибавляю 4325392+(0x42000000=1107296256) получаю 1111621648 перевожу в 16 получаю

0x42420010

но это неправильный адрес. почему? в чем ошибся?

Assembler
() автор топика
Ответ на: комментарий от anonymous

блин! ты бог! я уже думал, что нет ответа.

0x40021000 (RCC_CR) — это не IOPCEN

я в Reference Manual нашел. стр 113 поправь пожалуйста что я перепутал?

Assembler
() автор топика

Спасибо вам уважаемые добрые дядички и тетеньки, что вы научили @Assembler мегать светодиодом.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.