RCC (reset and clock control)
Почти любая программа для STM32 начинается с RCC: без бита в его регистре периферийный блок не получает такт и не отвечает, а от его настроек зависят частота ядра и всех шин. Заодно RCC помнит, почему микроконтроллер последний раз перезапустился.
Обновлено Редакция GAW
RCC (reset and clock control) — блок STM32, который управляет сбросами и тактированием всего микроконтроллера. В справочных руководствах ему отведена отдельная глава (RM0377, гл. 7; RM0385, гл. 5), а его регистры есть в каждом семействе — пример на странице регистров RCC STM32F4.
Что делает RCC
- Источники такта. Включает и выключает генераторы: HSE, HSI, LSE, LSI, у семейств малого потребления — MSI, и сообщает об их готовности. Каждый источник включается отдельно, чтобы не тратить энергию на ненужные.
- PLL. Настраивает умножитель частоты и его делители.
- SYSCLK и шины. Выбирает источник системного такта (у STM32L0 — HSI16, HSE, PLL или MSI; у STM32F7 — HSI, HSE или PLL) и задаёт делители шин AHB и APB — см. SYSCLK, HCLK и PCLK.
- Такты периферии. Биты в регистрах RCC_AHBxENR и RCC_APBxENR включают такт каждого блока; у части блоков — UART, I²C, АЦП, LPTIM — RCC выбирает ещё и отдельный источник.
- Сброс. Формирует системный сброс и сброс отдельных блоков, а флаги причины сброса хранит в RCC_CSR.
Причины системного сброса у STM32L0 (RM0377, разд. 7.1.1)
Низкий уровень на NRST, сторожевые таймеры WWDG и IWDG, программный сброс через SYSRESETREQ, вход в Standby или Stop при соответствующих опционных байтах, перезагрузка опционных байтов, выход из Standby и нарушение защиты Firewall.
Частоты таймеров и SysTick
RCC задаёт и неочевидные частоты. У STM32F7 таймеры на шине APB тактируются удвоенной частотой шины, если её делитель не равен 1, а SysTick может работать от HCLK/8 (RM0385, разд. 5.2). Схема всех связей — в термине дерево тактирования, расчёт — в калькуляторе тактирования STM32.
Частые вопросы
Почему периферия STM32 не работает после записи в её регистры?
Чаще всего не включён её такт в RCC. После сброса такты почти всей периферии выключены, и пока бит в регистре RCC_AHBxENR или RCC_APBxENR не установлен, блок не реагирует на запись. Поэтому первая строка инициализации GPIO или UART — включение такта порта или интерфейса в RCC.
Как узнать, почему перезапустился STM32?
Прочитать флаги причины сброса в регистре RCC_CSR: низкий уровень на NRST, сторожевые таймеры IWDG и WWDG, программный сброс, сброс по питанию, у STM32L0 — ещё загрузчик опционных байтов и Firewall. Флаги сбрасывают битом RMVF, иначе после следующего сброса они накопятся.
Что настраивают в RCC при запуске?
Включают нужный генератор и ждут его готовности, настраивают PLL, задают делители шин AHB и APB, выбирают источник SYSCLK и включают такты периферии. Перед повышением частоты увеличивают число тактов ожидания флеш-памяти. Удобно считать параметры в калькуляторе тактирования STM32.
Источники
- STMicroelectronics. RM0377: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs. Reference manual, Rev 10 — гл. 7 Reset and clock control (RCC); разд. 7.1: три вида сброса — системный, по питанию и домена RTC; системный сброс: низкий уровень на NRST, WWDG, IWDG, программный (SYSRESETREQ в AIRCR), сброс при входе в Standby или Stop по опционным байтам, сброс загрузчика опционных байтов, выход из Standby, защита Firewall; причина — флаги в RCC_CSR, они сбрасываются записью в бит RMVF или сбросом по питанию; разд. 7.2: четыре источника SYSCLK — HSI16, HSE, PLL, MSI; MSI 2,1 МГц после сброса; вторичные — LSI 37 кГц (IWDG, RTC, LPTIM) и LSE 32,768 кГц (RTC, LPTIM, USART); каждый источник включается и выключается отдельно; делители AHB и APB1/APB2, предел 32 МГц зависит от диапазона напряжения; периферия тактируется от SYSCLK, кроме АЦП, LPUART1, USART1/2, I2C1 и LPTIM, у которых свой выбор источника; разд. 6.3.4 — такты блоков включают и выключают регистрами RCC_APBxENR и RCC_AHBENR
- STMicroelectronics. RM0385: STM32F75xxx and STM32F74xxx advanced Arm-based 32-bit MCUs. Reference manual, Rev 9 — разд. 5.2: три источника SYSCLK — HSI, HSE, главный PLL; LSI 32 кГц для IWDG и RTC, LSE 32,768 кГц для RTC; рис. 13 — дерево тактов; RCC подаёт на SysTick такт HCLK/8; частоты таймеров: при делителе APB 1 — PCLKx, иначе 2 × PCLKx (TIMPRE = 0); разд. 5.3.2–5.3.3 — выход PLL (PLLP) не выше 216 МГц, APB2 (PPRE2) не выше 108 МГц, APB1 (PPRE1) не выше 54 МГц
Нашли ошибку?
Смотрите также
- Дерево тактированияПуть тактового сигнала от генератора до периферии
- HSE, HSI, LSE и LSIЧетыре тактовых генератора STM32: какой для чего
- PLLУмножитель частоты: ФАПЧ в тактировании МК
- SYSCLK, HCLK и PCLKСистемный такт STM32 и такты шин AHB и APB после делителей
- Флаги причины сбросаКак узнать, почему перезапустился микроконтроллер
- Система контроля тактирования (CSS)Обнаружение отказа кварца HSE и переход на HSI
- Тактирование STM32PLL под нужную частоту, шины, флеш-память, регистры RCC и код