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

SYSCLK, HCLK и PCLK

В даташитах и коде STM32 постоянно встречаются SYSCLK, HCLK, PCLK1 и PCLK2. Это не разные генераторы, а один системный такт после разных делителей — и от того, какой из них питает блок, зависят расчёты UART, таймеров и АЦП.

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

SYSCLK, HCLK и PCLK — названия, под которыми в документации STM32 фигурирует один и тот же системный такт после разных делителей блока RCC:

ТактОткудаКого тактирует
SYSCLKпереключатель источников: HSI, HSE, PLL (у L0 ещё MSI)вход делителя AHB
HCLKSYSCLK / HPREядро, память, DMA, шина AHB
PCLK1HCLK / PPRE1периферия низкоскоростной шины APB1
PCLK2HCLK / PPRE2периферия высокоскоростной шины APB2
TIMxCLKPCLKx, ×1, ×2 или ×4таймеры на этой шине

Пределы на примере STM32F7

По RM0385 (разд. 5.2, 5.3.3) SYSCLK и HCLK — до 216 МГц, APB2 — до 108 МГц, APB1 — до 54 МГц. Делители APB — 1, 2, 4, 8 или 16 (предделитель), и новое значение вступает через 1–16 тактов AHB. У STM32L0 все три шины ограничены 32 МГц в зависимости от диапазона напряжения ядра (RM0377, разд. 7.2).

Правило удвоения для таймеров

Частоту таймеров RCC выставляет сам. У STM32F7 при TIMPRE = 0:

  • делитель APB равен 1 — такт таймеров равен PCLKx;
  • делитель APB больше 1 — такт таймеров равен 2 × PCLKx.

При TIMPRE = 1 и делителе 1, 2 или 4 такт таймеров равен HCLK, иначе — 4 × PCLKx. Пример: HCLK 216 МГц, APB1 = HCLK/4 = 54 МГц — таймеры на APB1 считают на 108 МГц (наш расчёт).

Другие такты

FCLK — свободно бегущий такт ядра Cortex-M7; за подробностями RM0385 отсылает к техническому руководству ядра. SysTick тактируется от HCLK или HCLK/8. У части периферии — UART, I²C, LPTIM, АЦП — в RCC выбирают собственный источник, и тогда её частоту считают не от PCLK. Связи всех тактов — в калькуляторе тактирования STM32, скорость UART — в калькуляторе UART.

Частые вопросы

Чем HCLK отличается от SYSCLK?

SYSCLK — выход переключателя источников: HSI, HSE, PLL, у малопотребляющих семейств ещё MSI. HCLK — SYSCLK после делителя шины AHB (HPRE): им тактируются ядро, память, DMA и шина AHB. При делителе 1 они равны. Такты ожидания флеш-памяти выбирают именно по частоте HCLK.

Почему таймер на APB1 считает с удвоенной частотой?

Таково правило RCC: если делитель шины APB не равен 1, такт таймеров на этой шине — удвоенная частота шины. У STM32F7 при HCLK 216 МГц и APB1 = HCLK/4 = 54 МГц таймеры на APB1 получают 108 МГц. С битом TIMPRE = 1 множитель становится 4, но не выше HCLK.

От какого такта считать скорость UART?

От такта, который подаётся на сам блок: у обычного USART это PCLK шины, на которой он сидит, — PCLK2 или PCLK1, — если в RCC не выбран отдельный источник. У STM32L0 для USART1/2 и LPUART1 источник выбирают из SYSCLK, HSI16, LSE или PCLK, для I2C1 — из SYSCLK, HSI16 или PCLK (RM0377, разд. 7.2). Ошибка в выборе такта — частая причина неверной скорости.

Источники

  1. STMicroelectronics. RM0385: STM32F75xxx and STM32F74xxx advanced Arm-based 32-bit MCUs. Reference manual, Rev 9 — разд. 5.2: три источника SYSCLK — HSI, HSE, главный PLL; рис. 13 — SYSCLK до 216 МГц на шину AHB, ядро, память и DMA; частоты таймеров задаёт аппаратура: при TIMPRE = 0 и делителе APB 1 — TIMxCLK = PCLKx, иначе 2 × PCLKx; при TIMPRE = 1 и делителе 1, 2 или 4 — TIMxCLK = HCLK, иначе 4 × PCLKx; SysTick — от HCLK/8 или HCLK; FCLK — свободно бегущий такт Cortex-M7; разд. 5.3.3: PPRE2 — делитель высокоскоростной APB2, не выше 108 МГц, PPRE1 — низкоскоростной APB1, не выше 54 МГц, коды 0xx — без деления, 100 — ÷2, 101 — ÷4, 110 — ÷8, 111 — ÷16; новый делитель вступает через 1–16 тактов AHB; разд. 3.3.2 — число тактов ожидания выбирают по частоте HCLK
  2. STMicroelectronics. RM0377: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs. Reference manual, Rev 10 — разд. 7.2: четыре источника SYSCLK — HSI16, HSE, PLL, MSI; делители для AHB, APB1 и APB2; предел AHB, APB1 и APB2 — 32 МГц и зависит от диапазона напряжения; вся периферия тактируется от SYSCLK, кроме: АЦП — от APB или HSI16; LPUART1 и USART1/2 — SYSCLK, HSI16, LSE или PCLK; I2C1 — SYSCLK, HSI16 или PCLK; LPTIM — HSI16, LSE, LSI или PCLK

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