Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 07.02.2022
Сообщений: 33

STM32f4 настройка PLL

20.02.2022, 16:44. Показов 2167. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте, правильно ли я понимаю, что макрос
C#
1
RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLN,255);
не работает с числами больше 255? Долго мучился с настройкой PLL, пока дошел до этого Я с Stm занимаюсь недавно, поэтому некоторые вещи мне не знакомы.
Как тогда выставить множитель N? У Stm он может достигать 400 и выше. Хочется, чтобы код был красивым и читаемым, а не какие-нибудь побитовые или сдвиговые операции. Есть ли альтернатива данному макросу?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2022, 16:44
Ответы с готовыми решениями:

Настройка PLL множителей на stm32f407vet6
Здравствуйте, настраиваю тактирование на stm32f407 vet6 и кое что не понимаю. До этого настраивал на f103 там немного по другому но...

STM32f4 настройка таймера
Здравствуйте, столкнулся с еще одной непонятной пока проблемой - не удается заставить работать таймер на определенных настройках. Вот...

STM32F4 Discovery Настройка таймеров
Здравствуйте! Разбираюсь с режимами работы таймеров. Задача стоит следующая: есть входной сигнал "х" частоты, который необходимо...

11
Windows must die
666 / 866 / 103
Регистрация: 23.11.2021
Сообщений: 5,119
Записей в блоге: 18
20.02.2022, 17:00
Лучший ответ Сообщение было отмечено Vlad2022 как решение

Решение

Вопрос 1: откуда этот макрос?
Вопрос 2: где документация? Там все должно быть написано. Или хотя бы в комментариях к макросу.

Добавлено через 5 минут
UPD, grep -R нашел этот макрос в недрах CMSIS:
C
1
2
3
4
5
6
7
/**
  \brief   Mask and shift a bit field value for use in a register bit range.
  \param[in] field  Name of the register bit field.
  \param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.
  \return           Masked and shifted value.
*/
#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
Т.е ты неправильно понял этот макрос!
0
0 / 0 / 1
Регистрация: 07.02.2022
Сообщений: 33
20.02.2022, 18:01  [ТС]
Да, спасибо. В чем же тогда проблема? Пока N меньше 256 все работает отлично, когда я ставлю N = 256 и больше, контроллер начинает считать примерно в 2 раза быстрее заданного.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void ClockInit(void) {
 
    FLASH->ACR |= FLASH_ACR_PRFTEN;
    FLASH->ACR |= FLASH_ACR_LATENCY_1WS;
 
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_HPRE_DIV1;
 
    RCC->CR |= RCC_CR_HSEON;
 
    while (!(RCC->CR & RCC_CR_HSERDY));
 
    RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLM,25);
    RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLN,255);
    RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLP,3);
    RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE;
 
    RCC->CR |= RCC_CR_PLLON;
 
    while(!(RCC->CR & RCC_CR_PLLRDY));
 
    RCC->CFGR |= RCC_CFGR_SW_PLL;
 
    while(!(RCC->CFGR&  RCC_CFGR_SWS_PLL));
}
0
 Аватар для northcitizen
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
21.02.2022, 16:31
Цитата Сообщение от Vlad2022 Посмотреть сообщение
В чем же тогда проблема?
В том, что выходная частота с PLL должна быть в определенном диапазоне, например 100MHz <= Fpll <= 500MHz, я так думаю
0
 Аватар для northcitizen
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
21.02.2022, 16:44
Вот
Миниатюры
STM32f4 настройка PLL  
0
Windows must die
666 / 866 / 103
Регистрация: 23.11.2021
Сообщений: 5,119
Записей в блоге: 18
21.02.2022, 16:48
Цитата Сообщение от Vlad2022 Посмотреть сообщение
Пока N меньше 256 все работает отлично
Поле PLLN 9-битное, т.е. числа до 511 туда писать легитимно.
Вот только если заглянуть в RM, видно, что очень много значений его — неверные!
The software has to set these bits correctly to ensure that the VCO output frequency is between 192 and 432 MHz.
Т.е. правильные значения — лишь от 0xc0 (192) до 0x1b0 (432).
256 - легитимное значение. Возможно, неправильно работает макрос. Советую посмотреть листинг этого участка кода: во что его превращает gcc.
Или даже можно сначала просто раскрыть макросы при помощи флага -E

Кстати, что за MCU конкретно?
0
0 / 0 / 1
Регистрация: 07.02.2022
Сообщений: 33
21.02.2022, 22:02  [ТС]
Цитата Сообщение от northcitizen Посмотреть сообщение
В том, что выходная частота с PLL должна быть в определенном диапазоне
На плате кварц 25МГц, я эту частоту делю с помощью М на 25, а потом с помощью N умножаю на 256, получается 256МГц, по документации на контроллер: The software has to set these bits correctly to ensure that the VCO output frequency is between 192 and 432 MHz. И частота и множитель находятся в разрешенном диапазоне.

Добавлено через 10 минут
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Возможно, неправильно работает макрос.
Проверил работу макроса, сделав побитовые операции
C#
1
RCC->PLLCFGR |= RCC_PLLCFGR_PLLN_8;
Частота генерится неправильно, если выставляю все биты кроме 9, т.е. значение 255, то все работает как надо.
Контроллер Stm32f401ccu6.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Советую посмотреть листинг этого участка кода: во что его превращает gcc.
Или даже можно сначала просто раскрыть макросы при помощи флага -E
Никогда такое не пробовал, не могли бы вы вкратце объяснить процедуру или подсказать где это описывается?

Добавлено через 21 минуту
Цитата Сообщение от Vlad2022 Посмотреть сообщение
Частота генерится неправильно
Получилось. Если обнуляю предыдущие биты явно
C#
1
2
RCC->PLLCFGR &= ~(RCC_PLLCFGR_PLLN_0 | RCC_PLLCFGR_PLLN_1 | RCC_PLLCFGR_PLLN_2 | RCC_PLLCFGR_PLLN_3 | RCC_PLLCFGR_PLLN_4 | RCC_PLLCFGR_PLLN_5 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7);
RCC->PLLCFGR |= RCC_PLLCFGR_PLLN_8;
то все работает. Значит проблема в макросе.
0
Windows must die
666 / 866 / 103
Регистрация: 23.11.2021
Сообщений: 5,119
Записей в блоге: 18
21.02.2022, 22:05
Чему у вас равны RCC_PLLCFGR_PLLN_Pos и RCC_PLLCFGR_PLLN_Msk? Просто у меня таких макросов нет - я еще с F4 не заморачивался.
0
0 / 0 / 1
Регистрация: 07.02.2022
Сообщений: 33
21.02.2022, 22:42  [ТС]
Что в итоге получилось. Если перед выставлением множителя N, обнулить все его биты
C#
1
2
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLN;
RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLN,256);
или в самом начале обнулить регистр PLLCFGR
C#
1
RCC->PLLCFGR = 0x00;
то тогда тактовая конфигурируется правильно (в том числе с помощью макросов). Если этого не сделать PLL не настраивается на нужную частоту в диапазоне N > 255.
Это все, что удалось получить опытным путем. Если кто то знает почему так происходит, будет интересно услышать. Я пока нигде в описании настройки тактовой частоты не встречал таких нюансов.

Добавлено через 6 минут
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Чему у вас равны RCC_PLLCFGR_PLLN_Pos и RCC_PLLCFGR_PLLN_Msk? Просто у меня таких макросов нет - я еще с F4 не заморачивался.
Я эти макросы не задаю, возможно они описаны где то в библиотеке CMSIS.
0
Windows must die
666 / 866 / 103
Регистрация: 23.11.2021
Сообщений: 5,119
Записей в блоге: 18
21.02.2022, 22:58
Я уже приводил, что в этом макросе:
C
1
#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
Т.е. если писать
C
1
RCC->PLLCFGR = _VAL2FLD(RCC_PLLCFGR_PLLN,255);
все будет нормально. Но если ксорить, то, естественно, получаем наложение маски на старые биты — т.е. мусор. Поэтому и рекомендуют никогда не писать просто
C
1
REG |= FLAGS;
правильно:
C
1
REG = (REG & ~(CLEARMASK)) | FLAGS;
0
0 / 0 / 1
Регистрация: 07.02.2022
Сообщений: 33
21.02.2022, 23:49  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Я уже приводил, что в этом макросе
Я предполагаю, что в CMSIS где то прописаны числовые значения RCC_PLLCFGR_PLLN_Pos и RCC_PLLCFGR_PLLN_Msk, так как без определения их в моей программе она работает.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Но если ксорить, то, естественно, получаем наложение маски на старые биты
Значит ли это что множитель N в регистре PLLCFGR изначально не равен нулю и когда я вручную выставляю девятый бит (или значение 256 с помощью макроса) через операцию |, биты накладываются друг на друга и получается неверная величина?
0
Windows must die
666 / 866 / 103
Регистрация: 23.11.2021
Сообщений: 5,119
Записей в блоге: 18
22.02.2022, 00:01
Цитата Сообщение от Vlad2022 Посмотреть сообщение
Значит ли это что множитель N в регистре PLLCFGR изначально не равен нулю
В RM написано, какое там значение после сброса: 0x24003010, т.е. в регистре PLLN после сброса записано 192. Естественно, ксорить это с 256 не очень хорошо: получится 448 - запрещенное значение, поведение будет непредсказуемым.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2022, 00:01
Помогаю со студенческими работами здесь

stm32f4 настройка альтернативной функции
Как правильно настроить например регистры альтернативной функции в stm32 f4? Ну на этот врос можно ответить?.Или кроме админа никого здесь...

Настройка работы таймера stm32f4 discovery
Настраивается таймер: TIM_TimeBaseInitTypeDef base_timer; TIM_TimeBaseStructInit(&amp;base_timer); base_timer.TIM_Pressotir =...

Настройка RCC в STM32F4. Спортивный бег по костылям.
Здравствуйте! Второй день ломаю голову над настройкой тактового генератора. Итак: 1.Если тактовый генератор вообще не...

stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE&
/* * main.c * * Created on: 20 бер. 2020 р. * Author: Ivan */ #include &quot;main.h&quot; #include &quot;stm32f103xb.h&quot; ...

PLL на STM32F103RCT
Добрый день. Настраиваю PLL от внутреннего осциллятора(HSI), но сколько бы я не менял коэффициенты, частота не меняется. Пробовал проверять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru