РЕЖИМ SLEEP
Тактирование CPU выключено, все периферийные устройства,
включая периферийные устройства ядра Cortex-M3, наподобие NVIC,
SysTick, и т. п., остаются в рабочем состоянии.
Если для входа используется инструкция WFI то дополнительно
можно определить поведение контроллера по выходу с обработчика
прерывания (продолжать программу с того места где был вход в режим сна
или уснуть снова) при помощи бита SLEEPONEXIT.
Так же, если этот бит установлен до входа в режим сна, то вход будет
выполнен только после обработки всех прерываний, находящихся в
состоянии PENDING (В не зависимости от того, WFI или WFE была
использована)
Для входа именно в этот режим необходимо, чтобы бит SLEEPDEEP
был сброшен.
РЕЖИМ STOP
Тактирование всех узлов остановлено, основной тактовый
генератор отключается. Содержимое SRAM и регистров сохраняется,
все ножки I/O сохраняют то же состояние, которое у них было в режиме
Run.
Прежде всего, для входа именно в этот режим необходимо
установить бит SLEEPDEEP. Так же необходимо сконфигурировать работу
внутреннего LDO 1V8 при помощи битов PDDS и LPDS в регистре
управления питанием (В режиме Stop регулятор предоставляет
пониженную мощность для домена 1.8V, сохраняя содержимое регистров и
SRAM). Дальше можно применять команды WFI и WFE.
Важной особенностью данного режима, является то, что сохраняется
возможность работы некоторых периферийных модулей, имеющих
независимое тактирование, таких как:
- Independent Watchdog
- Real time clock (от LSI или LSE)
Эти модули могут выводить контроллер из режима STOP. RTC может
сгенерировать любое событие из (пробуждение будет только если
использовалась инструкция WFE или если использовалась WFI и включено
советующее прерывание в NVIC):
- RTC Alarm event
- RTC Tamper and TimeStamp events
- RTC Wakeup event
Independent Watchdog – может перезагрузить контроллер по пришествии
некоторого периода времени.
РЕЖИМ STANDBY
Тактирование всех узлов остановлено, основной тактовый
генератор отключается. Содержимое SRAM и регистров теряется, так
как отключается LDO домена 1V8, все ножки I/O переходят в z-
состояние. Аналогичен режиму STOP, отличается только отключением
питания домена 1V8.
Для входа можно использовать команду WFE или WFI, но должен
быть установлен бит PDDS в регистре управления питанием PWR_CR и
очищен бит WUF в регистре управления/статуса питания PWR_CSR, а
так же SLEEPDEEP должен быть равен 1.
Выйти из этого режима по прерыванию или событию уже
невозможно. Для этого остается несколько методов:
- Внешний сброс контроллера
- Сброс контроллера от Independent Watchdog
- RTC Alarm Event
- Нарастающий фронт на пине WKUP
После выхода с standby контроллер начинает выполнение кода с 0 – го
адреса, с переходом на вектор сброса, загрузкой загрузчика и т.д.
Использование это режима я считаю целесообразным только в тех
устройствах, где не требуется быстрой реакции на внешние события, а
обработчики этих событий могут запускаться в порядке общей очереди
организованной при помощи RTC. Данный режим обладает довольно
долгим времени выхода.
АРХИТЕКТУРА ПРОГРАММ
Только на прерываниях