Режимы низкого энергопотребления

При подачи питания микроконтроллер запускается в нормальном режиме (англ. Run Mode). Потребление МК зависит от таких параметров как:

Datasheet, Table 13. Maximum current consumption in Run mode, code with data processing running from Flash, p. 42

Режим пониженного энергопотребления в нашем устройстве не имеет практического смысла. Во-первых, потребление МК много меньше потребления светодиодной матрицы. Во-вторых, мы используем LDO, эффективность которого оставляет желать лучшего, — собственный потребляемый ток (англ. Quiescent current) составляет от 5 до 10 мА, что сравнимо с потреблением всего МК. По этой причине рассматривайте данный раздел исключительно из академических соображений. Подробное описание всех режимов можно найти в документе AN2629.

Вся суть режима низкого потребления сводится к отключению на некоторое время не нужных функций. Нет потребителя — нет потребления.

low power mode

В зависимости от того, как и что будет отключено в stm32f103c8 предусмотрено три2 режима с пониженным энергопотреблением: остановки (англ. Stop), ожидания (англ. Standby) и сна (англ. Sleep).

Режим сна

В режиме сна тактирование ядра приостанавливается, а вот вся периферия, в том числе та, что относится к ядру продолжает работать (NVIC, SysTick). Вход в этот режим осуществляется через вызов инструкций WFI (Wait For Interrupt) или WFE (Wait For Event). В CMSIS подержатся две функции-обёртки.

Состояние всех портов ввода/вывода сохраняются такими, какие они были в нормальном режиме.

Механизм погружения в сон зависит от состояния состояние бита SLEEPONEXIT регистра ядра SCR (System Control Register). Если в нём хранится 0 на момент вызова, то МК отправляется в лапы Морфея сразу, но если там записано 1, то переход будет осуществлён только отработки всех прерываний.

Если была вызвана инструкция WFI, то выход из спящего режима происходит по любому прерыванию. Если же была вызвана WFE, то выход происходит по событию. Создать такое событие можно включив в настройках нужной периферии генерацию оного, но не разрешив прерывание от него. В бит SEVONPEND регистра SCR необходимо записать 1. При этом, по выходу из сна, нужно вручную сбросить флаги (pending bits). Другой способ настроить прерывание — сконфигурировать модуль EXTI.

После выхода из данного режима, программа продолжает работать с места, где была вызвана инструкция WFI/WFE. Время выхода минимально, по отношению к другим режимам.

Режим остановки

Режим остановки — это режим глубокого сна (основан на возможностях ядра Cortex, бит SLEEPDEEP). В нём всё тактирование отключается (PLL, HSI/HSE), питание подаётся только на оперативную память (SRAM), для сохранения данных в ней. Тактирование АЦП идёт отдельно, поэтому перед входом в режим остановки, для уменьшения потребления, бит ADON должен быть сброшен.

Для уменьшения потребляемой энергии внутренний регулятор напряжения должен быть переведён в режим низкого потребления3 через бит LPDS регистра CR (PWR), а бит PDDS должен быть сброшен. После этого вызывается одна из инструкций погружения в сон.

Обратите внимание: перед входом в режим остановки все флаги событий должны быть сброшены, в противном случае переход не будет осуществлён. При выходе из данного режима МК будет работать от HSI, т.е. если использовался HSE, то его нужно будет конфигурировать заново. Задержка при выходе, соответственно обусловлена временем запуска HSI и регулятора напряжения.

Режим ожидания

Последний режим, самый экономичный, так как он отключает почти всё, в том числе внутренний регулятор напряжения, а значит содержание всех регистров и памяти сбрасываются, ножки переходят в высокоимпедансное состояние (Hi-Z).

Бит SLEEPDEEP должен быть установлен в 1, а записью 1 в PDDS разрешается режим ожидания. Флаг CWUF (просыпания) должен быть сброшен.

Выйти из данного режима можно только по сигналу сброса на ножке NRST, возрастающему фронту ножки WKUP (в нашем случае это PA0) или по прерыванию/событию от часов реального времени (RTC) или независимого сторожевого таймера (IWDG).


Назад | Оглавление | Дальше


1 По-умолчанию вся периферия отключена и не тактируется.
2 В STM32L таких режимов больше.
3 Внутренний регулятор не обязательно переводить в режим низкого энергопотребления. Если этого не делать, то время выхода из режима уменьшиться, но потребление увеличится.