====== Режимы SLEEP, SLEEPDEEP и STANDBY в 1986VE9x ======
Ядро Cortex-M3 имеет два режима пониженного энергопотребления SLEEP и SLEEPDEEP. Данные режимы приостанавливают выполнение программы и после выхода из сна выполнение программы продолжается.
Режимы STANDBY и BATTERY ONLY выключают внутреннее питание, поэтому при выходе из этих режимов программа стартует с самого начала.
=====Режимы SLEEP и SLEEPDEEP=====
Для перехода процессора в эти режимы используются команды WFI и WFE. WFI и WFE это встроенные функции ядра Cortex, поддерживаемые компиляторами ARM. Бит SLEEPDEEP регистра SCB->SCR определяет в какой именно режим будет переведен процессор этими командами.
====Вход и выход из режимов SLEEP и SLEEPDEEP====
===WFI===
WFI - команда перевода процессора в режим сна до возникновения прерывания. Если прерывание не может быть обработано, например, из-за низкого приоритета, то оно не сможет вывести процессор из спящего режима.
Регистры: \\
BASEPRI – Задает базовый приоритет и запрещает прерывания с меньшим и равным приоритетом. \\
PRIMASK – Запрещает все прерывания с конфигурируемым приоритетом.
Таблица 1 - Выход из сна после WFI.
| //** WFI**// ^ PRIMASK ^ Выход из сна ^ Запуск обработчика IRQ |
^ приоритет IRQ > BASEPRI | 0 | Да | Да |
^ приоритет IRQ <= BASEPRI | 0 | Нет | Нет |
^ приоритет IRQ > BASEPRI | 1 | Да | Нет |
^ приоритет IRQ <= BASEPRI | 1 | Нет | Нет |
Определение команды в CMSIS
void __WFI(void);
===WFE===
WFE - команда перевода процессора в режим сна до возникновения события. Под событием подразумевается так же возникновение прерывания, либо сигнал на выводе RXEV (Указан в описании ядра Cortex 3M, в описании Миландр не обнаружен). Возникновение события отражается установкой некоторого бита в каком-то внутреннем регистре ядра Cortex. Если при вызове команды WFE этот бит уже установлен, то процессор сбрасывает этот бит и не входит в режим Sleep, поскольку считает что событие пробуждения уже произошло. Если бит события равен 0, тогда процессор переходит в состояние сна.
Для того чтобы гарантированно уйти в режим сна командой WFE, рекомендуется вызывать ее в цикле. Для программной генерации события используется команда SEV.
Бит SEVONPEND регистра SCB→SCR определяет должно ли прерывание обладать нужным приоритетом, или выход из сна разрешается по событию защелкивания (pending) прерывания.
Таблица 2 - Выход из сна после WFE.
| //** WFE**// ^ SEVONPEND ^ PRIMASK ^ Выход из сна ^ Запуск обработчика IRQ |
^ приоритет IRQ > BASEPRI | 0 | 0 | Да | Да |
^ приоритет IRQ <= BASEPRI | 0 | 0 | Нет | Нет |
^ приоритет IRQ > BASEPRI | 0 | 1 | Нет | Нет |
^ приоритет IRQ <= BASEPRI | 0 | 1 | Нет | Нет |
^ приоритет IRQ > BASEPRI | 1 | 0 | Да | Да |
^ приоритет IRQ <= BASEPRI | 1 | 0 | Да | Нет |
^ приоритет IRQ > BASEPRI | 1 | 1 | Да | Нет |
^ приоритет IRQ <= BASEPRI | 1 | 1 | Да | Нет |
Определение команды в CMSIS
void __WFE(void);
void __SEV(void); // Генерация события
====Тактирование в SLEEP и SLEEPDEEP====
В описании представлена схема тактирования, которая раскрывает разницу между режимами SLEEP и SLEEPDEEP. При режиме SLEEP отключается тактирование только ядра микроконтроллера, а при режиме SLEEPDEEP отключается также тактирование периферийных устройств. Список периферии тактируемой от HCLK можно посмотреть в описании регистра MDR_RST_CLK->PER_CLOCK.
{{doc:doclist:clockve9x.png}}
При выходе из режимов SLEEP и SLEEPDEEP исполнение программы продолжается с точки входа в режим сна. Если при выходе из сна происходит обработка прерывания, то есть возможность после обработки прерывания автоматически вернуться в режим сна. За это отвечает бит SLEEPONEXIT регистра SCR, при выставлении бита в 1 процессор будет уходить в сон без применения команд WFI/WFE. Это необходимо для задач, где процессор почти все время спит, и просыпается только для того чтобы обработать какое-то внешнее прерывание.
====Режим SLEEP====
* Могут быть включены все периферийные цифровые и аналоговые блоки
* Не тактируется ядро, Flash, DMA, ОЗУ и внешняя шина
* Тактовая частота USB 48МГц
* Пробуждение от прерываний
* Динамический ток потребления до 40мА
{{doc:doclist:SLEEP_9x_s.png}}
====Режим SLEEPDEEP====
* Могут быть включены только АЦП, ЦАП, Компаратор, PVD, NVIC с тактированием от LSI.
* Не тактируется ядро, Flash, DMA, ОЗУ и внешняя шина.
* Пробуждение от прерываний
* Динамический ток потребления до 2мА.
{{doc:doclist:SLEEP_DEEP_9x_s.png}}
=====Режим STANDBY=====
Микроконтроллер 1986ВЕ9х имеет так же режим //Standby//. Выход в этот режим осуществляется записью в регистр MDR_BKP->REG_0F бита STANDBY, при этом отключается регулятор питания DUcc.
DUсс вывод осуществляет питание внутренней цифровой части, памяти ОЗУ и Flash-памяти. Это питание формируется внутренним регулятором напряжения из Uсс. В этом режиме рабочим остается только батарейный домен.
В разделе //«Батарейный домен и часы реального времени MDR_BKP»// описания представлена схема, которая отражает возможности выхода контроллера из режима //Standby//. Пробуждение возможно либо по сигналу от внешнего вывода WAKEUP, либо по сигналу от //«Часов реального времени»//.
При выходе из данного режима исполнение программы запустится с начала, аналогично сбросу по Reset.
{{doc:doclist:ve92x_standby.png}}
Микроконтроллер должен входить в режим //Standby// сразу после записи единицы в бит STANDBY. Но вход в //Standby// может не произойти, если при записи единицы в бит STANDBY возникли или существуют условия выхода из этого режима. Например, на выводе //WAKEUP// уже 0. Или уже взведен бит ALRF. Так же может быть отключена частота тактирования для батарейного домена и запись в бит не выполнится.
Для выхода в режим //Standby// используется следующий код:
MDR_RST_CLK->PER_CLOCK |= (1 << PCLK_EN_BKP); // включение тактирования батарейного домена
MDR_BKP->REG_0F |= (1 << BKP_REG_0F_STANDBY_Pos); // переход в Standby
Внешний вывод //WAKEUP// является цифровым входом и должен быть подтянут снаружи к цепи питания резистором 50-100кОм. Так же микроконтроллер имеет внешний вывод //STANDBY// который сигнализирует, что МК находится в режиме Standby. Поскольку это вывод, то подтягивать его никуда не надо.
====Сводка по STANDBY====
* Выключено питание DUcc.
* Работают только LSI, LSE, RTC и BKP блоки.
* Пробуждение от сигнала WAKEUP и ALARM RTC.
* Динамический ток потребления до 15мкА.
* Время запуска не более 20мкс.
{{doc:doclist:standby_9x_s.png}}
=====Режим Battery ONLY=====
Я не нашел описание данного режима в спецификации, но он представлен на слайдах компании с одной из конференций.
* Выключено питание DUcc
* Выключено питание Ucc
* Работают только LSE, RTC и BKP блоки
* Пробуждение по появлению питания Ucc
* Динамический ток потребления до 5мкА.
* Время запуска не более 6 мс.
{{doc:doclist:BatteryOnly_s.png}}
=====Информация с форума=====
[[http://forum.milandr.ru/viewtopic.php?f=33&t=477&p=2521&hilit=STANDBY#p2521|Задержка выхода из режимов пониженного энергопотребления]]
Из SLEEP выход занимает 2 такта рабочей частоты процессора, которая была настроена перед переходом в SLEEP (правда без учета времени на вход в обработчик прерывания, задержки Flash акселератора и т.п., но это порядка 10-30 тактов)
Из DEEP SLEEP 1 такт LSI генератора, а затем 1 такт рабочей частоты процессора, которая была настроена перед переходом в SLEEP так же без учета времени на вход в обработчик и задержки акселератора
Выход из STANDBY режима равнозначен перезапуску процессора через RESET, и состоит из времени включения встроенного LDO генератора (~30 мкС), выполнения загрузочной программы (~10 мкС) и запуска пользовательской программы
Пробуждение из батарейного питания, т.е. с появлением питания Ucc равнозначно включению микросхемы по появлению питания Ucc и включает в себя еще дополнительную задержку для стабилизации напряжения питания (типовое 4 мС, мах 6 мС) и более долгая работа загрузочной программы (~200 мкС)
[[http://forum.milandr.ru/viewtopic.php?f=22&t=1740&p=8280&hilit=STANDBY#p8280|Режимы низкого энергопотребления К1986ВЕ92QI]]
Потребления до 100-400 мкА при 25С можно добиться.
Перед уходом в SLEEP или SLEEPDEEP.
- Переключить все тактирование на LSI.
- Выключить HSI (через батарейный домен) и HSE.
- В батарейном домене задать SELECTRI и LOW 011 (80 мкА) или 100 (2 мкА)
- Уйти в режим
При пробуждении повторить в обратном порядке
- Увеличить SELECTRI и LOW до нужного значения
- Включить HSI
- Перейти на нужную частоту
Продолжить программу.
Это пройдет для нормальных условий (25 град С), при 125С потребление вырастет до 1-2 мА (утечки)
====Вопросы - ответы====
- А какой ток потребления в режиме Sleep? \\
- Может ли в этом режиме продолжать функционировать АЦП и как это влияет на потребление?
[[http://forum.milandr.ru/viewtopic.php?f=33&t=477&p=2521&hilit=STANDBY#p2521|Ответ]]: //Ток зависит от настроек микросхемы, в этом режиме отключается от тактирования HCLK. АЦП может продолжать преобразование, если настроены в режим тактирования от ADC_CLK, но без возможности дополнительных задержек, автоматического перебора и т.п. //
//Потребление снижается примерно в 2 раза от максимума.//
----
- Какое потребление МК 1986ВЕ92У в режимах сниженного энергопотребления:
Ответ: //Ориентировочно, в режиме SLEEP общее потребление не превосходит 40 мА, SLEEPDEEP - 2 мА, STANDBY - 50 мкА.//
----
- Интересует ток потребления для микроконтроллеров 1986ВЕ1Т и 1986ВЕ3Т. Что такое режим PowerDown?
Ответ: //Батарейный блок 1986ВЕ1Т точно такой же, как и в 1986ВЕ94Т, то ток потребления батарейного домена не хуже 5мкА. В комфортных условиях 25 градусов Цельсия - около 2мкА.//
//Режим powerdown эквивалентен режиму standby. При этом напряжения питания не снимаются, и измеряется суммарный ток по всем доменам. При подаче нулевых напряжений питания (кроме BUcc) ток потребления будет несколько меньше (но не нормируется).//
----