Перейти к содержанию

Почему STM32 зависает после настройки частоты 72 МГц?

Обновлено Редакция GAW

После перехода на 72 МГц программа виснет, уходит в HardFault или сбрасывается, хотя на 8 МГц от HSI всё работало. Причина почти всегда в одном из трёх параметров, которые нужно выставить до переключения системной частоты.

Такты ожидания флеш-памяти

Флеш-память STM32F1 медленнее ядра. Сколько тактов ждать при чтении, задают биты LATENCY регистра FLASH_ACR:

Частота SYSCLKLATENCYТактов ожидания
до 24 МГц0000
24–48 МГц0011
48–72 МГц0102

Правильный порядок: сначала LATENCY = 2 и включённый буфер предвыборки, потом включение PLL и переключение на него. По RM0008 буфер предвыборки разрешено включать и выключать, только пока SYSCLK ниже 24 МГц. Нужное значение для любой частоты и семейства подскажет калькулятор тактов ожидания флеш STM32, а смысл параметра объясняет термин «такт ожидания».

Делители шин

Шина APB1 у STM32F1 работает не быстрее 36 МГц, APB2 — до 72 МГц. При SYSCLK = 72 МГц делитель APB1 должен быть 2. Если его забыть, периферия на APB1 — USART2, I2C, таймеры TIM2–TIM4 — работает вне спецификации: ядро при этом обычно не виснет, но возможны сбои периферии и неверные скорости.

Источник PLL

От внутреннего генератора HSI через PLL STM32F1 получает не больше 64 МГц, поэтому 72 МГц требуют кварца 8 МГц и множителя 9. Если кварц не раскачался, код застрянет ещё раньше — в ожидании флага HSERDY.

Проверить всю цепочку от кварца до шин поможет калькулятор тактирования STM32, а готовый код настройки тактирования на регистрах CMSIS, LL или HAL выдаёт генератор кода инициализации STM32.

Похожие вопросы

Почему без тактов ожидания STM32 иногда работает?

Флеш-память не успевает выдать данные за один такт при высокой частоте, но ошибки чтения могут проявиться не сразу и не на каждом экземпляре. Значение LATENCY из справочного руководства — обязательное, а не рекомендуемое.

Можно ли поставить 2 такта ожидания и на 24 МГц?

Можно: лишние такты ожидания не нарушают работу, только замедляют выполнение кода из флеш-памяти. Опасна обратная ошибка — тактов меньше, чем требует таблица для текущей частоты.

Как проверить, что STM32 действительно перешёл на PLL?

Прочитать биты SWS в регистре RCC_CFGR: значение 10 означает, что системная частота берётся от PLL, 01 — от HSE, 00 — от HSI. Переключение задают битами SW, а SWS показывают, что оно уже произошло.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — регистр FLASH_ACR (с. 60): LATENCY 000 — 0 тактов ожидания при SYSCLK до 24 МГц, 001 — 1 такт при 24–48 МГц, 010 — 2 такта при 48–72 МГц; буфер предвыборки включают и выключают только при SYSCLK ниже 24 МГц; 7.2 — APB1 ограничена 36 МГц, APB2 работает до 72 МГц; предупреждение у битов PPRE1: не превышать 36 МГц; рис. 8 — от HSI через PLL не выше 64 МГц; биты SWS в RCC_CFGR показывают текущий источник SYSCLK
  2. STMicroelectronics. DS5319 Rev 20. STM32F103x8, STM32F103xB datasheet — наибольшая частота 72 МГц; выход PLL 16–72 МГц, время захвата PLL до 200 мкс; ток потребления флеш-памяти в режиме чтения указан для 72 МГц с двумя тактами ожидания

Нашли ошибку?