Режим Standby
Standby — самый экономный режим STM32: выключен даже внутренний стабилизатор ядра. Платить за это приходится памятью: содержимое ОЗУ и регистров теряется, а пробуждение выглядит для программы как обычный сброс. Отличить его помогает флаг в регистре питания.
Обновлено Редакция GAW
Режим Standby — самый экономный режим низкого потребления STM32. Он основан на глубоком сне ядра с выключенным стабилизатором: домен 1,2 В обесточен, PLL, HSI и HSE выключены, а содержимое SRAM и регистров теряется. Сохраняется только резервный домен — регистры и резервные регистры RTC, резервная SRAM — и схема управления Standby (RM0090, разд. 5.3.6).
Вход и выход
| Действие | Условие у STM32F4 |
|---|---|
| Вход | WFI или WFE при SLEEPDEEP = 1 и PDDS = 1 в PWR_CR |
| Подготовка | сброшены флаг WUF и флаг выбранного источника RTC |
| Выход | фронт на WKUP (PA0), будильник A или B RTC, пробуждение RTC, tamper, метка времени, сброс по NRST, сброс IWDG |
| После выхода | фаза сброса, регистры сбрасываются, кроме PWR_CSR |
Источник: RM0090, табл. 31. В разд. 5.3.6 исключением ошибочно назван PWR_CR: описания регистров в разд. 5.4.1 и 5.4.2 показывают, что при выходе из Standby сбрасывается как раз PWR_CR, а PWR_CSR с флагом SBF сохраняется. Программа после пробуждения начинается с вектора сброса, а не со следующей за WFI строки, — в этом главное отличие от режима Stop.
Как отличить пробуждение от включения
Флаг SBF в регистре PWR_CSR показывает, что микроконтроллер был в Standby. Его проверяют в начале программы вместе с флагами причины сброса и затем очищают. Данные, которые должны пережить сон, — счётчики, состояние автомата — кладут в резервные регистры RTC или резервную SRAM.
Выводы в Standby
Все выводы переходят в высокоимпедансное состояние, кроме трёх: вывода сброса, PC13 в роли RTC_AF1 (если он настроен на tamper, метку времени или выход будильника) и PA0 в роли WKUP, если он разрешён (RM0090, разд. 5.3.7). Если к выводу подключён ключ нагрузки или светодиод, их уровень в Standby задают внешние резисторы.
Байт конфигурации
В байтах конфигурации STM32 есть бит nRST_STDBY. Если он сброшен, попытка войти в Standby вызывает сброс микроконтроллера. Это защитный вариант для устройств, которым нельзя засыпать, но при отладке он выглядит как непонятная перезагрузка.
| Stop | Standby | |
|---|---|---|
| ОЗУ и регистры | сохраняются | теряются, кроме резервного домена |
| Продолжение программы | со следующей команды | с вектора сброса |
| Источники выхода | любые линии EXTI | WKUP, RTC, NRST, IWDG |
| Ток | малый | наименьший |
Тактирование и семейство в целом описаны в обзоре STM32F4.
Частые вопросы
Как программа узнаёт, что проснулась из Standby, а не включилась?
По флагу SBF в регистре PWR_CSR: он показывает, что микроконтроллер был в Standby, и выход из Standby его не сбрасывает (RM0090, разд. 5.4.2). После проверки флаг сбрасывают битом CSBF в PWR_CR. Сохранённые данные о прошлом цикле можно держать в резервных регистрах RTC или резервной SRAM — они в Standby не теряются.
Почему микроконтроллер не уходит в Standby, а перезагружается?
Возможно, сброшен бит nRST_STDBY в байтах конфигурации: тогда вместо входа в Standby генерируется сброс. Вторая частая причина — не сброшен флаг пробуждения WUF или флаг выбранного источника RTC: по табл. 31 RM0090 их сбрасывают до команды WFI.
Что делать с выводами в Standby?
Учитывать, что все они переходят в высокоимпедансное состояние, кроме вывода сброса, PC13 в роли RTC_AF1 и PA0 в роли WKUP (RM0090, разд. 5.3.7). Внешние нагрузки, которые должны оставаться выключенными, подтягивают резисторами к нужному уровню — выход микроконтроллера их больше не держит.
Источники
- STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439, Rev 21 — разд. 5.3.6: Standby даёт наименьшее потребление — deepsleep ядра с выключенным стабилизатором, домен 1,2 В обесточен, PLL, HSI и HSE выключены; содержимое SRAM и регистров теряется, кроме резервного домена (регистры RTC, резервные регистры RTC, резервная SRAM) и схемы Standby; в Standby можно оставить IWDG, RTC, LSI и LSE; флаг SBF в PWR_CSR показывает, что МК был в Standby; после пробуждения сбрасываются все регистры; в тексте разд. 5.3.6 исключением назван PWR_CR, но это опечатка: по разд. 5.4.1 PWR_CR сбрасывается при выходе из Standby, а по разд. 5.4.2 PWR_CSR с флагом SBF — нет; табл. 31: вход — WFI или WFE при SLEEPDEEP = 1, PDDS = 1, сброшенных WUF и флаге выбранного источника RTC; выход — передний фронт на выводе WKUP, будильники A и B RTC, пробуждение RTC, tamper, метка времени, внешний сброс NRST, сброс IWDG; задержка выхода — фаза сброса; разд. 5.3.7: в Standby все выводы в высокоимпедансном состоянии, кроме вывода сброса, RTC_AF1 (PC13), если он настроен, и WKUP (PA0), если он разрешён; разд. 3.7.1, байт USER: бит 7 nRST_STDBY — 0 означает, что при входе в Standby генерируется сброс, 1 — сброса нет; бит 6 nRST_STOP — то же для режима Stop; разд. 5.4.1: бит CSBF регистра PWR_CR сбрасывает флаг SBF
- Arm. Cortex-M4 Devices Generic User Guide, ARM DUI 0553B (ID012616) — разд. 2.5: команды WFI и WFE переводят ядро в сон, бит SLEEPDEEP регистра SCR выбирает глубокий сон, бит SLEEPONEXIT — уход в сон при возврате из обработчика
Нашли ошибку?
Смотрите также
- Режим StopРежим низкого потребления STM32: такты остановлены, ОЗУ и регистры сохранены
- Резервный домен (backup domain)Часть STM32 с питанием от VBAT: RTC, LSE и резервные регистры
- RTCСчётчик времени в режимах сна: источники такта, счётчик и календарь
- Флаги причины сбросаКак узнать, почему перезапустился микроконтроллер
- Байты конфигурации (option bytes)Настройки защиты и режимов STM32 во флеш-памяти
- STM32F4Cortex-M4 с FPU: от F401 и F411 до F429 и F469 — линейки и распиновки