Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
STM32 новичку в ARM что к чему
И плохие инструменты есть, и кривые руки, и все остальное. И даже philosoraptor который решил поиграть в "Самый умный на форуме"
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Реклама
Oxford:
Когда сам уже сто раз подсмотрел в том же CubeMX примеры инициализации периферии, понял принцип (AFIO/тактирование/NVIC) и написал один раз свой аналогичный код, который потом дублируешь в свои проекты, становится очень легко называть использованные инструменты калом и говном. Вроде как сразу ЧСВ повышается до over9000.
Когда сам уже сто раз подсмотрел в том же CubeMX примеры инициализации периферии, понял принцип (AFIO/тактирование/NVIC) и написал один раз свой аналогичный код, который потом дублируешь в свои проекты, становится очень легко называть использованные инструменты калом и говном. Вроде как сразу ЧСВ повышается до over9000.
В ранних версиях KEILа в файле system_stm32fxxxx легко можно было править настройку тактирования. Сейчас V5.23.0.0, и настройку провожу в первых строчках main. Также и в IARе.
Угу, та самая плата. А зачем такое требование к кварцам? Они же, наверняка, более редкие, да и дороже. Или это из-за необходимости генерации на 25 МГц? Так АВР-ки весело работают с обычными кварцами до 20 МГц, а от 20 до 25 не так и далеко...WiseLord писал(а):На той же STM32F103 обязательно должен быть кварц с нагрузочной способностью 6пФ (даже не рекомендация, а чёткое требование в даташитах/мануалах), хотя те же китайские платы на C8T6 идут с неправильным кварцем
Стоп-стоп, причем здесь RTC ? Я же о HSE спрашиваю...WiseLord писал(а):Я пока не заменил кварц и конденсаторы на правильные, вообще не мог понять, что не так с RTC - могут вообще не тикать, а берёшь плату в руку (наводки? земля?) - начинают, но с жуткой погрешностью.
Это где такое? Я в system_stm32f10x.c нашел только такое:VladislavS писал(а):while(!(RCC->CR & RCC_CR_HSERDY));
Код: Выделить всё
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));Естественно, можно и врукопашную. Но ведь все это уже есть в SystemInit(), хотелось бы просто разрулить это грамотно.VladislavS писал(а):Вот не понимаю зачем гадать где там что само нагенерилось? Неужели так трудно самому включить кварц и PLL? Ну это же не USB-стек, тут всего то около 10 строчек кода если размашисто писать.
Какие все мануальные терапевты! Как всегда, вместо простого ответа на вопрос, две страницы мануальной терапии!..Oxford писал(а):Главное чтобы не изучать и не читать ничего, а потом форум зае...ывать вопросами.
(Мануальный терапевт - это тот, кто вместо того, чтобы помочь, говорит RTFM. Эту фразу выдал кто-то из ФИДОшников лет так 20-25 назад, дословно и автора, увы, не помню...)
Вот-вот. Подкрутил в его Configuration Wizard'е что надо, и вперед.Sergi писал(а):В ранних версиях KEILа в файле system_stm32fxxxx легко можно было править настройку тактирования.
Так что, получается, что это (детальную настройку) теперь похоронили? То есть всех пытаются загнать в кубики, да? Грустно... Ну чтож, придется, как советует WiseLord, поиграть-таки немного в кубики и списать инициализацию клока оттуда.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Ну в самом развернутом виде например для 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;- Реклама
Oops.. Я почему-то подумал именно о LSE. Видимо, это смутило.:Sergi писал(а):Стоп-стоп, причем здесь RTC ? Я же о HSE спрашиваю...
По HSE вроде таких ограничений нет. Но там точность вроде как и не нужна особо.afz писал(а):Так вот, вечером засек по секундной стрелке часов, когда взморгнуло дважды, утром глянул - расползлось секунд на 20.
Добавлено after 4 minutes 7 seconds:
Там будет что-то вроде https://github.com/WiseLord/ampcontrol- ... .c#L42-L75. Я за основу брал именно то, что CubeMX для LL сгенерировал.afz писал(а):Ну чтож, придется, как советует WiseLord, поиграть-таки немного в кубики и списать инициализацию клока оттуда.
Добавлено after 7 minutes 15 seconds:
В том-то и дело, что в итоге это выглядит просто. Но даже в этом простом примере помимо изучения в reference manual регистров RCC (что достаточно очевидно) приходится ещё и в FLASH что-то делать (ту же latency на высоких частотах понижать). А это уже далеко не так очевидно и легко упускаемо.Sergi писал(а):Титаническая работа
Вот для таких вещей иногда хорошо подсмотреть в код от CubeMX. И утянуть именно основу - в каких регистрах что меняем. Не обязательно тащить HAL за собой при этом, можно хоть на базе CMSIS библиотеки, а хоть и свои #define для регистров сделать. Но вот саму последовательность действий - почему бы и не подсмотреть.
[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]
Т.е. вы считаете я не важен для форума, я правильно вас понял?
Когда сам уже сто раз подсмотрел в том же 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
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
[uquote="WiseLord",url="/forum/viewtopic.php?p=3462914#p3462914"]Но вот саму последовательность действий - почему бы и не подсмотреть.[/uquote]
Потому что все расписано в RM, надо лишь уметь читать документацию...
http://mcu.goodboard.ru/viewtopic.php?id=11
Потому что все расписано в RM, надо лишь уметь читать документацию...
http://mcu.goodboard.ru/viewtopic.php?id=11
- Сообщения: 1841
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="afz",url="/forum/viewtopic.php?p=3462001#p3462001"]Так вот, вечером засек по секундной стрелке часов, когда взморгнуло дважды, утром глянул - расползлось секунд на 20.[/uquote]
Достаточно научиться читать мануалы, открыть Reference manual на МК на разделе "RCC registers". И не придётся ждать полдня.
Достаточно научиться читать мануалы, открыть Reference manual на МК на разделе "RCC registers". И не придётся ждать полдня.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[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"]
[uquote="afz",url="/forum/viewtopic.php?p=3462859#p3462859"]Я в system_stm32f10x.c нашел только такое:Оно вызывается из SystemInit, которая, в свою очередь, вызывается из startup_stm32f10x_md.s перед вызовом __main.[/uquote]Вы программистом или кладоискателем собираетесь быть? Программы пишут, а не ищут.
[uquote="afz",url="/forum/viewtopic.php?p=3462859#p3462859"]
Это где такое?[/uquote]В моём сообщенииVladislavS писал(а):while(!(RCC->CR & RCC_CR_HSERDY));
[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));Ну так натыкайте галочек в кубе. Или уже и это не получается?VladislavS писал(а):Но ведь все это уже есть в SystemInit(), хотелось бы просто разрулить это грамотно.
jcxz:
Вот только в том же RM0008 (для того же F103) в разделе RCC ничего не сказано про то, что нужно ещё и Flash latency менять. Да, где-то в даташите про это, наверное, говорится, но искать это на 1132 страницах, причём даже не подозревая о такой западне, не так-то просто.
А вот если взглянуть на любой пример кода - пусть даже и CubeMX сгенерённого - сразу становится легче. Вот там можно в мануал и в RCC раздел заглянуть, и по FLASH поискать информацию.
dosikus:
какая-то левая ссылка - это далеко не RM.
Вот только в том же RM0008 (для того же F103) в разделе RCC ничего не сказано про то, что нужно ещё и Flash latency менять. Да, где-то в даташите про это, наверное, говорится, но искать это на 1132 страницах, причём даже не подозревая о такой западне, не так-то просто.
А вот если взглянуть на любой пример кода - пусть даже и CubeMX сгенерённого - сразу становится легче. Вот там можно в мануал и в RCC раздел заглянуть, и по FLASH поискать информацию.
dosikus:
какая-то левая ссылка - это далеко не RM.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
[uquote="WiseLord",url="/forum/viewtopic.php?p=3462990#p3462990"]какая-то левая ссылка - это далеко не RM.[/uquote]
Вы читать вообще умеете ?
Вы читать вообще умеете ?
Несомненно. Потому и говорю - что какая-то левая ссылка на русскоязычный форум, которая к тому же то ли не грузится, то ли ждать приходится больше минуты - это не RM.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
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 ...
И писано там следующее:
ЗЫ Не забудьте поныть - как на авр все было просто и легко.
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
ЗЫ Не забудьте поныть - как на авр все было просто и легко.
Вот про то я и говорю - человек полезет в раздел RCC, весь его изучит, и не получит результата, потому как, оказывается, нужно ещё и время доступа к памяти программ настроить. А ссылок на это из RCC раздела нет.
Тут-то и спасает пример кода. Пусть и донельзя кривого, но рабочего.
P.S. ссылка на goodboard.ru наконец-то открылась. Можно и почитать.
Тут-то и спасает пример кода. Пусть и донельзя кривого, но рабочего.
P.S. ссылка на goodboard.ru наконец-то открылась. Можно и почитать.
Последний раз редактировалось WiseLord Вс сен 23, 2018 12:14:35, всего редактировалось 1 раз.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
WiseLord, латентность флэши разве не относится к настройкам флэши а не тактовой?
Подумайте не спеша...
Подумайте не спеша...
Конечно.
Но начинающий работать с МК (вроде тема о них) захочет помигать светодиодом для начала, изучит, как ожидается, разделы GPIO и RCC, разберётся даже с тем, что какую-то периферию надо дополнительно тактировать. И результата не получит. Потому что необходимость ещё что-то делать с FLASH далеко не так очевидна.
Но начинающий работать с МК (вроде тема о них) захочет помигать светодиодом для начала, изучит, как ожидается, разделы GPIO и RCC, разберётся даже с тем, что какую-то периферию надо дополнительно тактировать. И результата не получит. Потому что необходимость ещё что-то делать с FLASH далеко не так очевидна.
- Сообщения: 1841
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="WiseLord",url="/forum/viewtopic.php?p=3462990#p3462990"]Вот только в том же RM0008 (для того же F103) в разделе RCC ничего не сказано про то, что нужно ещё и Flash latency менять. Да, где-то в даташите про это, наверное, говорится, но искать это на 1132 страницах, причём даже не подозревая о такой западне, не так-то просто.[/uquote]
Flash latency нужно менять при смене частоты, а не источника тактирования. И мне кажется само собой разумеющимся, что при смене какой-то частоты тактирования, нужно просмотреть (и переинитить при необходимости) все части МК, которые тактируются этой частотой. Если ты что-то меняешь, то естественно нужно просмотреть все части, на что это изменяемое влияет.
Flash latency нужно менять при смене частоты, а не источника тактирования. И мне кажется само собой разумеющимся, что при смене какой-то частоты тактирования, нужно просмотреть (и переинитить при необходимости) все части МК, которые тактируются этой частотой. Если ты что-то меняешь, то естественно нужно просмотреть все части, на что это изменяемое влияет.
- Сообщения: 225
- Зарегистрирован: Сб янв 14, 2012 22:53:50
Что очень характерно, персонажи, пытающиеся прокачать свое чсв, ругая hal, cube и т.п, не понимают даже толком, почему использование while(extPin){;} в нормальном коде недопустимо. В связи с чем вряд ли есть смысл объяснять им рациональные и очевидные вещи.
то есть main(void){ while(1);} допустимо, а while(extPin){} не допустимо?
допустимо все, что позволяет достичь желаемого результата.
допустимо все, что позволяет достичь желаемого результата.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


