Как изменить частоту MSI на STM32L0?
Обновлено Редакция GAW
MSI — RC-генератор, от которого STM32L0 стартует после сброса. Его частоты «некруглые», зато выбор диапазона позволяет сразу получить нужную скорость без PLL и тратить меньше энергии на медленных задачах. Что это за генератор, описано в термине «Генератор MSI».
Диапазоны MSIRANGE
| MSIRANGE[2:0] | Частота (около) | Комментарий |
|---|---|---|
| 000 | 65,536 кГц | диапазон 0 |
| 001 | 131,072 кГц | диапазон 1 |
| 010 | 262,144 кГц | диапазон 2 |
| 011 | 524,288 кГц | диапазон 3 |
| 100 | 1,048 МГц | диапазон 4 |
| 101 | 2,097 МГц | после сброса |
| 110 | 4,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.
Источники
- 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 МГц
- 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
Нашли ошибку?
Смотрите также
- Генератор MSI (multispeed internal)Внутренний RC-генератор STM32 с выбираемой частотой для малого потребления
- STM32L0Cortex-M0+, до 32 МГц, малое потребление: L010, L0x1, L0x2 с USB, L0x3 с ЖКИ — линейки и распиновки
- Тактирование STM32PLL под нужную частоту, шины, флеш-память, регистры RCC и код
- Масштабирование напряжения ядра (VOS)Выбор напряжения ядра стабилизатором STM32 под нужную частоту
- Почему STM32L0 потребляет много тока в режиме Stop?DBG_STOP, ULP = 0, LPSDSR = 0, цифровые входы и висящие флаги EXTI