Ядро Cortex-M3 имеет два режима пониженного энергопотребления SLEEP и SLEEPDEEP. Данные режимы приостанавливают выполнение программы и после выхода из сна выполнение программы продолжается.
Режимы STANDBY и BATTERY ONLY выключают внутреннее питание, поэтому при выходе из этих режимов программа стартует с самого начала.
Для перехода процессора в эти режимы используются команды WFI и WFE. WFI и WFE это встроенные функции ядра Cortex, поддерживаемые компиляторами ARM. Бит SLEEPDEEP регистра SCB→SCR определяет в какой именно режим будет переведен процессор этими командами.
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 - команда перевода процессора в режим сна до возникновения события. Под событием подразумевается так же возникновение прерывания, либо сигнал на выводе 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 отключается также тактирование периферийных устройств. Список периферии тактируемой от HCLK можно посмотреть в описании регистра MDR_RST_CLK→PER_CLOCK.
При выходе из режимов SLEEP и SLEEPDEEP исполнение программы продолжается с точки входа в режим сна. Если при выходе из сна происходит обработка прерывания, то есть возможность после обработки прерывания автоматически вернуться в режим сна. За это отвечает бит SLEEPONEXIT регистра SCR, при выставлении бита в 1 процессор будет уходить в сон без применения команд WFI/WFE. Это необходимо для задач, где процессор почти все время спит, и просыпается только для того чтобы обработать какое-то внешнее прерывание.
Микроконтроллер 1986ВЕ9х имеет так же режим Standby. Выход в этот режим осуществляется записью в регистр MDR_BKP→REG_0F бита STANDBY, при этом отключается регулятор питания DUcc.
DUсс вывод осуществляет питание внутренней цифровой части, памяти ОЗУ и Flash-памяти. Это питание формируется внутренним регулятором напряжения из Uсс. В этом режиме рабочим остается только батарейный домен.
В разделе «Батарейный домен и часы реального времени MDR_BKP» описания представлена схема, которая отражает возможности выхода контроллера из режима Standby. Пробуждение возможно либо по сигналу от внешнего вывода WAKEUP, либо по сигналу от «Часов реального времени».
При выходе из данного режима исполнение программы запустится с начала, аналогично сбросу по Reset.
Микроконтроллер должен входить в режим 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. Поскольку это вывод, то подтягивать его никуда не надо.
Я не нашел описание данного режима в спецификации, но он представлен на слайдах компании с одной из конференций.
Задержка выхода из режимов пониженного энергопотребления
Из SLEEP выход занимает 2 такта рабочей частоты процессора, которая была настроена перед переходом в SLEEP (правда без учета времени на вход в обработчик прерывания, задержки Flash акселератора и т.п., но это порядка 10-30 тактов)
Из DEEP SLEEP 1 такт LSI генератора, а затем 1 такт рабочей частоты процессора, которая была настроена перед переходом в SLEEP так же без учета времени на вход в обработчик и задержки акселератора
Выход из STANDBY режима равнозначен перезапуску процессора через RESET, и состоит из времени включения встроенного LDO генератора (~30 мкС), выполнения загрузочной программы (~10 мкС) и запуска пользовательской программы
Пробуждение из батарейного питания, т.е. с появлением питания Ucc равнозначно включению микросхемы по появлению питания Ucc и включает в себя еще дополнительную задержку для стабилизации напряжения питания (типовое 4 мС, мах 6 мС) и более долгая работа загрузочной программы (~200 мкС)
Режимы низкого энергопотребления К1986ВЕ92QI
Потребления до 100-400 мкА при 25С можно добиться.
Перед уходом в SLEEP или SLEEPDEEP.
При пробуждении повторить в обратном порядке
Продолжить программу.
Это пройдет для нормальных условий (25 град С), при 125С потребление вырастет до 1-2 мА (утечки)
- А какой ток потребления в режиме Sleep?
- Может ли в этом режиме продолжать функционировать АЦП и как это влияет на потребление?
Ответ: Ток зависит от настроек микросхемы, в этом режиме отключается от тактирования 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) ток потребления будет несколько меньше (но не нормируется).