STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Ладно. Где толково описана библиотека CMSYS и все ее файлы в отдельности? Если можно на русском. ) И вообще информацию по начальной инициализации МК, в т.ч. и таблица прерываний и как ею потом тоже пользоваться.

Я вроде разобрался, как и что можно записывать в регистры МК. И где брать даже символьные обозначения тоже определился. И расписанные режимы, которые можно выставить в регистрах нашел в рефренсмануале. Как включить светодиодики на порту до меня тоже дошло. Пока не до альтернативных функций и не до обмена по разным интерфейсам.

Хочу понимать, что происходит при включении. и почему в итоге получаются включенными оба тактовых генератора и HSE и HSI? Или второй никогда не выключается, кроме режимов глубокого сна?

Добавлено after 2 minutes 22 seconds:
да, и где вы нашли, что сначала надо тактирование порта включать? )))
Станислав
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Если не включен HSI,то кто будет тактировать ядро для настройки HSE ?

Если не включить тактирование блока, то как он будет принимать данные с шины и выставлять свои регистры ?
Иван Сусанин - первый полупроводник :solder:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564062#p3564062"]Хочу понимать, что происходит при включении.[/uquote]Отладчиком прямо с вектора RESET пару раз до main пройтись - многое прояснится.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Myp3ik",url="/forum/viewtopic.php?p=3564078#p3564078"]Если не включить тактирование блока, то как он будет принимать данные с шины и выставлять свои регистры ?[/uquote]Кажется он думает, что включение тактирования портов - это как подача на них питания, т.е. можно включить тактирование и на пинах появится мусор из не инициализированных регистров :) Реальная картина ближе к триггеру у которого отключают вход CLK по которому он защелкивает данные, т.е. если он уже что-то запомнил, то при отключении CLK текущий уровень на выходе никуда не денется.
Реклама
Эиком - электронные компоненты и радиодетали
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Myp3ik писал(а):кто будет тактировать ядро для настройки HSE ?
Ну понятно, что изначально оно надо, но когда уже завели все от внешнего генератора, то можно же было и выключить внутренний? :dont_know:
VladislavS писал(а):с вектора RESET пару раз до main пройтись
Отладчиком в железе или в симуляторе? (тем более, в симуляторе он виснет в цикле). И еще не дает вручную бит поставить в порту.
Станислав
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564062#p3564062"]Где толково описана библиотека CMSYS и все ее файлы в отдельности?[/uquote]там файлов-то. Вообще CMSYS практически полностью состоит из описаний регистров и их возможных значений.
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564062#p3564062"]И вообще информацию по начальной инициализации МК[/uquote]посмотреть на startup файл, там полтора килобайта всего
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564062#p3564062"]таблица прерываний и как ею потом тоже пользоваться[/uquote]изначально инициализируется в том же startup-е, потом нужные обработчики просто назвать так же, как и там, линкер их подхватит. А вот "как пользховаться" - читать RM по контроллеру прерываний и конкретной периферии.
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564062#p3564062"]почему в итоге получаются включенными оба тактовых генератора и HSE и HSI?[/uquote]кто-то включил HSE и не выключил HSI :dont_know:
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564062#p3564062"]Или второй никогда не выключается, кроме режимов глубокого сна?[/uquote]если от него ничего не тактируется - можно выключить.

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564062#p3564062"]да, и где вы нашли, что сначала надо тактирование порта включать? )))[/uquote]уже не помню, где это описано. Если кратко - до подачи тактирования на конкретную периферию можно смело считать, что ее для ядра вообще не существует, как и принадлежащих ей регистров. При этом подача тактирования не означает, что периферия начала работать - она просто "появилась", а включать (после настройки) ее надо отдельно, для чего есть соответствующие биты в регистрах.

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564087#p3564087"]когда уже завели все от внешнего генератора, то можно же было и выключить внутренний?[/uquote]так выключи :dont_know: или контроллер вдруг сам должен догадаться, что программисту HSI больше не нужен?
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

[uquote="Reflector",url="/forum/viewtopic.php?p=3564084#p3564084"][uquote="Myp3ik",url="/forum/viewtopic.php?p=3564078#p3564078"]Если не включить тактирование блока, то как он будет принимать данные с шины и выставлять свои регистры ?[/uquote]Кажется он думает, что включение тактирования портов - это как подача на них питания, т.е. можно включить тактирование и на пинах появится мусор из не инициализированных регистров :) Реальная картина ближе к триггеру у которого отключают вход CLK по которому он защелкивает данные, т.е. если он уже что-то запомнил, то при отключении CLK текущий уровень на выходе никуда не денется.[/uquote]

Вот здесь бы подошел очень озадаченный смайлик, которого вроде нету в предложенных. :? и вроде понятно, в плане того, что изначально все выводы настроены на вход в высокоимпедансном состоянии, т.е. типа никуда не подключены. одно из самых безопасных состояний МК. И даже если на них подать тактовые импульсы, он все равно останется в этом состоянии и ничего страшного не происходит.

З.Ы. Простите, что сделал полное цитирование, иначе не понятно контекста сразу от двух авторов.

Добавлено after 1 hour 32 minutes 13 seconds:
Вот тута что-то есть по описанию CMSYS, правда перевод идиотский и примеры для LPC, но все равно

http://irtos.sourceforge.net/2000/Docum ... 00003.html
Станислав
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

Попробуйте посмотреть на это с другой стороны:
если б ПОРТ представлял из себя пару регистров - тактировать его или нет существенной разницы не составляет.
а если это целая система (толпа регистров, включая теневые, триггера, коммутаторы и прочия...и прочия, там же привязки к другой периферии (к таймерам, к интерфейсам, ...)) - вот это раскачивать или нет уже ощутимо для потребления.
и если эту подсистему не тактируете - то и внутренние ее коммутаторы в нужное состояние не встанут - хоть ядро и будет кидать "конфигурацию" в регистр связи этой периферии (по сути информационный буфер).
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Очередной небольшой вопрос. Пусть, возможно и снова глупый.

В портах для выставления и сброса битов есть регистр GPIO_ODR. Там все просто. Записал значение - оно выставилось на выводах. Считал/изменил/записал значение - оно поменялось на выводах.
Есть регистры GPIO_BSRR и GPIO_BRR, которые умеют выставлять каждый бит (пин, вывод) по отдельности без операции чтение-модификация-запись.

И вот, я записал единички в порт, а потом решил сбросить некоторые.
Как понять приоритет и есть ли он? т.е. у меня записана единица в порту, я ее сбрасываю, то она сбросится. Если у меня записан ноль, то при установке у меня ноль поменяется на единицу и бит в регистре GPIO_BSRR установится, а в GPIO_BRR сотрется.
А если я одновременно запишу бит установки и сброса в регистр GPIO_BSRR? Кто победит?
Короче, не знаю, как объяснить, но почему это работает?

З.Ы. Может это написано в RM0008, может я не обратил внимания, либо не понял. Если что, ткните носом.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 7383
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Биты в BRR и BSRR только устанавливаются, но никогда не читаются. Можете рассматривать как входы R и S выходного триггера, в момент записи на которых появляется (и сразу снимается) активный уровень.
СКАЗОЧНИК писал(а):А если я одновременно запишу бит установки и сброса в регистр GPIO_BSRR? Кто победит?
Этот момент в референс мануале специально оговорён:
Note:If both BSx and BRx are set, BSx has priority.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Все. Спасибо. Увидел. Нашел. Раздел 9.2.5
Запись нуля не имеет влияния (значения)
Запись единицы ставит или сбрасывает бит
Приоритет установленного бита над сброшенным.
Все биты можно только записывать, читать безсполезно.

Очень Спасибо!
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

BSRR - это действительно шикарная придумка. В том смысле, что можно и писать и читать одновременно.
Типичная задача - записать в последние 4 (например) бита значение 0b1101. Делается одним движением, атомарно:

GPIOx->BSRR = 0x000F000D

Т.е., с одной стороны - 0x000F0000 должно установить все биты в ноль, но 0x0000000D его перебивает. Поэтому бит 1 таки в ноль сбросится (из-за 0x000F0000), а биты 0, 2, 3 - установятся в единицу (из-за 0x0000000D).

Пока я этот момент не "просёк", думал поначалу, зачем там, в одном регистре, и сброс и установка одновременно. Мол, почему BRR только сбрасывает, а BSRR - не просто устанавливает, но ещё и сбрасывает, зачем такие сложности. А вот, оказалось, и причина, которую легко не заметить в этом примечании к даташиту.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

WiseLord, все таки пишите для людей не знакомых с сей "магией", по сему не лишним будет:
Гарантированно записать, независимо от содержимого порта,в последние 4 (например) бита значение 0b1101.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Для тех, кто сталкивался или еще столкнется, делюсь информацией по поводу "GNU Tools ARM Embedded 8 2018 q4 major": в виндовой версии сломан arm-none-eabi-objdump и попытка создать с его помощью .hex файл прошивки почти всегда обречена на провал. Грубый хак, позволяющий по быстрому исправить ситуацию выглядит так: идем сюда, скачиваем комплект бинарей под разрядность своей винды, вытаскиваем оттуда arm-none-eabi-objdump и заменяем им тот, что шел с GNU Tools ARM Embedded 8 2018 q4 major. Профит.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Правильно ли я понимаю этот оператор цикла?

while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

Пока HSEStatus равен нулю И StartUpCounter не равен HSE_STARTUP_TIMEOUT мы продолжаем делать этот цикл.

Т.е. ждем, пока не установится флаг в регистре. И если он даже установился уже, то все равно ждем, пока СтартАпКаунтер не щелкнет 1280 раз (0х0500)?

И только после этого должны выйти из цикла. Почему то же в отладчике выходит сразу из него дальше. Может я чего-то не то вижу? :dont_know:
Станислав
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3564978#p3564978"]while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

Пока HSEStatus равен нулю И StartUpCounter не равен HSE_STARTUP_TIMEOUT мы продолжаем делать этот цикл.[/uquote]
And - это считай умножение, т.е. можно представить все в таком виде:

Код: Выделить всё

while(1 * 1 == 1);
Замени любую единицу нулем и условие станет ложным.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Так то да... Это же логическое И.
А нахрена тогда таймаут придумывали?


Ааааааа. все. дошло.
Если ХСЕ не встал, то он ждет в течение этого времени, а если встал, то сразу выходит! Блин. Как все логично и просто придумали. )

Другой вопрос.
Если я хочу попробовать написать свой код для настройки тактирования МК, мне надо выпилить три эти строки?

Код: Выделить всё

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
                                                                                        // IMPORT  SystemInit
                                                                                       //             LDR     R0, =SystemInit
                                                                                       //             BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

Добавлено after 24 minutes 11 seconds:
Все, я уже провел эксперимент. Эти три строки.

Добавлено after 43 minutes 35 seconds:
Ткните носом, какой раздел в Рефренс Мануале про системный таймер 24 битный написано.? А то я чего-то там удалил в рефренс мануале, что найти не могу... Даже поиском.

Добавлено after 41 minute 9 seconds:
Бляха муха... Нашел в РМ0056 :kill:
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Системный таймер - это фича всех Cortex-M3, поэтому надо смотреть не мануал от STM, а мануал от ARM.

Зовётся DUI0552A - Cortex M3 - Generic User Guide.pdf

P.S. Хотя да, в PM0056 он тоже описан.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Или сделать свою функцию SystemInit
Иван Сусанин - первый полупроводник :solder:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Так вот... В этом РМ0056 написано:

Bit 2 CLKSOURCE: Clock source selection
Selects the clock source.
0: AHB/8
1: Processor clock (AHB)

А в схеме (Figure 8. Clock tree, p. 93/1134 in RM0008) нарисован квадратик после шины АНВ, в котором деление на 8. Как я понял из всей этой схемы, то квадратики это обязательное деление, т.е. не подвластное управлению пользователем.

Так все таки СисТик может работать напрямую от АНВ или не может?

Просто интересно стало.
Станислав
Ответить

Вернуться в «ARM»