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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

И плохие инструменты есть, и кривые руки, и все остальное. И даже philosoraptor который решил поиграть в "Самый умный на форуме"
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Oxford:
Когда сам уже сто раз подсмотрел в том же CubeMX примеры инициализации периферии, понял принцип (AFIO/тактирование/NVIC) и написал один раз свой аналогичный код, который потом дублируешь в свои проекты, становится очень легко называть использованные инструменты калом и говном. Вроде как сразу ЧСВ повышается до over9000.
Контактная информация:
Реклама
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Сообщение Sergi »

В ранних версиях KEILа в файле system_stm32fxxxx легко можно было править настройку тактирования. Сейчас V5.23.0.0, и настройку провожу в первых строчках main. Также и в IARе.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

WiseLord писал(а):На той же STM32F103 обязательно должен быть кварц с нагрузочной способностью 6пФ (даже не рекомендация, а чёткое требование в даташитах/мануалах), хотя те же китайские платы на C8T6 идут с неправильным кварцем
Угу, та самая плата. А зачем такое требование к кварцам? Они же, наверняка, более редкие, да и дороже. Или это из-за необходимости генерации на 25 МГц? Так АВР-ки весело работают с обычными кварцами до 20 МГц, а от 20 до 25 не так и далеко...
WiseLord писал(а):Я пока не заменил кварц и конденсаторы на правильные, вообще не мог понять, что не так с RTC - могут вообще не тикать, а берёшь плату в руку (наводки? земля?) - начинают, но с жуткой погрешностью.
Стоп-стоп, причем здесь RTC ? Я же о HSE спрашиваю...
VladislavS писал(а):while(!(RCC->CR & RCC_CR_HSERDY));
Это где такое? Я в system_stm32f10x.c нашел только такое:

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

 do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
Оно вызывается из SystemInit, которая, в свою очередь, вызывается из startup_stm32f10x_md.s перед вызовом __main.
VladislavS писал(а):Вот не понимаю зачем гадать где там что само нагенерилось? Неужели так трудно самому включить кварц и PLL? Ну это же не USB-стек, тут всего то около 10 строчек кода если размашисто писать.
Естественно, можно и врукопашную. Но ведь все это уже есть в SystemInit(), хотелось бы просто разрулить это грамотно.
Oxford писал(а):Главное чтобы не изучать и не читать ничего, а потом форум зае...ывать вопросами.
Какие все мануальные терапевты! Как всегда, вместо простого ответа на вопрос, две страницы мануальной терапии!..

(Мануальный терапевт - это тот, кто вместо того, чтобы помочь, говорит RTFM. Эту фразу выдал кто-то из ФИДОшников лет так 20-25 назад, дословно и автора, увы, не помню...)
Sergi писал(а):В ранних версиях KEILа в файле system_stm32fxxxx легко можно было править настройку тактирования.
Вот-вот. Подкрутил в его Configuration Wizard'е что надо, и вперед.

Так что, получается, что это (детальную настройку) теперь похоронили? То есть всех пытаются загнать в кубики, да? Грустно... Ну чтож, придется, как советует WiseLord, поиграть-таки немного в кубики и списать инициализацию клока оттуда.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Сообщение Sergi »

Ну в самом развернутом виде например для F0 это 11 строк

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

RCC->CR |= RCC_CR_HSEON;
	while (!(RCC->CR & RCC_CR_HSERDY)) {};
	FLASH->ACR |= FLASH_ACR_PRFTBE;
	FLASH->ACR |= FLASH_ACR_LATENCY;	
	RCC->CFGR |= RCC_CFGR_PLLSRC_HSE_PREDIV;
	RCC->CFGR |= RCC_CFGR_PLLXTPRE;
	RCC->CFGR2 = (4-1);								// 	26/4
	RCC->CFGR |= (10-2)<<18; 					/// Xtall/4*10=65
	RCC->CR |= RCC_CR_PLLON;
	while (!(RCC->CR & RCC_CR_PLLRDY)) {}; 
	RCC->CFGR |= RCC_CFGR_SW_PLL;
Титаническая работа :))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Sergi писал(а):Стоп-стоп, причем здесь RTC ? Я же о HSE спрашиваю...
Oops.. Я почему-то подумал именно о LSE. Видимо, это смутило.:
afz писал(а):Так вот, вечером засек по секундной стрелке часов, когда взморгнуло дважды, утром глянул - расползлось секунд на 20.
По HSE вроде таких ограничений нет. Но там точность вроде как и не нужна особо.

Добавлено after 4 minutes 7 seconds:
afz писал(а):Ну чтож, придется, как советует WiseLord, поиграть-таки немного в кубики и списать инициализацию клока оттуда.
Там будет что-то вроде https://github.com/WiseLord/ampcontrol- ... .c#L42-L75. Я за основу брал именно то, что CubeMX для LL сгенерировал.

Добавлено after 7 minutes 15 seconds:
Sergi писал(а):Титаническая работа :))
В том-то и дело, что в итоге это выглядит просто. Но даже в этом простом примере помимо изучения в reference manual регистров RCC (что достаточно очевидно) приходится ещё и в FLASH что-то делать (ту же latency на высоких частотах понижать). А это уже далеко не так очевидно и легко упускаемо.
Вот для таких вещей иногда хорошо подсмотреть в код от CubeMX. И утянуть именно основу - в каких регистрах что меняем. Не обязательно тащить HAL за собой при этом, можно хоть на базе CMSIS библиотеки, а хоть и свои #define для регистров сделать. Но вот саму последовательность действий - почему бы и не подсмотреть.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3462807#p3462807"]Oxford:
Когда сам уже сто раз подсмотрел в том же CubeMX примеры инициализации периферии, понял принцип (AFIO/тактирование/NVIC) и написал один раз свой аналогичный код, который потом дублируешь в свои проекты, становится очень легко называть использованные инструменты калом и говном. Вроде как сразу ЧСВ повышается до over9000.[/uquote]

Я CubeMX вообще не использовал для написания кода и даже не подсматривал, там нечего смотреть.
В 2013 программировал на SPL немного. Сегодня только CMSIS. NVIC, AFIO легкая фигня, код запуска у Кортексов тоже есть там уже все настроено тактирование, немного можно править под себя делители и все. Читать надо документацию, мануалы и аппноуты. Ну и вообще здесь программисты микроконтроллеров или кухарки готовящие борщ собрались?

[uquote="WiseLord",url="/forum/viewtopic.php?p=3462807#p3462807"]Вроде как сразу ЧСВ повышается до over9000.[/uquote]
Т.е. вы считаете я не важен для форума, я правильно вас понял?
Последний раз редактировалось Oxford Вс сен 23, 2018 10:01:55, всего редактировалось 5 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3462914#p3462914"]Но вот саму последовательность действий - почему бы и не подсмотреть.[/uquote]

Потому что все расписано в RM, надо лишь уметь читать документацию...
http://mcu.goodboard.ru/viewtopic.php?id=11
Мудрый кот
Сообщения: 1841
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="afz",url="/forum/viewtopic.php?p=3462001#p3462001"]Так вот, вечером засек по секундной стрелке часов, когда взморгнуло дважды, утром глянул - расползлось секунд на 20.[/uquote]
Достаточно научиться читать мануалы, открыть Reference manual на МК на разделе "RCC registers". И не придётся ждать полдня.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Sergi",url="/forum/viewtopic.php?p=3462856#p3462856"]В ранних версиях KEILа в файле system_stm32fxxxx легко можно было править настройку тактирования. Сейчас V5.23.0.0, и настройку провожу в первых строчках main. Также и в IARе.[/uquote]Кто-то сейчас запрещает в SystemInit() или __low_level_init() писать то что вам вздумается?

[uquote="afz",url="/forum/viewtopic.php?p=3462859#p3462859"]
VladislavS писал(а):while(!(RCC->CR & RCC_CR_HSERDY));
Это где такое?[/uquote]В моём сообщении :)

[uquote="afz",url="/forum/viewtopic.php?p=3462859#p3462859"]Я в system_stm32f10x.c нашел только такое:

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

 do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
Оно вызывается из SystemInit, которая, в свою очередь, вызывается из startup_stm32f10x_md.s перед вызовом __main.[/uquote]Вы программистом или кладоискателем собираетесь быть? Программы пишут, а не ищут.
VladislavS писал(а):Но ведь все это уже есть в SystemInit(), хотелось бы просто разрулить это грамотно.
Ну так натыкайте галочек в кубе. Или уже и это не получается?
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

jcxz:
Вот только в том же RM0008 (для того же F103) в разделе RCC ничего не сказано про то, что нужно ещё и Flash latency менять. Да, где-то в даташите про это, наверное, говорится, но искать это на 1132 страницах, причём даже не подозревая о такой западне, не так-то просто.

А вот если взглянуть на любой пример кода - пусть даже и CubeMX сгенерённого - сразу становится легче. Вот там можно в мануал и в RCC раздел заглянуть, и по FLASH поискать информацию.

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

Сообщение dosikus »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3462990#p3462990"]какая-то левая ссылка - это далеко не RM.[/uquote]

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

Сообщение WiseLord »

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

Сообщение dosikus »

WiseLord, а говорите что умеете читать, я где-то написал что там лежит RM?
RM, как и вся документация, лежит на сайте вендора. По ссылке - как читать и где искать

[uquote="WiseLord",url="/forum/viewtopic.php?p=3462990#p3462990"]jcxz:
Вот только в том же RM0008 (для того же F103) в разделе RCC ничего не сказано про то, что нужно ещё и Flash latency менять. Да, где-то в даташите про это, наверное, говорится, но искать это на 1132 страницах, причём даже не подозревая о такой западне, не так-то просто.[/uquote]

Пробовали читать документацию не по диагонали?
Раздел Reading the Flash memory параграфа 3.3.3 Embedded Flash memory находится выше параграфа RCC ...
И писано там следующее:
Reading the Flash memory
Flash memory instructions and data access are performed through the AHB bus. The
prefetch block is used for instruction fetches through the ICode bus. Arbitration is performed
in the Flash memory interface, and priority is given to data access on the DCode bus.
Read accesses can be performed with the following configuration options:
• Latency: number of wait states for a read operation programmed on-the-fly
• Prefetch buffer (2 x 64-bit blocks): it is enabled after reset; a whole block can be
replaced with a single read from the Flash memory as the size of the block matches the
bandwidth of the Flash memory. Thanks to the prefetch buffer, faster CPU execution is
possible as the CPU fetches one word at a time with the next word readily available in
the prefetch buffer
• Half cycle: for power optimization
Note: These options should be used in accordance with the Flash memory access time. The wait
states represent the ratio of the SYSCLK (system clock) period to the Flash memory access
time:
zero wait state, if 0 < SYSCLK ≤ 24 MHz
one wait state, if 24 MHz < SYSCLK ≤ 48 MHz
two wait states, if 48 MHz < SYSCLK ≤ 72 MHz

ЗЫ Не забудьте поныть - как на авр все было просто и легко.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Вот про то я и говорю - человек полезет в раздел RCC, весь его изучит, и не получит результата, потому как, оказывается, нужно ещё и время доступа к памяти программ настроить. А ссылок на это из RCC раздела нет.

Тут-то и спасает пример кода. Пусть и донельзя кривого, но рабочего.

P.S. ссылка на goodboard.ru наконец-то открылась. Можно и почитать.
Последний раз редактировалось WiseLord Вс сен 23, 2018 12:14:35, всего редактировалось 1 раз.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

WiseLord, латентность флэши разве не относится к настройкам флэши а не тактовой?
Подумайте не спеша...
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Конечно.

Но начинающий работать с МК (вроде тема о них) захочет помигать светодиодом для начала, изучит, как ожидается, разделы GPIO и RCC, разберётся даже с тем, что какую-то периферию надо дополнительно тактировать. И результата не получит. Потому что необходимость ещё что-то делать с FLASH далеко не так очевидна.
Контактная информация:
Мудрый кот
Сообщения: 1841
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3462990#p3462990"]Вот только в том же RM0008 (для того же F103) в разделе RCC ничего не сказано про то, что нужно ещё и Flash latency менять. Да, где-то в даташите про это, наверное, говорится, но искать это на 1132 страницах, причём даже не подозревая о такой западне, не так-то просто.[/uquote]
Flash latency нужно менять при смене частоты, а не источника тактирования. И мне кажется само собой разумеющимся, что при смене какой-то частоты тактирования, нужно просмотреть (и переинитить при необходимости) все части МК, которые тактируются этой частотой. Если ты что-то меняешь, то естественно нужно просмотреть все части, на что это изменяемое влияет.
Прорезались зубы
Аватара пользователя
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Сообщение philosoraptor »

Что очень характерно, персонажи, пытающиеся прокачать свое чсв, ругая hal, cube и т.п, не понимают даже толком, почему использование while(extPin){;} в нормальном коде недопустимо. В связи с чем вряд ли есть смысл объяснять им рациональные и очевидные вещи.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18789
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

то есть main(void){ while(1);} допустимо, а while(extPin){} не допустимо?
допустимо все, что позволяет достичь желаемого результата.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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