====== Режимы 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) ток потребления будет несколько меньше (но не нормируется).// ----