0 / 0 / 1
Регистрация: 07.02.2022
Сообщений: 33
1

STM32f4 настройка PLL

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

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

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

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

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

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

11
Заблокирован
20.02.2022, 17:00 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
Да, спасибо. В чем же тогда проблема? Пока 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
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
21.02.2022, 16:31 4
Цитата Сообщение от Vlad2022 Посмотреть сообщение
В чем же тогда проблема?
В том, что выходная частота с PLL должна быть в определенном диапазоне, например 100MHz <= Fpll <= 500MHz, я так думаю
0
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
21.02.2022, 16:44 5
Вот
Миниатюры
STM32f4 настройка PLL  
0
Заблокирован
21.02.2022, 16:48 6
Цитата Сообщение от 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  [ТС] 7
Цитата Сообщение от 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
Заблокирован
21.02.2022, 22:05 8
Чему у вас равны RCC_PLLCFGR_PLLN_Pos и RCC_PLLCFGR_PLLN_Msk? Просто у меня таких макросов нет - я еще с F4 не заморачивался.
0
0 / 0 / 1
Регистрация: 07.02.2022
Сообщений: 33
21.02.2022, 22:42  [ТС] 9
Что в итоге получилось. Если перед выставлением множителя 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
Заблокирован
21.02.2022, 22:58 10
Я уже приводил, что в этом макросе:
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  [ТС] 11
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Я уже приводил, что в этом макросе
Я предполагаю, что в CMSIS где то прописаны числовые значения RCC_PLLCFGR_PLLN_Pos и RCC_PLLCFGR_PLLN_Msk, так как без определения их в моей программе она работает.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Но если ксорить, то, естественно, получаем наложение маски на старые биты
Значит ли это что множитель N в регистре PLLCFGR изначально не равен нулю и когда я вручную выставляю девятый бит (или значение 256 с помощью макроса) через операцию |, биты накладываются друг на друга и получается неверная величина?
0
Заблокирован
22.02.2022, 00:01 12
Цитата Сообщение от Vlad2022 Посмотреть сообщение
Значит ли это что множитель N в регистре PLLCFGR изначально не равен нулю
В RM написано, какое там значение после сброса: 0x24003010, т.е. в регистре PLLN после сброса записано 192. Естественно, ксорить это с 256 не очень хорошо: получится 448 - запрещенное значение, поведение будет непредсказуемым.
0
22.02.2022, 00:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2022, 00:01
Помогаю со студенческими работами здесь

Настройка работы таймера stm32f4 discovery
Настраивается таймер: TIM_TimeBaseInitTypeDef base_timer;...

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

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

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

Управление PLL
Здравствуйте! У меня есть pll HMC833LP6GE, но я никак не могу заставить её генерировать сигналы...

STM32F4Discovery PLL
Добрый день. Возник вопрос по поводу PLL. Настраиваю её следующим образом: /* Kimeral clock mode...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru