Тактирование STM32 — цепочка от генератора до ядра и периферии: кварцевый генератор HSE или внутренний HSI, предделитель и умножитель PLL, затем шина AHB с ядром и памятью и шины APB с периферией. Неверный множитель — и ядро работает за пределами допустимой частоты, лишний такт ожидания — и программа медленнее, недостающий — и она падает. Калькулятор проверяет каждую настройку по справочному руководству своей линейки.
Коротко
- F1: кварц 4–16 МГц, PLL ×2…×16, до 72 МГц; APB1 — до 36 МГц; для USB PLL должен дать 48 или 72 МГц.
- F4: вход VCO 1–2 МГц (лучше 2 МГц), VCO 100–432 МГц; SYSCLK = VCO / P, USB = VCO / Q; F407 — до 168 МГц, F429 — до 180 МГц.
- F0 и G0: до 48 и 64 МГц; у G0 SYSCLK берётся с выхода R: VCO / R.
- Таймеры: при делителе APB больше 1 частота таймеров вдвое выше частоты шины.
- Флеш-память: число тактов ожидания растёт с частотой, у F4 — ещё и при пониженном питании.
Как пользоваться
- Выберите линейку. Пределы частот и устройство PLL у них разные: STM32F103 и STM32F407 считаются по разным руководствам.
- Выберите генератор: HSE — кварц на плате (частоту впишите), HSI — внутренний RC-генератор. У STM32F042, F072 и F091 есть ещё HSI48.
- Впишите нужную частоту SYSCLK. Калькулятор переберёт все допустимые настройки PLL и покажет ближайшую частоту, а среди равных выберет ту, что даёт 48 МГц для USB и — у F4 — 2 МГц на входе VCO. Другие настройки с той же частотой собраны в таблицу под схемой.
- Делители шин по умолчанию — самые маленькие в пределах линейки; их можно задать вручную. У F4 выберите напряжение питания, у G0 — диапазон напряжения ядра.
Справа — частоты ядра, шин, таймеров, USB и АЦП и число тактов ожидания. Ниже — цепочка тактирования, значения регистров RCC и функция инициализации на регистрах с именами из заголовочных файлов CMSIS. Все настройки хранятся в адресе страницы — ссылкой можно поделиться.
Как устроена цепочка тактирования
После сброса STM32 работает от внутреннего генератора HSI. Чтобы разогнать ядро, программа включает кварцевый генератор HSE, настраивает PLL, увеличивает такты ожидания флеш-памяти, ждёт захвата PLL и только потом переключает на него системную частоту SYSCLK. Дальше SYSCLK делится делителем AHB — это частота HCLK ядра, памяти и DMA, — а от HCLK своими делителями тактируются шины APB.
Пределы шин и генераторов у каждой линейки свои:
| Линейка | SYSCLK, HCLK | APB1 | APB2 | HSI | Кварц HSE | PLL | Документ |
|---|---|---|---|---|---|---|---|
| STM32F030x4/x6/x8 | до 48 МГц | до 48 МГц | — | 8 МГц | 4–32 МГц | ×2…×16 | RM0360 Rev 5 |
| STM32F030xC, STM32F070 | до 48 МГц | до 48 МГц | — | 8 МГц | 4–32 МГц | ×2…×16 | RM0360 Rev 5 |
| STM32F031, F038, F051, F058 | до 48 МГц | до 48 МГц | — | 8 МГц | 4–32 МГц | ×2…×16 | RM0091 Rev 10 |
| STM32F042, F048, F072, F078, F091, F098 | до 48 МГц | до 48 МГц | — | 8 МГц | 4–32 МГц | ×2…×16 | RM0091 Rev 10 |
| STM32F100 (value line) | до 24 МГц | до 24 МГц | до 24 МГц | 8 МГц | 4–24 МГц | ×2…×16 | RM0041 Rev 6 |
| STM32F101 (access line) | до 36 МГц | до 36 МГц | до 36 МГц | 8 МГц | 4–16 МГц | ×2…×16 | RM0008 Rev 21 |
| STM32F102 (USB access line) | до 48 МГц | до 36 МГц | до 48 МГц | 8 МГц | 4–16 МГц | ×2…×16 | RM0008 Rev 21 |
| STM32F103 (performance line) | до 72 МГц | до 36 МГц | до 72 МГц | 8 МГц | 4–16 МГц | ×2…×16 | RM0008 Rev 21 |
| STM32F105, F107 (connectivity line) | до 72 МГц | до 36 МГц | до 72 МГц | 8 МГц | 3–25 МГц | ×4…×9, ×6,5 | RM0008 Rev 21 |
| STM32F401 | до 84 МГц | до 42 МГц | до 84 МГц | 16 МГц | 4–26 МГц | ÷M, ×N, ÷P, ÷Q | RM0368 Rev 6 |
| STM32F405, F407, F415, F417 | до 168 МГц | до 42 МГц | до 84 МГц | 16 МГц | 4–26 МГц | ÷M, ×N, ÷P, ÷Q | RM0090 Rev 22 |
| STM32F411 | до 100 МГц | до 50 МГц | до 100 МГц | 16 МГц | 4–26 МГц | ÷M, ×N, ÷P, ÷Q | RM0383 Rev 4 |
| STM32F427, F429, F437, F439 | до 180 МГц | до 45 МГц | до 90 МГц | 16 МГц | 4–26 МГц | ÷M, ×N, ÷P, ÷Q | RM0090 Rev 22 |
| STM32G031, G041, G051, G061, G071, G081, G0B1, G0C1 | до 64 МГц | до 64 МГц | — | 16 МГц | 4–48 МГц | ÷M, ×N, ÷R | RM0444 Rev 6 |
| STM32G030, G050, G070, G0B0 | до 64 МГц | до 64 МГц | — | 16 МГц | 4–48 МГц | ÷M, ×N, ÷R | RM0454 Rev 5 |
PLL STM32F0 и STM32F1: умножитель
У F0 и F1 PLL — умножитель. Частота входа делится предделителем, затем умножается:
Множитель PLLMUL — от 2 до 16. У STM32F101, F102 и F103 вход PLL — HSI / 2 = 4 МГц или HSE, деленный на 1 или 2 (бит PLLXTPRE), а выход ограничен 72 МГц. У F105 и F107 множители ×4…×9 и ×6,5, а HSE делится предделителем PREDIV1 от 1 до 16. У F0 выход PLL должен быть в пределах 16–48 МГц, у F100 — 16–24 МГц.
USB у STM32F102 и F103 тактируется от PLL через делитель USBPRE: ÷ 1 или ÷ 1,5. Поэтому для USB PLL должен выдавать 48 или 72 МГц — других вариантов нет. Частота АЦП делится от PCLK2 на 2, 4, 6 или 8 и не должна превышать 14 МГц: на 72 МГц наименьший подходящий делитель — 6, это 12 МГц.
PLL STM32F4: делители M, N, P и Q
У F4 PLL устроен как синтезатор частоты: вход делится на M, генератор VCO работает на частоте в N раз выше, а выходы делят её на P и Q.
Ограничения RM0090: M — от 2 до 63, а частота на входе VCO — от 1 до 2 МГц, и для меньшего джиттера рекомендовано 2 МГц; N — от 50 до 432, VCO — от 100 до 432 МГц (у F401 — от 192 МГц); P — 2, 4, 6 или 8; Q — от 2 до 15. USB OTG FS требует ровно 48 МГц, SDIO и генератор случайных чисел — не больше 48 МГц.
Выше 168 МГц STM32F427 и F429 работают только в режиме over-drive регулятора напряжения: его включают, когда PLL уже настроен, но ещё не выбран системной частотой. STM32F411 выше 84 МГц требует масштаба регулятора scale 1. Калькулятор добавляет эти шаги в код сам.
PLL STM32G0: делители M, N и R
У G0 похожий синтезатор, но системная частота берётся с выхода R:
M — от 1 до 8, а частота после него — от 2,66 до 16 МГц; N — от 8 до 86; VCO — от 96 до 344 МГц у G0x1 (RM0444) и от 64 до 344 МГц у G0x0 (RM0454); R — от 2 до 8, выход — не больше 64 МГц. От HSI16 максимальные 64 МГц дают M = 1, N = 8, R = 2: VCO на 128 МГц. Выходы P и Q тактируют часть периферии; калькулятор ставит в них допустимые делители, но не включает их. В диапазоне Range 2 — режиме пониженного напряжения ядра — частота системы ограничена 16 МГц, а VCO — 128 МГц.
Шины и таймеры
Делители AHB — 1, 2, 4, 8, 16, 64, 128, 256 и 512, делители APB — 1, 2, 4, 8 и 16. Таймеры получают частоту своей шины APB, если её делитель равен 1, и удвоенную — при любом другом делителе. Поэтому на STM32F407 таймеры шины APB1 работают на 84 МГц при самой шине на 42 МГц, а таймеры APB2 — на 168 МГц. От частоты таймера считают предделитель и период в калькуляторе таймера, от частоты шины — делитель скорости в калькуляторе UART.
Такты ожидания флеш-памяти
Флеш-память медленнее ядра: на высокой частоте процессор ждёт её несколько тактов. Число тактов ожидания задаёт поле LATENCY регистра FLASH_ACR. Мало тактов — команды читаются с ошибками, много — ядро простаивает. Таблицы — по справочным руководствам; верхняя граница каждой строки включительно.
STM32F1 (RM0008), STM32F0 (RM0091, RM0360) — от частоты SYSCLK, F100 тактов ожидания не имеет:
| Такты ожидания (LATENCY) | Частота |
|---|---|
| 0 | до 24 МГц |
| 1 | 24–48 МГц |
| 2 | 48–72 МГц |
STM32F405 и F407 (RM0090, таблица 11) — от частоты HCLK и напряжения питания:
| Такты ожидания (LATENCY) | 2,7–3,6 В | 2,4–2,7 В | 2,1–2,4 В | 1,8–2,1 В |
|---|---|---|---|---|
| 0 | до 30 МГц | до 24 МГц | до 22 МГц | до 20 МГц |
| 1 | 30–60 МГц | 24–48 МГц | 22–44 МГц | 20–40 МГц |
| 2 | 60–90 МГц | 48–72 МГц | 44–66 МГц | 40–60 МГц |
| 3 | 90–120 МГц | 72–96 МГц | 66–88 МГц | 60–80 МГц |
| 4 | 120–150 МГц | 96–120 МГц | 88–110 МГц | 80–100 МГц |
| 5 | 150–168 МГц | 120–144 МГц | 110–132 МГц | 100–120 МГц |
| 6 | — | 144–168 МГц | 132–154 МГц | 120–140 МГц |
| 7 | — | — | 154–168 МГц | 140–160 МГц |
STM32G0x1 (RM0444) — от частоты HCLK и диапазона напряжения ядра:
| Такты ожидания (LATENCY) | Range 1 | Range 2 |
|---|---|---|
| 0 | до 24 МГц | до 8 МГц |
| 1 | 24–48 МГц | 8–16 МГц |
| 2 | 48–64 МГц | — |
Такты ожидания увеличивают до перехода на высокую частоту и уменьшают только после перехода на низкую. При питании STM32F4 ниже 2,1 В буфер предвыборки должен быть выключен — в коде калькулятора он тогда не включается.
Код инициализации
Функция clock_init() повторяет порядок из справочных руководств: включает генератор и ждёт его готовности, ставит такты ожидания, записывает делители и настройки PLL, включает PLL и ждёт захвата, затем переключает SYSCLK и ждёт подтверждения в поле SWS. В конце она записывает новую частоту в переменную SystemCoreClock, от которой считают задержки и скорость интерфейсов библиотеки. Код рассчитан на запуск сразу после сброса, когда SYSCLK — от HSI, а PLL выключен.
Ограничения
- Второй PLL STM32F105 и F107 (PLL2 и PLL3 для Ethernet и I2S) не моделируется: PREDIV1 тактируется прямо от HSE.
- STM32F410, F412, F413, F446 и F469 и линейки F2, F3, F7, G4, H7, L0–L5 пока не поддерживаются.
- Внешний тактовый сигнал вместо кварца (режим bypass) отдельно не рассматривается: пределы частоты HSE взяты для кварца.
- Частоты периферии с собственным выбором источника (USART, I2C, АЦП у F0 и G0) не считаются: они задаются в регистрах выбора тактирования периферии.
- Калькулятор не проверяет ограничения корпусов и температурных исполнений — сверяйтесь с даташитом своего микроконтроллера.
Частые вопросы
Как получить 72 МГц на STM32F103 от кварца 8 МГц?
Включите HSE и умножьте его в PLL на 9: PLLSRC = 1 (HSE), PLLXTPRE = 0 (без деления), PLLMUL = 0111. Шина APB1 не может работать быстрее 36 МГц, поэтому её делитель — 2, APB2 остаётся на 72 МГц. Флеш-памяти на 72 МГц нужно два такта ожидания (LATENCY = 2), USB получает 72 / 1,5 = 48 МГц, АЦП — 72 / 6 = 12 МГц. Регистр RCC_CFGR после переключения — 0x001D8402.
Как рассчитать PLL STM32F4 на 168 МГц?
С кварцем 8 МГц: PLLM = 4 даёт на входе VCO рекомендуемые 2 МГц, PLLN = 168 — VCO 336 МГц, PLLP = 2 — SYSCLK 168 МГц, PLLQ = 7 — ровно 48 МГц для USB, SDIO и генератора случайных чисел. APB1 делится на 4 (42 МГц), APB2 — на 2 (84 МГц). При питании 2,7–3,6 В флеш-памяти нужно 5 тактов ожидания. RCC_PLLCFGR = 0x07402A04.
Почему таймеры работают на удвоенной частоте шины APB?
Так устроено тактирование таймеров у STM32F0, F1, F4 и G0: если делитель шины APB равен 1, таймеры получают частоту шины, а при любом другом делителе — удвоенную. На STM32F103 с APB1 ÷ 2 шина работает на 36 МГц, а таймеры TIM2–TIM4 — на 72 МГц. Это нужно учитывать при расчёте предделителя и периода таймера.
Сколько тактов ожидания флеш-памяти ставить?
Это зависит от частоты — у F0 и F1 от SYSCLK, у F4 и G0 от HCLK — и, у STM32F4, от напряжения питания. STM32F1: 0 тактов до 24 МГц, 1 — до 48, 2 — до 72 МГц. STM32F0: 0 до 24 МГц, 1 до 48. STM32F407 при 2,7–3,6 В — по такту на каждые 30 МГц, 5 тактов на 168 МГц. Такты ожидания увеличивают до повышения частоты и уменьшают после её снижения.
Можно ли получить 48 МГц для USB на STM32F429 при 180 МГц?
Нет. Для 180 МГц VCO должен работать на 360 МГц с PLLP = 2 (с PLLP = 4 нужно 720 МГц, а VCO ограничен 432 МГц), а 360 не делится на 48 нацело: PLLQ = 7,5 недопустим. Если нужен USB, выберите 168 МГц: VCO 336 МГц, PLLQ = 7.
Можно ли обойтись без кварца?
Да, если не нужна точная частота: внутренний генератор HSI откалиброван на заводе с погрешностью 1 % при 25 °C, и от него можно запустить PLL. Для USB, CAN и точных интервалов времени нужен кварц. STM32F042, F072 и F091 имеют HSI48, но без подстройки системой CRS его погрешность — около 3 % при 25 °C.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — раздел RCC: кварц 4–16 МГц (3–25 МГц у F105/F107), PLL ×2…×16 с выходом до 72 МГц, AHB и APB2 до 72 МГц, APB1 до 36 МГц, АЦП до 14 МГц, USB — PLL на 48 или 72 МГц и USBPRE, биты RCC_CFGR; раздел флеш-памяти — LATENCY 0/1/2 до 24/48/72 МГц
- STMicroelectronics. RM0041 Rev 6. Reference manual: STM32F100xx advanced Arm-based 32-bit MCUs — кварц 4–24 МГц, AHB и обе шины APB до 24 МГц, выход PLL 16–24 МГц, PREDIV1 ÷1…16, флеш без тактов ожидания
- STMicroelectronics. RM0360 Rev 5. Reference manual: STM32F030x4/x6/x8/xC and STM32F070x6/xB — кварц 4–32 МГц, выход PLL 16–48 МГц, входы PLL по устройствам (PLLSRC), LATENCY 0/1 до 24/48 МГц
- STMicroelectronics. RM0091 Rev 10. Reference manual: STM32F0x1/STM32F0x2/STM32F0x8 — глава 6 RCC: HSI 8 МГц, HSI48 у F04x/F07x/F09x, PREDIV ÷1…16, PLL ×2…×16 с выходом 16–48 МГц, PLLSRC, коды PLLMUL, PPRE и HPRE, удвоение частоты таймеров; глава 3 — такты ожидания флеш-памяти
- STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — главы 6 и 7 RCC: кварц 4–26 МГц, HSI 16 МГц, PLLM 2…63 с входом VCO 1–2 МГц, PLLN 50…432, VCO 100–432 МГц, PLLP 2/4/6/8, PLLQ 2…15 для 48 МГц, пределы шин 168/84/42 и 180/90/45 МГц; таблицы 11 и 12 — такты ожидания по напряжению питания; режим over-drive для 180 МГц
- STMicroelectronics. RM0368 Rev 6 (STM32F401xB/C/D/E) и RM0383 Rev 4 (STM32F411xC/E) — F401: VCO 192–432 МГц, до 84 МГц, таблица 6 тактов ожидания; F411: до 100 МГц, APB1 до 50 МГц, таблица 5 тактов ожидания, масштаб регулятора VOS
- STMicroelectronics. RM0444 Rev 6 (STM32G0x1) и RM0454 Rev 5 (STM32G0x0) — кварц 4–48 МГц, вход PLL после ÷M 2,66–16 МГц, PLLN 8…86, VCO 96–344 МГц (у G0x0 — 64–344 МГц), PLLR 2…8 и PLLRCLK до 64 МГц, таблица 36 — пределы в Range 1 и Range 2, HSIDIV, биты RCC_PLLCFGR, такты ожидания по диапазону
- STMicroelectronics. STM32CubeF0, STM32CubeF1, STM32CubeF4, STM32CubeG0: шаблоны проектов (Projects/…/Templates, SystemClock_Config) — второй источник для проверки: F103 от HSI на 64 МГц, F411 на 100 МГц, F429 на 180 МГц с over-drive, F072 от HSI48 на 48 МГц, G071 на 56 МГц — делители, LATENCY и пределы совпадают с расчётом
- STMicroelectronics. Заголовочные файлы CMSIS: cmsis_device_f0, cmsis_device_f1, cmsis_device_f4, cmsis_device_g0 — имена регистров и битов в сгенерированном коде: RCC_CR_HSEON, RCC_CFGR_SWS, FLASH_ACR_LATENCY, PWR_CR_ODEN, RCC_PLLCFGR_PLLREN и другие
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/stm32-clock/" title="Тактирование STM32: PLL, шины и такты ожидания" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/stm32-clock/">Тактирование STM32: PLL, шины и такты ожидания</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?