SYSCLK, HCLK и PCLK
В даташитах и коде STM32 постоянно встречаются SYSCLK, HCLK, PCLK1 и PCLK2. Это не разные генераторы, а один системный такт после разных делителей — и от того, какой из них питает блок, зависят расчёты UART, таймеров и АЦП.
Обновлено Редакция GAW
SYSCLK, HCLK и PCLK — названия, под которыми в документации STM32 фигурирует один и тот же системный такт после разных делителей блока RCC:
| Такт | Откуда | Кого тактирует |
|---|---|---|
| SYSCLK | переключатель источников: HSI, HSE, PLL (у L0 ещё MSI) | вход делителя AHB |
| HCLK | SYSCLK / HPRE | ядро, память, DMA, шина AHB |
| PCLK1 | HCLK / PPRE1 | периферия низкоскоростной шины APB1 |
| PCLK2 | HCLK / PPRE2 | периферия высокоскоростной шины APB2 |
| TIMxCLK | PCLKx, ×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). Ошибка в выборе такта — частая причина неверной скорости.
Источники
- 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
- 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
Нашли ошибку?
Смотрите также
- RCC (reset and clock control)Блок STM32, управляющий источниками тактов, делителями, включением периферии и сбросами
- Шины AHB и APBБыстрая шина ядра и шины периферии STM32
- Дерево тактированияПуть тактового сигнала от генератора до периферии
- Предделитель таймераPrescaler: делитель тактов перед счётчиком таймера
- SysTick24-битный таймер ядра Cortex-M для системного тика
- Тактирование STM32PLL под нужную частоту, шины, флеш-память, регистры RCC и код
- Скорость UARTUBRR, BRR, TH1 и ошибка скорости