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

Как изменить частоту MSI на STM32L0?

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

MSI — RC-генератор, от которого STM32L0 стартует после сброса. Его частоты «некруглые», зато выбор диапазона позволяет сразу получить нужную скорость без PLL и тратить меньше энергии на медленных задачах. Что это за генератор, описано в термине «Генератор MSI».

Диапазоны MSIRANGE

MSIRANGE[2:0]Частота (около)Комментарий
00065,536 кГцдиапазон 0
001131,072 кГцдиапазон 1
010262,144 кГцдиапазон 2
011524,288 кГцдиапазон 3
1001,048 МГцдиапазон 4
1012,097 МГцпосле сброса
1104,194 МГцнаибольшая
111—запрещено

Поле занимает биты 15:13 регистра RCC_ICSCR, остальные биты регистра — калибровка MSI и HSI16, их при записи сохраняют.

// Switch MSI to range 6, about 4.194 MHz (RM0377, 7.3.2)
RCC->ICSCR = (RCC->ICSCR & ~RCC_ICSCR_MSIRANGE) | RCC_ICSCR_MSIRANGE_6;
while (!(RCC->CR & RCC_CR_MSIRDY)) { }   // wait until MSI is stable

Что ещё учесть

  • Диапазон напряжения ядра Range 3 допускает до 4,2 МГц, поэтому любой диапазон MSI работает и в самом экономичном режиме — подробнее в термине «Масштабирование напряжения».
  • После выхода из Standby диапазон снова 2,097 МГц, а после Stop он сохраняется — это удобно, если просыпаться нужно сразу на рабочей частоте.
  • Таймеры и UART считают от новой частоты, поэтому делители пересчитывают после смены диапазона; дерево тактов STM32 помогает проверить калькулятор тактирования STM32.

Чем меньше частота, тем меньше ток в рабочем режиме, но в паузах выгоднее всё-таки спать — список того, что мешает низкому току во сне, собран в ответе «Почему STM32L0 потребляет много тока в Stop». Таблицы семейства — на странице STM32L0.

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

Нужно ли менять такты ожидания флеш-памяти при переходе на 4,194 МГц?

Нет: по табл. 14 RM0377 даже в самом экономичном диапазоне напряжения ядра Range 3 микроконтроллер работает до 4,2 МГц без тактов ожидания, а MSI выше 4,194 МГц не поднимается. Такты ожидания понадобятся, когда система переходит на HSI16 или PLL.

Почему после выхода из Stop частота стала 2 МГц, хотя MSI я не трогал?

Вероятно, до сна система работала от HSI16 или PLL, а бит STOPWUCK в RCC_CFGR равен нулю: тогда ядро просыпается на MSI с тем диапазоном, который был записан в MSIRANGE, — после сброса это 2,097 МГц. Нужную частоту после пробуждения настраивают заново.

Можно ли подстроить MSI точнее?

Да, полем MSITRIM[7:0] в RCC_ICSCR: оно добавляется к заводской калибровке MSICAL и компенсирует уход от напряжения и температуры. Для точной подстройки частоту измеряют таймером относительно LSE, как описано в RM0377 в разделе об измерении частот через TIM21.

Источники

  1. STMicroelectronics. RM0377 Reference manual: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs, Rev 10 — разд. 7.2.3: семь диапазонов MSI — 65,536, 131,072, 262,144, 524,288 кГц, 1,048, 2,097 (по умолчанию) и 4,194 МГц; MSI — системная частота после сброса и выхода из Standby, после Stop её можно выбрать вместо HSI16; после Stop частота MSI не меняется; флаг готовности MSIRDY в RCC_CR; разд. 7.3.2: RCC_ICSCR, MSIRANGE[2:0] — биты 15:13, 000…110, 111 запрещено, MSITRIM — биты 31:24; разд. 7.3.3: STOPWUCK = 0 — пробуждение из Stop на MSI; табл. 14 — Range 3 допускает до 4,2 МГц
  2. STMicroelectronics. cmsis-device-l0, Include/stm32l053xx.h (commit 7b7ae8c) — RCC_ICSCR_MSIRANGE_Pos = 13, маска 0x0000E000; RCC_ICSCR_MSIRANGE_0 … RCC_ICSCR_MSIRANGE_6 = 0x0000 … 0xC000; RCC_CFGR_STOPWUCK — бит 15

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