Информационный портал технической поддержки Центра проектирования интегральных микросхем |
Ядро Cortex-M3, используемое в МК К1986ВЕ92QI, имеет два режима пониженного энергопотребления SLEEP и SLEEPDEEP. Данные режимы приостанавливают выполнение программы и после выхода из сна выполнение программы продолжается.
Режимы STANDBY и BATTERY ONLY выключают внутреннее питание, поэтому при выходе из этих режимов программа стартует с самого начала.
Для перехода процессора в эти режимы используются команды WFI (wait for interrupt) и WFE (wait for event). WFI и WFE - это встроенные функции ядра Cortex, поддерживаемые компиляторами ARM. Бит SLEEPDEEP регистра SCB→SCR определяет, в какой именно режим будет переведен процессор этими командами:
0 - спящий режим (Sleep);
1 - режим глубокого сна (Deep Sleep).
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-M3). Возникновение события отражается установкой некоторого бита во внутреннем регистре ядра 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.
Рисунок 1 - Структурная блок-схема формирования тактовой частоты
При выходе из режимов SLEEP и SLEEPDEEP исполнение программы продолжается с точки входа в режим сна. Если при выходе из сна происходит обработка прерывания, то существует возможность после обработки прерывания автоматически вернуться в режим сна. За это отвечает бит SLEEPONEXIT регистра SCR. При выставлении бита в 1 процессор будет уходить в сон без применения команд WFI/WFE. Это необходимо для задач, где процессор почти все время спит и просыпается только для того, чтобы обработать какое-то внешнее прерывание.
Архив "K1986BE92QI_SLEEP_SLEEPDEEP" с проектом в конце статьи демонстрирует реализацию входа МК К1986ВЕ92QI на устройстве отладочном для м/сх К1986ВЕ92QI вер.3 в режим SLEEP или SLEEPDEEP с помощью команды WFI и выхода из этого режима по прерыванию от часов RTC.
В проекте сначала настраиваются выводы для работы со светодиодами VD3 и VD4, а также выполняется конфигурация функции задержки. Далее проверяется, включены ли часы RTC - если нет, то выполняется их инициализация от LSE. Далее устанавливается будильник на 4-ю секунду относительно текущего времени и выполняется переход в режим SLEEP или SLEEPDEEP - выбор режима настраивается с помощью макроопределения SLEEP_MODE. По прошествии 4 секунд флаг ALRF должен вызвать прерывание и вывести МК из режима пониженного энергопотребления, о чём будет свидетельствовать мигание светодиода VD4. Далее цикл со входом в режим SLEEP или SLEEPDEEP повторяется.
Рисунок 2
Рисунок 3
Микроконтроллер К1986ВЕ92QI имеет также режим 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. Поскольку это выход, то подтягивать его никуда не надо.
Рисунок 5
Рисунок 6
Сайт: | https://support.milandr.ru |
E-mail: | support@milandr.ru |
Телефон: | +7 495 221-13-55 |