24244

Режимы SLEEP, SLEEPDEEP и STANDBY в 1986ВЕ9x

Дата последнего изменения: 04.08.2020 09:49:21

Ядро Cortex-M3 имеет два режима пониженного энергопотребления SLEEP и SLEEPDEEP. Данные режимы приостанавливают выполнение программы и после выхода из сна выполнение программы продолжается.

Режимы STANDBY и BATTERY ONLY выключают внутреннее питание, поэтому при выходе из этих режимов программа стартует с самого начала.

Режимы SLEEP и SLEEPDEEP

Для перехода процессора в эти режимы используются команды WFI (wait for interrupt) и WFE (wait for event). WFI и WFE - это встроенные функции ядра Cortex, поддерживаемые компиляторами ARM. Бит SLEEPDEEP регистра SCB→SCR определяет, в какой именно режим будет переведен процессор этими командами:

0 - спящий режим (Sleep);
1 - режим глубокого сна (Deep Sleep).

Вход и выход из режимов 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.

 Рисунок 1 - Структурная блок-схема формирования тактовой частоты

При выходе из режимов SLEEP и SLEEPDEEP исполнение программы продолжается с точки входа в режим сна. Если при выходе из сна происходит обработка прерывания, то существует возможность после обработки прерывания автоматически вернуться в режим сна. За это отвечает бит SLEEPONEXIT регистра SCR. При выставлении бита в 1 процессор будет уходить в сон без применения команд WFI/WFE. Это необходимо для задач, где процессор почти все время спит и просыпается только для того, чтобы обработать какое-то внешнее прерывание.

Режим SLEEP

  • Могут быть включены все периферийные цифровые и аналоговые блоки
  • Не тактируется ядро, Flash, DMA, ОЗУ и внешняя шина
  • Тактовая частота USB - 48МГц
  • Пробуждение от прерываний
  • Динамический ток потребления до - 40мА

 Рисунок 2

Режим SLEEPDEEP

  • Могут быть включены только АЦП, ЦАП, Компаратор, PVD, NVIC с тактированием от LSI
  • Не тактируется ядро, Flash, DMA, ОЗУ и внешняя шина
  • Пробуждение от прерываний
  • Динамический ток потребления - до 2мА

  Рисунок 3

Режим STANDBY

Микроконтроллер 1986ВЕ9х имеет также режим Standby. Переход в этот режим осуществляется записью в регистр MDR_BKP→REG_0F бита STANDBY, при этом отключается регулятор питания DUcc.

DUсс осуществляет питание внутренней цифровой части, памяти ОЗУ и Flash-памяти. Это питание формируется внутренним регулятором напряжения из Uсс. В режиме STANDBY рабочим остается только батарейный домен.

В разделе «Батарейный домен и часы реального времени MDR_BKP» спецификации представлена схема, которая отражает возможности выхода контроллера из режима STANDBY. Пробуждение возможно либо по сигналу от внешнего вывода WAKEUP, либо по сигналу от «Часов реального времени».

При выходе из данного режима исполнение программы запустится с начала, аналогично сбросу по Reset.

 Рисунок 4

Микроконтроллер должен входить в режим STANDBY сразу после записи единицы в бит STANDBY. Но вход в STANDBY может не произойти, если при записи единицы в бит STANDBY возникли или существуют условия выхода из этого режима. Например, на выводе WAKEUP уже 0. Или уже взведен бит ALRF. Также может быть отключена частота тактирования для батарейного домена, и запись в бит не выполнится.

Неиспользуемые пользовательские выводы PA – PF, nRESET, WAKEUP в цифровом режиме должны быть доопределены до допустимых логических уровней напряжения (высокого или низкого) с помощью внутренних программируемых резисторов доопределения или через внешние резисторы номиналом (1 – 100) кОм, или должны быть переведены в аналоговый режим.

Для выхода в режим 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. Поскольку это выход, то подтягивать его никуда не надо.

Архив с проектом в конце статьи демонстрирует реализацию входа МК 1986ВЕ92У на отладочной плате EVALUATION BOARD FOR MCU 1986VE92U Rev.3 в режим STANDBY и выхода из этого режима по таймеру.
В проекте сначала настраиваются выводы для работы со светодиодами. После настройки светодиод LED0 мигает 5 раз, чтобы показать, что МК запустился. Далее проверяется включены ли часы RTC, если нет, то выполняется их инициализация от LSE. Далее устанавливается будильник на 5 секунд относительно текущего времени и выполняется переход в STANDBY. По прошествии 5 секунд флаг ALRF должен выключить режим STANDBY и МК перезапустится, о чём будет свидетельствовать светодиод LED0.

Сводка по STANDBY

  • Выключено питание DUcc.
  • Работают только LSI, LSE, RTC и BKP блоки.
  • Пробуждение от сигнала WAKEUP и ALARM RTC.
  • Динамический ток потребления до 15мкА.
  • Время запуска не более 20мкс.

  Рисунок 5

Режим Battery ONLY


  • Выключено питание DUcc.
  • Выключено питание Ucc.
  • Работают только LSE, RTC и BKP блоки.
  • Пробуждение по появлению питания Ucc.
  • Динамический ток потребления до 5мкА.
  • Время запуска не более 6 мс.

  Рисунок 6

Информация с форума

Задержка выхода из режимов пониженного энергопотребления

Из SLEEP выход занимает 2 такта рабочей частоты процессора, которая была настроена перед переходом в SLEEP (без учета времени на вход в обработчик прерывания, задержки Flash акселератора и т.п., составляет порядка 10-30 тактов)
Из DEEP SLEEP - 1 такт LSI генератора, а затем 1 такт рабочей частоты процессора, которая была настроена перед переходом в SLEEP, также без учета времени на вход в обработчик и задержки акселератора
Выход из STANDBY режима равнозначен перезапуску процессора через RESET и состоит из времени включения встроенного LDO генератора (~30 мкс), выполнения загрузочной программы (~10 мкс) и запуска пользовательской программы
Пробуждение из батарейного питания, то есть с появлением питания Ucc, равнозначно включению микросхемы по появлению питания Ucc и включает в себя еще дополнительную задержку для стабилизации напряжения питания (типовое - 4 мс, мах - 6 мс) и более долгая работа загрузочной программы (~200 мкс)

Режимы низкого энергопотребления К1986ВЕ92QI

При 25С0 можно получить потребление до 100-400мкА.
Перед уходом в SLEEP или SLEEPDEEP:
Переключить все тактирование на LSI.
Выключить HSI (через батарейный домен) и HSE.
В батарейном домене задать SELECTRI и LOW 011 (80 мкА) или 100 (2 мкА)
Уйти в режим.
При пробуждении повторить в обратном порядке:
Увеличить SELECTRI и LOW до нужного значения
Включить HSI
Перейти на нужную частоту
Продолжить программу.
При 125С0 потребление вырастет до 1-2 мА (утечки)
 


Сохранить статью в PDF

Файлы для скачивания

Документация

Теги

Была ли статья полезной?