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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3491878#p3491878"]Я же тебе показывал функцию вызов которой выглядит следующим образом:[/uquote]
А можно повторить ? Я то ли пролистал по невнимательности, то ли еще каким образом не заметил, а теперь мне любопытно стало, но боюсь, что не найду.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3491881#p3491881"]Это всё замечательно, если у тебя есть время на каждый чих функцию писать. На это надо далеко не 10 минут.[/uquote]
Это не каждый чих, это функция которая будет использоваться в каждом проекте минимум один раз и если ее можно сделать простой, то обычно это и нужно сделать.
А где в этой функции учтено, что выходов у PLL несколько?
Второй выход - 48 MHz, можно лишь пытаться получить максимально приближенную к этой частоту, что и происходит автоматически.
Мне частоту pll для этого проца надо один раз в жизни задать.
Ага, с портами было то же самое :)
Макрос стандартный CMSIS-овский.
Не знаю, зашел в папку с хедерами, там все для всех серий, включая HAL/SPL, дал поиск по _RCC_PLLCFGR_PLLN и ничего не нашло...
Ты путаешь последовательность. Сначала в кубе ставишь нужную частоту, он сам расставляет все делители. Тут же видишь точные частоты всех узлов и если они тебя устраивают - переносишь в код. И никак не наоборот.
Порядок другой, суть не меняется. Код достаточно явно выражающий свои намерения даже без комментариев и позволяющий легко менять частоты на ходу определенно лучше кода в который подставляются константы из некой тулзы, где без комментариев о выставленных частотах можно только гадать.

[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);
}
Кварц должен быть 4/8/12/16 MHz, т.к. входная частота приводится к рекомендуемым 2MHz...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[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 это десяток строк сниппетса, а не десять экранов классов.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

[uquote="a5021",url="/forum/viewtopic.php?p=3491273#p3491273"]На хабре появилась статеечка, как ручками через регистры сконфигурировать тактирование на STM32H7. Никогда ранее с седьмой серией не сталкивался, но что и зачем делает автор в общих чертах понятно. Кроме одного момента:

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

//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 =  RCC_PLLCKSELR_DIVM1_2;
?[/uquote]

Человек как смог так и сделал. Это не учебное пособие по программированию.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

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

Сообщение Oxford »

Ну да, можно было как то так сделать это дело.

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

  RCC->PLLCKSELR = 
  	_VAL2FLD(RCC_PLLCKSELR_PLLSRC, 2) |
	  _VAL2FLD(RCC_PLLCKSELR_DIVM1, 4) |
	  _VAL2FLD(RCC_PLLCKSELR_DIVM2, 32) |
	  _VAL2FLD(RCC_PLLCKSELR_DIVM3, 32);
:tea:
Последний раз редактировалось Oxford Сб окт 27, 2018 00:03:10, всего редактировалось 1 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

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

Сообщение Oxford »

a5021, вам непонятен мой код? Почему волшебные? Самые обычные числа
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Мне непонятно, чем ваше лучше такого:

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

RCC->PLLCKSELR = RCC_PLLCKSELR_PLLSRC_HSE | RCC_PLLCKSELR_DIVM1_2 | RCC_PLLCKSELR_DIVM2_5 | RCC_PLLCKSELR_DIVM3_5;
?
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Вы складываете побитово, запись длинная и не сразу можно понять что складывается и для чего, какие поля, какие значения, нужно сидеть внимательно читать код высчитывать, просмотреть всю запись и не пропустить бит.
В моем случае используется макрос ПОЛЕ-ЗНАЧЕНИЕ, если вы посмотрите на регистр он имеет 5 полей. В макрос передается название поля и его параметр. К примеру вам надо по даташиту в поле установить 110110, вместо длинной цепочки битов, вы просто передаете в макрос 54.

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

Например:
_VAL2FLD(RCC_PLLCKSELR_PLLSRC, 2)

Означает установить в поле PLLSRC значение 2 (10: HSE selected as PLL clock (hse_ck))

Такая запись не создает путаницы, улучшает понимание кода, уменьшает ошибки. Более эффективный кодинг.

Но, отдельные биты тоже используются, например если требуется просто сбросить бит или установить. По ситуации надо смотреть.

Эти макросы сообщество узнало от меня, показывал как проще и быстрее прогать на CMSIS.
Их придумали не для красоты.
:tea:
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Это чё, он сейчас будет доказывать, что в этой простой и понятной записи магические числа, легко ошибиться и ничего не понятно

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

//Настройка 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
 );
Кому-то явно построчно за работу платят. :kill:

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))
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3492435#p3492435"]Зато вот в этом непотребстве [...] всё понятно, магических чисел нет и хрен ошибёшься.[/uquote]
Именно так. Если вы этого не понимаете, мои вам соболезнования.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А ошибку которую я специально внёс в это непотребство заметил? :)
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Даже не смотрел. Это же ваше непотребство, вам и отвечать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А как же всё понятно с первого взгляда? :)
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Вы инициализируете неизвестную платформу неизвестным образом. Что именно должно быть понятно? Что вы без постановки задачи вносите какие-то "альтернативные" ошибки? Так это ваша проблема, как и ранее.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

На мой взгляд ошибка слишком очевидна.

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

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
 );
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Продолжайте.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Почему затихли авторы бредового "непотребства" и "слишком очевидных ошибок" ?
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

А вы ошибки нашли? Сколько времени понадобилось? А если не знали что в коде есть ошибки, сразу бы их обнаружили про просмотре кода?
Ответить

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