Вы находитесь на странице: 1из 8

РЕЖИМЫ ПОНИЖЕННОГО ЭНЕРГОПОТРЕБЛЕНИЯ В STM32F205

В данном контроллере существует 3 режима пониженного


энергопотребления:
- sleep (сон)
- stop (глубокий сон)
- standby
Для входа в любой из них используются инструкции:
- “WFI” (Wait for interrupt)
- “WFE” (Wait for event)
При использовании WFI выход из сна будет осуществляться по
любому прерыванию, которое разрешено в NVIC. При этом сразу после
пробуждения будет выполнен обработчик.
При использовании WFE выход с режима сна будет осуществлен,
если произошло событие “Wakeup Event”. Это событие будет
сгенерировано в следующих случаях:
- (SEVONPEND = 0) если произошло прерывание, которое
разрешено в NVIC и в периферии. В этом случае поведение аналогично
инструкции WFI, так же будет вызван обработчик прерывания;
- (SEVONPEND = 1) если произошло событие, которое разрешено в
периферии, но может быть не разрешено в NVIC, тогда обработчик будет
вызван не обязательно (только если дополнительно прерывание
разрешено еще и в NVIC);
- в не зависимости от вышеперечисленных источников события
“Wakeup Event” оно будет генерироваться от любой линии EXTI, если она
сконфигурирована в режиме «событие». Это значит, что кроме
пробуждение от сигналов на входах микроконтроллера, возможно
пробуждение от некоторых внутренних периферийных модулей, которые
соединены с линиями EXTI:
- PVD output
- RTC Alarm event
- USB OTG FS Wakeup event
- Ethernet Wakeup event
- USB OTG HS (configured in FS) Wakeup event
- RTC Tamper and TimeStamp events
- RTC Wakeup event

РЕЖИМ SLEEP
Тактирование CPU выключено, все периферийные устройства,
включая периферийные устройства ядра Cortex-M3, наподобие NVIC,
SysTick, и т. п., остаются в рабочем состоянии.
Если для входа используется инструкция WFI то дополнительно
можно определить поведение контроллера по выходу с обработчика
прерывания (продолжать программу с того места где был вход в режим сна
или уснуть снова) при помощи бита SLEEPONEXIT.
Так же, если этот бит установлен до входа в режим сна, то вход будет
выполнен только после обработки всех прерываний, находящихся в
состоянии PENDING (В не зависимости от того, WFI или WFE была
использована)
Для входа именно в этот режим необходимо, чтобы бит SLEEPDEEP
был сброшен.

Характеристики (внешнее тактирование, вся периферия включена):


- ток потребления при 120MHz ~ 38mA
- время выхода в Run mode – 1uS

РЕЖИМ STOP
Тактирование всех узлов остановлено, основной тактовый
генератор отключается. Содержимое SRAM и регистров сохраняется,
все ножки I/O сохраняют то же состояние, которое у них было в режиме
Run.
Прежде всего, для входа именно в этот режим необходимо
установить бит SLEEPDEEP. Так же необходимо сконфигурировать работу
внутреннего LDO 1V8 при помощи битов PDDS и LPDS в регистре
управления питанием (В режиме Stop регулятор предоставляет
пониженную мощность для домена 1.8V, сохраняя содержимое регистров и
SRAM). Дальше можно применять команды WFI и WFE.
Важной особенностью данного режима, является то, что сохраняется
возможность работы некоторых периферийных модулей, имеющих
независимое тактирование, таких как:
- Independent Watchdog
- Real time clock (от LSI или LSE)
Эти модули могут выводить контроллер из режима STOP. RTC может
сгенерировать любое событие из (пробуждение будет только если
использовалась инструкция WFE или если использовалась WFI и включено
советующее прерывание в NVIC):
- RTC Alarm event
- RTC Tamper and TimeStamp events
- RTC Wakeup event
Independent Watchdog – может перезагрузить контроллер по пришествии
некоторого периода времени.

Характеристики (внешнее тактирование, вся периферия включена):


- ток потребления при 120MHz ~ 0,5mA
- время выхода в Run mode – 17uS

РЕЖИМ STANDBY
Тактирование всех узлов остановлено, основной тактовый
генератор отключается. Содержимое SRAM и регистров теряется, так
как отключается LDO домена 1V8, все ножки I/O переходят в z-
состояние. Аналогичен режиму STOP, отличается только отключением
питания домена 1V8.
Для входа можно использовать команду WFE или WFI, но должен
быть установлен бит PDDS в регистре управления питанием PWR_CR и
очищен бит WUF в регистре управления/статуса питания PWR_CSR, а
так же SLEEPDEEP должен быть равен 1.
Выйти из этого режима по прерыванию или событию уже
невозможно. Для этого остается несколько методов:
- Внешний сброс контроллера
- Сброс контроллера от Independent Watchdog
- RTC Alarm Event
- Нарастающий фронт на пине WKUP
После выхода с standby контроллер начинает выполнение кода с 0 – го
адреса, с переходом на вектор сброса, загрузкой загрузчика и т.д.
Использование это режима я считаю целесообразным только в тех
устройствах, где не требуется быстрой реакции на внешние события, а
обработчики этих событий могут запускаться в порядке общей очереди
организованной при помощи RTC. Данный режим обладает довольно
долгим времени выхода.

Характеристики (внешнее тактирование, вся периферия включена):


- ток потребления при 120MHz ~ 0.004mA
- время выхода в Run mode – 375uS

АРХИТЕКТУРА ПРОГРАММ

Во время создания ПО для микроконтроллера, работающего от


батарейного питания, необходимо учитывать необходимость
периодического перехода микроконтроллера между различными
режимами энергопотребления. Для того, чтобы МК мог максимально долго
находится в режимах сна, архитектура ПО должна быть построенная с
использованием событийной концепции.

Только на прерываниях

Данная концепция подходит, в основном, для не сложных устройств


которым не требуется выполнять сложные и длительные вычисления, а
работа сводится до реагирования на внешние события или внутренние
тайминги и уход в сон. В микроконтроллерах STM32 для реализации такой
программы, можно использовать режим STOP и инструкцию WFI. По
наступлению события микроконтроллер:
- пробуждается и сразу обрабатывает прерывание
- засыпает
Главный цикл такой программы не выполняет никакой работы. Минус
данной концепции заключается в отсутствии универсальности, так как для
каждого такого устройства будет свой список прерываний, их
обработчиков, своя настройка спящих режимов и т.д. Кроме того для
полноценной работы программы во время обработки события
необходимо разрешать вложенные прерывания, что требует серьёзного
подхода к настройке приоритетов.

Сон во время Idle, без привязки к событиям

В данной концепции главный цикл может выполнять любою работу,


однако программа должна иметь промежутки времени свободные от
полезных операций, в это время микроконтроллер может спать. Для
выполнения периодических вычислений, не связанных с внешними
событиями, должна существовать служба программного таймера,
основана на RTC, который сможет пробуждать контроллер периодически
для выполнения необходимых операций. Так же контроллер после
пробуждения и выполнения обработчика прерывания не возвращается в
сон, а падает в некий обработчик SleepIfPossible (то место, в котором он
ушел в сон) где проверяет возможные условия выхода из этого
обработчика и продолжения работы в режиме Run для выполнения
некоторых операций. Для примера, как может обрабатываться событие
выстрела от цифрового микрофона:
- микроконтроллер просыпается по фронту на EXTI от компаратора
- обрабатывает прерывание, где запускает I2S, устанавливается
запрет на режим stop
- переходит в SleepIfPossible, затем в sleep (I2S продолжает принимать
данные от микрофона и сохранять их в оперативной памяти при помощи
DMA)
- по приёму необходимого количества данных, происходит
прерывание, выход из sleep, разрешение stop
- обработчик прерывания устанавливает флаг необходимости
цифрового анализа принятых данных
- переходит в SleepIfPossible, обрабатывает данные с микрофона
- производятся необходимые реакции, программа работает в
«обычном режиме»
- когда больше нет операций для выполнения, микроконтроллер
снова с SleepIfPossible переходит в stop
Данная концепция так же является событийной, но состоит не только
из обработчиков событий, но также содержит нормальный цикл. Для
управления спящими режимами, настройкой событий которые
пробуждают контроллер и некоторой логикой связанной с безопасностью
входа – выхода в сон/стоп/ожидание должна существовать отдельная
библиотека. Так же, для удобства, она может содержать встроенную
службу программного таймера с удобным API для настройки RTC.
Спящие режимы в FreeRTOS

Использовать режим sleep в операционной системе FreeRTOS


довольно просто. Когда нет задач в состоянии Ready, операционная
система переходит к выполнению служебной задачи IDLE_Task где
необходимо разместить команду WFI. При этом работа ядра и памяти будет
остановлена, а процессор будет ожидать прерывания от таймера
диспетчера ОС, который либо запустит следующую задачу, либо снова
IDLE_Task, после чего контроллер снова перейдет в режим sleep. Однако
такой подход в некоторых случаях будет слабо эффективен, из-за
необходимости пробуждать контроллер каждый тик системного таймера, в
не зависимости от того, есть ли задача на выполнения. Для решения такой
проблемы FreeRTOS предоставляет специальный API – подробнее.
Использование stop даст гораздо большую экономию энергии, но
требует более сложной настройки, так тактирование МК отключается
полностью, в том числе системного таймера, который является основой
работы диспетчера ОСРВ. Выход контроллера из этого режима должен
быть обеспечен каким-то сторонним устройством – внешним сигналом, или
при помощи RTC. Когда RTC генерирует событие/прерывание,
микроконтроллер просыпается, запускается тактирование, и ОСРВ
продолжает свою работу. Необходимо так – же обеспечить механизм
инкрементирования системного времени на время сна после выхода с
stop. В некоторых случаях устройство с операционной системой может
находится в режиме сна бесконечно долго, пока не появится
необходимость из него выйти:
- активирован режим tickless idle
- служба таймеров ОС не используется
- все задачи находятся либо в состоянии «Приостановлено» либо в
состоянии «Заблокировано»

Вам также может понравиться