Как настроить PLL1 STM32H743 на 480 МГц?
Обновлено Редакция GAW
PLL1 у STM32H743 тактирует ядро, и у него больше ограничений, чем у PLL младших STM32: отдельный предделитель DIVM1, диапазон частоты на входе PLL1RGE, два диапазона VCO и три выхода P, Q, R. Общий принцип умножителя описан в термине «PLL».
Расчёт от кварца 25 МГц
| Параметр | Значение | Предел по RM0433 |
|---|---|---|
| Вход PLL, ref1_ck | 25 / 5 = 5 МГц | 1–16 МГц, PLL1RGE = 10 (4–8 МГц) |
| VCO | 5 × 192 = 960 МГц | 192–960 МГц при PLL1VCOSEL = 0 |
| Выход P, ядро | 960 / 2 = 480 МГц | ядро до 480 МГц |
| Шина AXI | 480 / 2 = 240 МГц (HPRE) | до 240 МГц |
// PLL1: 25 MHz HSE -> 480 MHz (RM0433, RCC_PLLCKSELR, RCC_PLLCFGR, RCC_PLL1DIVR)
RCC->PLLCKSELR = (RCC->PLLCKSELR & ~(RCC_PLLCKSELR_DIVM1 | RCC_PLLCKSELR_PLLSRC))
| (5U << RCC_PLLCKSELR_DIVM1_Pos) | RCC_PLLCKSELR_PLLSRC_HSE;
RCC->PLLCFGR = (RCC->PLLCFGR & ~(RCC_PLLCFGR_PLL1RGE | RCC_PLLCFGR_PLL1VCOSEL))
| RCC_PLLCFGR_PLL1RGE_2 | RCC_PLLCFGR_DIVP1EN; // 4-8 MHz, wide VCO
RCC->PLL1DIVR = ((192U - 1U) << RCC_PLL1DIVR_N1_Pos) | ((2U - 1U) << RCC_PLL1DIVR_P1_Pos)
| ((4U - 1U) << RCC_PLL1DIVR_Q1_Pos) | ((2U - 1U) << RCC_PLL1DIVR_R1_Pos);
RCC->CR |= RCC_CR_PLL1ON;
while (!(RCC->CR & RCC_CR_PLL1RDY)) { }
Что сделать до переключения на PLL1
- Поднять напряжение ядра до VOS0 по порядку из разд. 6.6.2 RM0433: выбрать в PWR_D3CR уровень VOS1 и дождаться VOSRDY, включить тактирование SYSCFG (бит SYSCFGEN в RCC_APB4ENR), установить ODEN в SYSCFG_PWRCR и снова дождаться VOSRDY. Перед Stop и Standby VOS0 выключают. Подробнее — FAQ страницы STM32H7 и термин «Масштабирование напряжения».
- Поставить делитель HPRE на 2, чтобы шина AXI не превысила 240 МГц, и делители APB.
- Записать 4 такта ожидания и WRHIGHFREQ = 10 — по таблице из ответа «Сколько тактов ожидания FLASH нужно STM32H743».
- Только после этого выбрать PLL1 полем SW в RCC_CFGR.
// VOS1 -> VOS0 (RM0433, 6.6.2, 12.3.10)
PWR->D3CR |= PWR_D3CR_VOS_0 | PWR_D3CR_VOS_1; // VOS = 11, Scale 1
while (!(PWR->D3CR & PWR_D3CR_VOSRDY)) { }
RCC->APB4ENR |= RCC_APB4ENR_SYSCFGEN;
SYSCFG->PWRCR |= SYSCFG_PWRCR_ODEN; // overdrive: VOS0
while (!(PWR->D3CR & PWR_D3CR_VOSRDY)) { }
RM0433 описывает ревизии кристалла Y и V по отдельности, поэтому перед расчётом на 480 МГц проверьте предельную частоту ядра для своей ревизии в даташите STM32H743 (DS12110) и в errata.
Для младших серий STM32 дерево тактов рассчитывает калькулятор тактирования STM32.
Похожие вопросы
Можно ли получить 480 МГц от кварца 8 МГц?
Да: DIVM1 = 1 оставляет на входе PLL 8 МГц (PLL1RGE = 11, диапазон 8–16 МГц), DIVN1 = 120 даёт VCO 960 МГц, DIVP1 = 2 — 480 МГц. Это наш расчёт по пределам из RM0433: вход PLL 1–16 МГц и VCO 192–960 МГц в широком диапазоне.
Почему в регистр DIVN1 пишут 191, а не 192?
По RM0433 поле DIVN1 хранит множитель минус один: значение 0x003 соответствует DIVN1 = 4, 0x1FF — 512. Так же устроены поля делителей DIVP1, DIVQ1 и DIVR1: записанный ноль означает деление на 1.
Откуда взять 48 МГц для USB, если PLL1 занят под ядро?
Можно использовать PLL3 с выходом Q или генератор HSI48 с подстройкой CRS — оба источника выбираются полем USBSEL. После сброса USBSEL = 00, и тактовый сигнал USB выключен. Подробности — в ответе о неработающем USB на STM32H743.
Источники
- STMicroelectronics. RM0433 Reference manual STM32H742, STM32H743/753 and STM32H750 Value line, Rev 9 — RCC_PLLCKSELR: DIVM1[5:0] — 0 выключает предделитель, 1…63 — деление, после сброса 32; RCC_PLLCFGR: PLL1RGE — 00 1–2 МГц (сброс), 01 2–4, 10 4–8, 11 8–16 МГц; PLL1VCOSEL — 0 широкий диапазон VCO 192–960 МГц (сброс), 1 средний 150–420 МГц; поля пишут до включения PLL1; RCC_PLL1DIVR: DIVN1 от 4 до 512 (значение поля = N − 1), DIVP1 — нечётные делители запрещены, DIVQ1 /1…/128; VCO = Fref × DIVN1, вход PLL 1–16 МГц; рис. 49: ядро до 480 МГц, шина AXI до 240 МГц; разд. 4.3.8, табл. 17: 225–240 МГц AXI в VOS0 — 4 такта ожидания; разд. 6.6.2: максимальная частота достигается в VOS0, порядок включения — убедиться, что в PWR_D3CR выбран VOS1, включить тактирование SYSCFG битом SYSCFGEN в RCC_APB4ENR, установить ODEN в SYSCFG_PWRCR, дождаться VOSRDY; разд. 12.3.10: ODEN пишут только в режиме VOS1, перед Stop и Standby VOS0 выключают; разд. 6.8.6: PWR_D3CR, VOS 11 — Scale 1, VOSRDY — бит 13; в RM0433 ряд функций описан отдельно для ревизий кристалла Y и V
- STMicroelectronics. cmsis-device-h7, Include/stm32h743xx.h (commit 81db1ec) — RCC_PLLCKSELR_DIVM1_Pos = 4; RCC_PLLCFGR_PLL1VCOSEL — бит 1, RCC_PLLCFGR_PLL1RGE — биты 3:2, RCC_PLLCFGR_PLL1RGE_2 = 0x8 (4–8 МГц); RCC_PLL1DIVR_N1_Pos = 0, RCC_PLL1DIVR_P1_Pos = 9
Нашли ошибку?
Смотрите также
- STM32H7Cortex-M7 от 280 до 600 МГц, двухъядерные H745/H747 — линейки, память, загрузка и распиновки
- PLLУмножитель частоты: ФАПЧ в тактировании МК
- Сколько тактов ожидания FLASH нужно STM32H743?По частоте AXI и VOS: 240 МГц в VOS0 — LATENCY = 4, WRHIGHFREQ = 10
- Тактирование STM32PLL под нужную частоту, шины, флеш-память, регистры RCC и код
- Масштабирование напряжения ядра (VOS)Выбор напряжения ядра стабилизатором STM32 под нужную частоту