STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3491878#p3491878"]Я же тебе показывал функцию вызов которой выглядит следующим образом:[/uquote]
А можно повторить ? Я то ли пролистал по невнимательности, то ли еще каким образом не заметил, а теперь мне любопытно стало, но боюсь, что не найду.
А можно повторить ? Я то ли пролистал по невнимательности, то ли еще каким образом не заметил, а теперь мне любопытно стало, но боюсь, что не найду.
- Реклама
Re: STM32 новичку в ARM что к чему
[uquote="VladislavS",url="/forum/viewtopic.php?p=3491881#p3491881"]Это всё замечательно, если у тебя есть время на каждый чих функцию писать. На это надо далеко не 10 минут.[/uquote]
Это не каждый чих, это функция которая будет использоваться в каждом проекте минимум один раз и если ее можно сделать простой, то обычно это и нужно сделать.

[uquote="a5021",url="/forum/viewtopic.php?p=3491961#p3491961"]А можно повторить ? Я то ли пролистал по невнимательности, то ли еще каким образом не заметил, а теперь мне любопытно стало, но боюсь, что не найду.[/uquote]
Это на другом форуме было. На самом деле речь шла о классе, что совершенно не важно, т.к. функция все равно статическая:
Кварц должен быть 4/8/12/16 MHz, т.к. входная частота приводится к рекомендуемым 2MHz...
Это не каждый чих, это функция которая будет использоваться в каждом проекте минимум один раз и если ее можно сделать простой, то обычно это и нужно сделать.
Второй выход - 48 MHz, можно лишь пытаться получить максимально приближенную к этой частоту, что и происходит автоматически.А где в этой функции учтено, что выходов у PLL несколько?
Ага, с портами было то же самоеМне частоту pll для этого проца надо один раз в жизни задать.
Не знаю, зашел в папку с хедерами, там все для всех серий, включая HAL/SPL, дал поиск по _RCC_PLLCFGR_PLLN и ничего не нашло...Макрос стандартный CMSIS-овский.
Порядок другой, суть не меняется. Код достаточно явно выражающий свои намерения даже без комментариев и позволяющий легко менять частоты на ходу определенно лучше кода в который подставляются константы из некой тулзы, где без комментариев о выставленных частотах можно только гадать.Ты путаешь последовательность. Сначала в кубе ставишь нужную частоту, он сам расставляет все делители. Тут же видишь точные частоты всех узлов и если они тебя устраивают - переносишь в код. И никак не наоборот.
[uquote="a5021",url="/forum/viewtopic.php?p=3491961#p3491961"]А можно повторить ? Я то ли пролистал по невнимательности, то ли еще каким образом не заметил, а теперь мне любопытно стало, но боюсь, что не найду.[/uquote]
Это на другом форуме было. На самом деле речь шла о классе, что совершенно не важно, т.к. функция все равно статическая:
Спойлер
Код: Выделить всё
enum class PllSrc { Hsi = 0, Hse = RCC_PLLCFGR_PLLSRC_HSE };
static void init(PllSrc clkSrc, uint32_t freq) // 50..371 MHz
{
uint32_t clkSrcFreq = (clkSrc == PllSrc::Hsi) ? 16 : HseValue / 1'000'000;
uint32_t prediv = clkSrcFreq / 2;
uint32_t usbdiv = (2 * freq + 24) / 48;
RCC->PLLCFGR = uint32_t(clkSrc) | prediv | (freq << RCC_PLLCFGR_PLLN_Pos) | (usbdiv << RCC_PLLCFGR_PLLQ_Pos);
}- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3491981#p3491981"]Не знаю, зашел в папку с хедерами, там все для всех серий, включая HAL/SPL, дал поиск по _RCC_PLLCFGR_PLLN и ничего не нашло...[/uquote]Это потому что ты видишь то что хочешь увидеть. Пару строк выше был макрос _VAL2FLD из CMSIS. По большому счёту, можно им и ограничиться. _RCC_PLLCFGR_PLLN совершенно бесхитростно доопределяется для гурманов.
[uquote="Reflector",url="/forum/viewtopic.php?p=3491981#p3491981"]На самом деле речь шла о классе[/uquote]Ты же знаешь, что я за классы там где они приносят пользу. Но сконфигурить RCC это десяток строк сниппетса, а не десять экранов классов.
[uquote="Reflector",url="/forum/viewtopic.php?p=3491981#p3491981"]На самом деле речь шла о классе[/uquote]Ты же знаешь, что я за классы там где они приносят пользу. Но сконфигурить RCC это десяток строк сниппетса, а не десять экранов классов.
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3491273#p3491273"]На хабре появилась статеечка, как ручками через регистры сконфигурировать тактирование на STM32H7. Никогда ранее с седьмой серией не сталкивался, но что и зачем делает автор в общих чертах понятно. Кроме одного момента:
Занесение значения в регистр RCC_PLLCKSELR зачем-то разбито аж на шесть шагов. Никто не в курсе, зачем все это и почему нельзя было написать просто
?[/uquote]
Человек как смог так и сделал. Это не учебное пособие по программированию.
Код: Выделить всё
//PLLM = 4
RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_5; //0
RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_4; //0
RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_3; //0
RCC -> PLLCKSELR |= RCC_PLLCKSELR_DIVM1_2; //1
RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_1; //0
RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_0; //0Код: Выделить всё
RCC -> PLLCKSELR = RCC_PLLCKSELR_DIVM1_2;Человек как смог так и сделал. Это не учебное пособие по программированию.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: STM32 новичку в ARM что к чему
Чет как-то жиденько он смог. Непонятно, зачем такую бурду на хабре публиковать.
- Реклама
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Ну да, можно было как то так сделать это дело.

Код: Выделить всё
RCC->PLLCKSELR =
_VAL2FLD(RCC_PLLCKSELR_PLLSRC, 2) |
_VAL2FLD(RCC_PLLCKSELR_DIVM1, 4) |
_VAL2FLD(RCC_PLLCKSELR_DIVM2, 32) |
_VAL2FLD(RCC_PLLCKSELR_DIVM3, 32);
Последний раз редактировалось Oxford Сб окт 27, 2018 00:03:10, всего редактировалось 1 раз.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: STM32 новичку в ARM что к чему
Сегодня здесь день волшебных чисел видать.
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
a5021, вам непонятен мой код? Почему волшебные? Самые обычные числа
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: STM32 новичку в ARM что к чему
Мне непонятно, чем ваше лучше такого:
?
Код: Выделить всё
RCC->PLLCKSELR = RCC_PLLCKSELR_PLLSRC_HSE | RCC_PLLCKSELR_DIVM1_2 | RCC_PLLCKSELR_DIVM2_5 | RCC_PLLCKSELR_DIVM3_5;- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Вы складываете побитово, запись длинная и не сразу можно понять что складывается и для чего, какие поля, какие значения, нужно сидеть внимательно читать код высчитывать, просмотреть всю запись и не пропустить бит.
В моем случае используется макрос ПОЛЕ-ЗНАЧЕНИЕ, если вы посмотрите на регистр он имеет 5 полей. В макрос передается название поля и его параметр. К примеру вам надо по даташиту в поле установить 110110, вместо длинной цепочки битов, вы просто передаете в макрос 54.
Так же макросы логически разбивают на блоки настройку регистров, восприятие кода легче и приятнее.
Например:
_VAL2FLD(RCC_PLLCKSELR_PLLSRC, 2)
Означает установить в поле PLLSRC значение 2 (10: HSE selected as PLL clock (hse_ck))
Такая запись не создает путаницы, улучшает понимание кода, уменьшает ошибки. Более эффективный кодинг.
Но, отдельные биты тоже используются, например если требуется просто сбросить бит или установить. По ситуации надо смотреть.
Эти макросы сообщество узнало от меня, показывал как проще и быстрее прогать на CMSIS.
Их придумали не для красоты.

В моем случае используется макрос ПОЛЕ-ЗНАЧЕНИЕ, если вы посмотрите на регистр он имеет 5 полей. В макрос передается название поля и его параметр. К примеру вам надо по даташиту в поле установить 110110, вместо длинной цепочки битов, вы просто передаете в макрос 54.
Так же макросы логически разбивают на блоки настройку регистров, восприятие кода легче и приятнее.
Например:
_VAL2FLD(RCC_PLLCKSELR_PLLSRC, 2)
Означает установить в поле PLLSRC значение 2 (10: HSE selected as PLL clock (hse_ck))
Такая запись не создает путаницы, улучшает понимание кода, уменьшает ошибки. Более эффективный кодинг.
Но, отдельные биты тоже используются, например если требуется просто сбросить бит или установить. По ситуации надо смотреть.
Эти макросы сообщество узнало от меня, показывал как проще и быстрее прогать на CMSIS.
Их придумали не для красоты.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Это чё, он сейчас будет доказывать, что в этой простой и понятной записи магические числа, легко ошибиться и ничего не понятно
Зато вот в этом непотребстве, которое под спойлер на приличных форумах положено прятать, всё понятно, магических чисел нет и хрен ошибёшься.
Кому-то явно построчно за работу платят.
PS: Если кто-то скажет, что неCMSIS-овские макросы применяю, то милости просим под спойлерлибо так
Код: Выделить всё
//Настройка PLL: тактирование от HSE, Q=4, P=2, N=96, M=4
RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSE | _RCC_PLLCFGR_PLLQ(4) | RCC_PLLCFGR_PLLP_div2 | _RCC_PLLCFGR_PLLN(96) | _RCC_PLLCFGR_PLLM(4);
Код: Выделить всё
RCC->PLLCFGR = (
0 * RCC_PLLCFGR_PLLSRC_HSI |
1 * RCC_PLLCFGR_PLLSRC_HSE |
0 * RCC_PLLCFGR_PLLQ_0 |
0 * RCC_PLLCFGR_PLLQ_1 |
1 * RCC_PLLCFGR_PLLQ_2 |
0 * RCC_PLLCFGR_PLLQ_3 |
1 * RCC_PLLCFGR_PLLP_div2 |
0 * RCC_PLLCFGR_PLLP_div4 |
0 * RCC_PLLCFGR_PLLP_div6 |
0 * RCC_PLLCFGR_PLLP_div8 |
0 * RCC_PLLCFGR_PLLN_0 |
0 * RCC_PLLCFGR_PLLN_1 |
0 * RCC_PLLCFGR_PLLN_2 |
0 * RCC_PLLCFGR_PLLN_3 |
0 * RCC_PLLCFGR_PLLN_4 |
1 * RCC_PLLCFGR_PLLN_5 |
1 * RCC_PLLCFGR_PLLN_6 |
0 * RCC_PLLCFGR_PLLN_7 |
0 * RCC_PLLCFGR_PLLN_8 |
0 * RCC_PLLCFGR_PLLM_0 |
0 * RCC_PLLCFGR_PLLM_1 |
1 * RCC_PLLCFGR_PLLM_2 |
0 * RCC_PLLCFGR_PLLM_3 |
0 * RCC_PLLCFGR_PLLM_4 |
0 * RCC_PLLCFGR_PLLM_5
);PS: Если кто-то скажет, что неCMSIS-овские макросы применяю, то милости просим под спойлер
Спойлер
Макрос _VAL2FLD мне не шибко нравится. Единственный его плюс, что он есть в CMSIS и код переносимый получается. Я же не ленюсь и доопределяю макросы по настроению, либо такКод: Выделить всё
#define _RCC_PLLCFGR_PLLQ(value) ((RCC_PLLCFGR_PLLQ_Msk & ((value) << RCC_PLLCFGR_PLLQ_Pos)))
Код: Выделить всё
#define _RCC_PLLCFGR_PLLQ(value) _VAL2FLD(RCC_PLLCFGR_PLLQ,(value))
Re: STM32 новичку в ARM что к чему
[uquote="VladislavS",url="/forum/viewtopic.php?p=3492435#p3492435"]Зато вот в этом непотребстве [...] всё понятно, магических чисел нет и хрен ошибёшься.[/uquote]
Именно так. Если вы этого не понимаете, мои вам соболезнования.
Именно так. Если вы этого не понимаете, мои вам соболезнования.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
А ошибку которую я специально внёс в это непотребство заметил? 
Re: STM32 новичку в ARM что к чему
Даже не смотрел. Это же ваше непотребство, вам и отвечать.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
А как же всё понятно с первого взгляда? 
Re: STM32 новичку в ARM что к чему
Вы инициализируете неизвестную платформу неизвестным образом. Что именно должно быть понятно? Что вы без постановки задачи вносите какие-то "альтернативные" ошибки? Так это ваша проблема, как и ранее.
Re: STM32 новичку в ARM что к чему
На мой взгляд ошибка слишком очевидна.
Код: Выделить всё
RCC->PLLCFGR = (
0 * RCC_PLLCFGR_PLLSRC_HSI |
1 * RCC_PLLCFGR_PLLSRC_HSE |
0 * RCC_PLLCFGR_PLLQ_0 |
0 * RCC_PLLCFGR_PLLQ_1 |
1 * RCC_PLLCFGR_PLLQ_2 |
0 * RCC_PLLCFGR_PLLQ_3 |
1 * RCC_PLLCFGR_PLLP_div2 |
0 * RCC_PLLCFGR_PLLP_div4 |
0 * RCC_PLLCFGR_PLLP_div6 |
0 * RCC_PLLCFGR_PLLP_div8 |
0 * RCC_PLLCFGR_PLLN_0 |
0 * RCC_PLLCFGR_PLLN_1 |
0 * RCC_PLLCFGR_PLLN_2 |
0 * RCC_PLLCFGR_PLLN_3 |
0 * RCC_PLLCFGR_PLLN_4 |
1 * RCC_PLLCFGR_PLLN_5 |
0 * RCC_PLLCFGR_PLLN_6 |
0 * RCC_PLLCFGR_PLLM_7 |
0 * RCC_PLLCFGR_PLLN_8 |
0 * RCC_PLLCFGR_PLLM_0 |
0 * RCC_PLLCFGR_PLLM_1 |
1 * RCC_PLLCFGR_PLLN_2 |
0 * RCC_PLLCFGR_PLLM_3 |
0 * RCC_PLLCFGR_PLLM_4 |
0 * RCC_PLLCFGR_PLLM_5
);Re: STM32 новичку в ARM что к чему
Продолжайте.
Re: STM32 новичку в ARM что к чему
Почему затихли авторы бредового "непотребства" и "слишком очевидных ошибок" ?
Re: STM32 новичку в ARM что к чему
А вы ошибки нашли? Сколько времени понадобилось? А если не знали что в коде есть ошибки, сразу бы их обнаружили про просмотре кода?


