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:
HSI/HSE/PLL -> SYSCLK -> AHB -> HCLK -> APB1/APB2 -> PCLKx -> периферияИсточники:
- HSI - внутренний RC, удобен, но менее точен.
- HSE - внешний кварц/clock, предпочтителен для CAN/USB/точного UART.
- LSI/LSE - низкочастотные источники для watchdog/RTC.
Формулы таймера:
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. Типичные ошибки
- Считать, что SYSCLK равен частоте всей периферии.
- Забыть __HAL_RCC_xxx_CLK_ENABLE().
- Неверно указать HSE_VALUE.
- Не учитывать Flash latency и voltage scaling.
- Использовать HAL_GetTick() для точных измерений.
- Не документировать TIMxCLK/UARTCLK/ADCCLK/FDCANCLK.
5. Практическое задание
Создай STM32_CLOCK_TREE_POLICY.md:
# 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:
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.
Задание
Для документированного 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.