STM32 режимы пониженного энергопотребления.

STM32 режимы пониженного энергопотребления.

Сначала хотелось бы пару слов сказать о питающих напряжениях микроконтроллера, для нормальной работы STM32 необходимо от 2 до 3.6V, а уже встроенный стабилизатор обеспечивает 1.8 вольта для питания ядра. Ниже схематично изображена общая схема питания контроллера.
STM32 режимы  пониженного энергопотребления.

Как видно, схема питания разделена на домены и каждый из них отвечает за питание определённой периферии/части МК.

Уменьшить потребление МК можно несколькими способами, самое простое, что можно сделать — это понизить тактовую частоту или отключать шины APB и AHB, когда они не используются. Другой вариант, который требует чуть больше знаний — это использовать режимы низкого энергопотребления, кстати, их всего три:

  • sleep режим
  • stop режим
  • standby режим


Перед тем как начать описывать режимы хотелось бы отметить, что переход в любой из режимов пониженного энергопотребления осуществляется с помощью ассемблерных инструкций WFI и WFE, их отличие заключается в том, что если контроллер был отправлен в режим пониженного энергопотребления с помощью WFI(wait for interrupt), то выйти из этого режима он может только по прерыванию, если с помощью WFE(wait for event), то выйти из этого режима он может по наступлению события. Хотелось бы напомнить, что событие — это периферийное прерывание, которое не было разрешено в NVIC.

Для режима sleep характерно следующее, прекращается выполнение кода программы, прекращается тактирование ядра, периферия работает, все вывода сохраняют своё состояние.

Вход в режим sleep осуществляется с помощью инструкций WFE и WFI, когда:

  • сброшен бит SLEEPDEEP
  • выбрано значение бита SLEEPONEXIT


Что касается SLEEPONEXIT , его состояние определяет поведение контроллера при выходе из режима sleep по прерыванию(WFI), если бит сброшен, то контроллер проснётся, отработает прерывание и продолжит, как обычно, исполнять код, но если SLEEPONEXIT установлен, то после пробуждения, отработав прерывание, контроллер снова уснёт. Это позволяет создавать устройства с минимальным потреблением, работающие на прерываниях.

Выход из режима sleep по событию(WFE), позволяет начать выполнение программы с того места, где она была остановлена.
Источником события может быть:

  • прерывание в регистре управления периферией, но не в NVIC или установка бита SEVONPEND в регистре управления ядром
  • появление сигнала на линии внешних прерываний, когда она сконфигурирована в режиме событий. Но совсем необязательно, что сигнал будет поступать извне, например, EXTI содержит линию, по которой может приходить запрос прерывания от часов реального времени( RTC)

Выход из режима sleep по прерыванию(WFI), может быть спровоцирован любым прерыванием в NVIC.


Что касается потребления, то тут надо смотреть документацию на конкретный камень, например, минимальное потребление STM32F103VE составляет 0.45mA.
STM32 режимы  пониженного энергопотребления.


Режим stop характерен остановкой PLL, HSI и HSE генераторов, при этом все пины ввода-вывода сохраняют своё состояние.

Вход в stop режим осуществляется с помощью инструкций WFE и WFI, когда:

  • установлен бит SLEEPDEEP
  • cброшен бит PDDS в регистре PWR_CR
  • выбран режим стабилизатора напряжения(тот о котором упоминалось в начале статьи) битом LPDS в регистре PWR_CR


Выход из режима stop в обоих случаях(WFI и WFE) инициирует сигнал на любой из линий EXTI, только в одном случае сконфигурированной в режиме прерывания, в другом — в режиме события.

Что касается энергопотребления, то в этом случае оно составляет десятки микроампер и зависит от режима стабилизатора напряжения.
STM32 режимы  пониженного энергопотребления.




Standby режим характеризуется самым низким потреблением, около 2мкА и потерей всех данных, то есть при выходе из этого режима контроллер будет вести себя также как при нажатии на кнопку Reset.

Вход в standby режим осуществляется с помощью инструкций WFE и WFI, когда:
  • установлен бит SLEEPDEEP
  • установлен бит PDDS в регистре PWR_CR
  • сброшен бит WUF, в регистре PWR_CSR

Выход из standby режима осуществляется:
  • по нарастающему фронту на пине WKUP(A0), который для этого необходимо сконфигурировать специальным образом
  • по нарастающему фронту будильника RTC
  • внешнему сбросу(пин NRST)
  • сбросу IWGT


О том что контроллер вышел из standby режима говорит установленный флаг SBF. В standby режиме все выводы находятся в высокоимпедансном состоянии кроме NRST, WKUP(если сконфигурирован), Tamper(если сконфигурирован).

Для наглядности оставлю здесь эту таблицу и поясню, что в столбце entry описаны биты которые надо сконфигурировать, а не установить.
STM32 режимы  пониженного энергопотребления.


Отладку в режимах пониженного энергопотребления можно разрешить, установив соответствующие биты в регистре DBGMCU_CR.
 
DBGMCU->CR |= DBGMCU_CR_DBG_SLEEP;
DBGMCU->CR |= DBGMCU_CR_DBG_STOP;
DBGMCU->CR |= DBGMCU_CR_DBG_STANDBY;


Регистр управления питанием(PWR_CR).
STM32 режимы  пониженного энергопотребления.

Биты 31:9 – зарезервированы, заполнены нулями.

DBP(Disable backup domain write protection) — 1 в этом бите разрешает доступ к регистрам резервного копирования и RTC, 0 – запрещает.

PLS[2:0](PVD level selection) — задают уровень порога срабатывания детектора напряжения.
STM32 режимы  пониженного энергопотребления.

PVDE(Power voltage detector enable) — 1 в этом бите включает PVD, 0 – отключает.

CSBF(Clear standby flag) — всегда читается как ноль, установка 1 в этот бит очищает SBF(StandbyFlag).

CWUF(Clear wakeup flag) — всегда читается как ноль, установка 1 в этот бит очищает WUF(Wakeup Flag), но происходит это спустя два такта системного генератора.

PDDS(Power down deepsleep) — когда контроллер находится в режиме глубокого сна(Deepsleep), запись 1 в этот бит переводит его в standby режим, при записи 0 — в stop режим, статус стабилизатора напряжения зависит от LPDS, это относится только к stop режиму.

LPDS(Low-power deepsleep) — 0 в этом бите включает стабилизатор напряжения в stop режиме, 1 — переводит стабилизатор в режим пониженного энергопотребления в stop режиме.


Регистр управления/статуса (PWR_CSR)
STM32 режимы  пониженного энергопотребления.

Биты 31:9 – зарезервированы, заполнены нулями.

EWUP(Enable WKUP pin) — 1 в этом бите разрешает использовать пин WKUP для пробуждения микроконтроллера по нарастающему фронту, при установленном 0 — запрещает, в этом случае пин WKUP используется как обычный GPIO. Автоматически сбрасывается после ресета.

Биты 7:3 – зарезервированы, заполнены нулями.

PVDO(PVD output) — этот бит изменяется аппаратно и имеет силу, только когда установлен бит PVDE. Единица в этом бите означает, что VDD/VDDA опустилось ниже порогового значения, выбранного битами PLS[2:0], 0 — VDD/VDDA выше порогового значения, выбранного битами PLS[2:0].

SBF(Standby flag) — этот бит устанавливается аппаратно, а сбрасывается с помощью POR/PDR(power on reset/power down reset — при включение/выключение питания) или установкой бита CWUF в регистре PWR_CR , 1 в этом бите говорит о том, что контроллер был в режиме standby.

WUF(Wakeup flag) — этот бит устанавливается аппаратно, а сбрасывается с помощью POR/PDR(power on reset/power down reset — при включение/выключение питания) или установкой бита CWUF в регистре PWR_CR, 1 в этом бите говорит о том, что пробуждающее событие пришло с пина WKUP или от будильника RTC.


Узнать какой вывод реализует функцию WKUP, можно в программе STM32CUBE.
STM32 режимы  пониженного энергопотребления.


Ну и в заключение код, позволяющий входить в режим standby и выходить из него по переднему фронту на пине WKUP, в моём случае(STM32F103VET) — это вывод A0.

        RCC->APB1ENR |= RCC_APB1ENR_PWREN;//вкл тактирование PWR
	SCB->SCR |= SCB_SCR_SLEEPDEEP; //для M3 разрешаем sleepdeep
	PWR->CR |= PWR_CR_PDDS;//выбираем режим Power Down Deepsleep
	PWR->CR |= PWR_CR_CWUF ; //очищаем wakeup flag
	PWR->CSR |= PWR_CSR_EWUP; //разрешаем вэйкап, то есть пробуждение по переднему фронту на А0
	__WFE();  //уснули

Для получения более подробной информации можно обратиться к AN2629 Application note
комментарии
0