Перейти к содержанию

Как настроить PLL1 STM32H743 на 480 МГц?

Обновлено Редакция GAW

PLL1 у STM32H743 тактирует ядро, и у него больше ограничений, чем у PLL младших STM32: отдельный предделитель DIVM1, диапазон частоты на входе PLL1RGE, два диапазона VCO и три выхода P, Q, R. Общий принцип умножителя описан в термине «PLL».

Расчёт от кварца 25 МГц

fsys=fHSEDIVM1⋅DIVN1DIVP1=255⋅1922=480 МГцf_{sys} = \frac{f_{HSE}}{DIVM1} \cdot \frac{DIVN1}{DIVP1} = \frac{25}{5} \cdot \frac{192}{2} = 480 \text{ МГц}
ПараметрЗначениеПредел по RM0433
Вход PLL, ref1_ck25 / 5 = 5 МГц1–16 МГц, PLL1RGE = 10 (4–8 МГц)
VCO5 × 192 = 960 МГц192–960 МГц при PLL1VCOSEL = 0
Выход P, ядро960 / 2 = 480 МГцядро до 480 МГц
Шина AXI480 / 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

  1. Поднять напряжение ядра до VOS0 по порядку из разд. 6.6.2 RM0433: выбрать в PWR_D3CR уровень VOS1 и дождаться VOSRDY, включить тактирование SYSCFG (бит SYSCFGEN в RCC_APB4ENR), установить ODEN в SYSCFG_PWRCR и снова дождаться VOSRDY. Перед Stop и Standby VOS0 выключают. Подробнее — FAQ страницы STM32H7 и термин «Масштабирование напряжения».
  2. Поставить делитель HPRE на 2, чтобы шина AXI не превысила 240 МГц, и делители APB.
  3. Записать 4 такта ожидания и WRHIGHFREQ = 10 — по таблице из ответа «Сколько тактов ожидания FLASH нужно STM32H743».
  4. Только после этого выбрать 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.

Источники

  1. 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
  2. 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

Нашли ошибку?