Перейти к содержанию

Почему 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.

Источники

  1. 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
  2. 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

Нашли ошибку?