Почему STM32L0 потребляет много тока в режиме Stop?
Обновлено Редакция GAW
У STM32L0 режим Stop даёт ток в единицы микроампер, но только если выключено всё, что его держит. RM0377 перечисляет эти источники по разделам: опорный источник, регулятор, выводы, отладка, периферия. Режим кратко описан в термине «Режим Stop», а здесь — что проверять, если ток на порядок выше ожидаемого.
Что держит ток в Stop
| Причина | Где в RM0377 | Что сделать |
|---|---|---|
| Отладчик и бит DBG_STOP | разд. 27.9 | отключить отладчик, сбросить питание |
| Опорный источник VREFINT, BOR, PVD | разд. 6.2.4, бит ULP | поставить ULP = 1 перед входом в Stop |
| Регулятор в основном режиме | разд. 6.3.9, бит LPSDSR | поставить LPSDSR = 1 |
| АЦП включён | разд. 6.3.9, бит ADDIS | выключить АЦП через ADDIS |
| Цифровые входы висят в воздухе | разд. 8.4.1 | вернуть неиспользуемые выводы в аналоговый режим |
| Висит флаг EXTI, периферии или RTC | табл. 39 | сбросить флаги, иначе Stop не наступает |
Отдельно — выводы. После сброса почти все они в аналоговом режиме (GPIOx_MODER = 0xFFFF FFFF у портов, кроме A), и входные буферы не потребляют ток. Код инициализации из шаблона часто переводит все выводы в цифровой вход; вход без подтяжки, на котором напряжение гуляет около порога, — источник лишнего тока (наш вывод из устройства КМОП-входа, подробнее в термине «Плавающий вход»). В Stop выводы сохраняют то состояние, в котором были.
// Enter Stop with the low-power regulator and VREFINT off (RM0377, 6.3.9, 6.4.1)
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_ULP | PWR_CR_FWU | PWR_CR_LPSDSR;
PWR->CR &= ~PWR_CR_PDDS; // Deepsleep = Stop, not Standby
PWR->CR |= PWR_CR_CWUF; // clear the wakeup flag
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI();
Биты регистра PWR_CR с назначением полей — на странице регистров PWR STM32L0. Если отладчик после входа в Stop отваливается, это отдельная история: она разобрана в ответе «Почему отладчик теряет связь со STM32 в режиме Stop». А сам ток в микроамперах меряют так, чтобы мультиметр не сбрасывал микроконтроллер при переключении пределов, — как в ответе «Как измерить ток во сне».
Похожие вопросы
Сколько ждать опорный источник после выхода из Stop с ULP = 1?
По RM0377 VREFINT запускается до 3 мс, и всё, что от него зависит — BOR, PVD, АЦП и компараторы, — в это время ненадёжно. Если поставить ещё и бит FWU, ядро продолжит работу, не дожидаясь опоры, а готовность покажет флаг VREFINTRDYF в PWR_CSR.
Почему без отладчика ток стал нормальным?
Отладчик часто сам ставит бит DBG_STOP в DBGMCU_CR, чтобы не терять связь. С ним, по RM0377, в Stop продолжают работать тактовые сигналы FCLK и HCLK от внутреннего RC-генератора, и ток получается намного больше. Измеряйте потребление после сброса по питанию, с отключённым отладчиком.
Как понять, что микроконтроллер вообще не уснул?
Проще всего — переключить вывод перед __WFI() и сразу после неё: если импульс короткий и программа идёт дальше без события пробуждения, вход в Stop был проигнорирован. По табл. 39 RM0377 так бывает, когда не сброшен флаг EXTI, флаг прерывания периферии или флаг RTC.
Источники
- STMicroelectronics. RM0377 Reference manual: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs, Rev 10 — разд. 6.2.4: потребление VREFINT в Stop и Standby заметно, бит ULP отключает его, после выхода опора стартует до 3 мс, бит FWU позволяет не ждать; разд. 6.3.9: в Stop выводы сохраняют состояние, регулятор переводят в малопотребляющий режим битом LPSDSR, АЦП отключают битом ADDIS, табл. 39 — флаги EXTI, периферии и RTC должны быть сброшены, иначе вход в Stop игнорируется; разд. 6.4.1: биты PWR_CR — LPSDSR (0), PDDS (1), CWUF (2), ULP (9), FWU (10); разд. 8.4.1: GPIOx_MODER после сброса 0xFFFF FFFF (аналоговый режим) для портов, кроме A, у порта A — 0xEBFF FCFF; разд. 27.9: DBG_STOP = 1 оставляет FCLK и HCLK включёнными в Stop
- STMicroelectronics. cmsis-device-l0, Include/stm32l053xx.h (commit 7b7ae8c) — PWR_CR_LPSDSR — бит 0, PWR_CR_CWUF — бит 2, PWR_CR_ULP — бит 9 (0x200), PWR_CR_FWU — бит 10 (0x400); DBGMCU_CR_DBG_STOP — бит 1; ADC_CR_ADDIS — бит 1; RCC_APB1ENR_PWREN — бит 28
Нашли ошибку?
Смотрите также
- STM32L0Cortex-M0+, до 32 МГц, малое потребление: L010, L0x1, L0x2 с USB, L0x3 с ЖКИ — линейки и распиновки
- Почему отладчик теряет связь со STM32, когда тот уходит в режим Stop?В Stop гаснут такты; бит DBG_STOP в DBGMCU_CR оставляет их для отладки
- Как измерить ток микроконтроллера в режиме сна?Нужен микроамперный предел или шунт, и шунт закорачивают при пробуждении
- Режим StopРежим низкого потребления STM32: такты остановлены, ОЗУ и регистры сохранены
- VREFINT (внутреннее опорное напряжение)Внутренний источник около 1,2 В на канале АЦП STM32 для расчёта VDDA