1. Тема дня

STM32 clock tree: HSI/HSE, PLL, SYSCLK, HCLK, APB1/APB2, kernel clocks, prescaler’ы и реальные частоты периферии. Главная мысль: если не знаешь частоту периферии, не знаешь её реальное поведение.

2. Зачем это нужно в проектах

Clock tree влияет на baudrate UART/RS-485, bit timing CAN/FDCAN, sampling time ADC, период TIM/PWM, input capture timestamp, HIL timing и watchdog timeout.

3. Теория

Clock tree:

text
HSI/HSE/PLL -> SYSCLK -> AHB -> HCLK -> APB1/APB2 -> PCLKx -> периферия

Источники:

  • HSI - внутренний RC, удобен, но менее точен.
  • HSE - внешний кварц/clock, предпочтителен для CAN/USB/точного UART.
  • LSI/LSE - низкочастотные источники для watchdog/RTC.

Формулы таймера:

text
timer_counter_freq = TIMxCLK / (PSC + 1)
update_freq = timer_counter_freq / (ARR + 1)

Типовая ловушка STM32: если APB prescaler > 1, TIMxCLK часто равен 2 * PCLKx. Точное правило смотри в Reference Manual конкретной серии. UART baudrate считается от peripheral/kernel clock. CAN/FDCAN требует clock, prescaler, time quanta, sample point и SJW. ADC зависит от ADC kernel clock, sampling time и source impedance. CubeMX - удобный калькулятор, но не источник требований. Требования и итоговые частоты надо сохранять в документации проекта.

4. Типичные ошибки

  1. Считать, что SYSCLK равен частоте всей периферии.
  2. Забыть __HAL_RCC_xxx_CLK_ENABLE().
  3. Неверно указать HSE_VALUE.
  4. Не учитывать Flash latency и voltage scaling.
  5. Использовать HAL_GetTick() для точных измерений.
  6. Не документировать TIMxCLK/UARTCLK/ADCCLK/FDCANCLK.

5. Практическое задание

Создай STM32_CLOCK_TREE_POLICY.md:

markdown
# STM32 clock tree policy
Required:
- MCU exact part number
- HSE/HSI frequency
- PLL configuration
- SYSCLK, HCLK, PCLK1/PCLK2
- TIMxCLK for every timer
- UART kernel clock
- ADC kernel clock
- CAN/FDCAN kernel clock
- SysTick, RTC, watchdog source

Добавь runtime-команду clock:

c
printf("SystemCoreClock=%lu\r\n", SystemCoreClock);
printf("HCLK=%lu\r\n", HAL_RCC_GetHCLKFreq());
printf("PCLK1=%lu\r\n", HAL_RCC_GetPCLK1Freq());
printf("PCLK2=%lu\r\n", HAL_RCC_GetPCLK2Freq());

6. Что почитать или попробовать дальше

STM32 HAL RCC docs, Reference Manual выбранной серии, CubeMX Clock Configuration, STM32 TIM docs.

PCLK равен 40 MHz, APB prescaler > 1. Можно ли без Reference Manual утверждать, что TIMxCLK = 80 MHz?

Задание

Для документированного TIMxCLK = 80 MHz заданы PSC = 79 и ARR = 999. Найдите частоту counter и update. Как изменится update, если PSC случайно станет 80?

Критерии самопроверки: Покажите делители +1, единицы и результат ошибочного PSC.

Показать ответ автора

counter = 80000000/(79+1) = 1000000 Hz; update = 1000000/(999+1) = 1000 Hz. При PSC=80 update = 80000000/(81×1000) ≈ 987.654 Hz. Используйте PSC+1 и ARR+1.