Как спроектировать систему на STM32 с низким энергопотреблением

Как спроектировать систему на STM32 с низким энергопотреблением

Один и тот же микроконтроллер STM32, одна и та же батарея и один и тот же автономный сенсорный узел могут показывать совершенно разное время работы. Причина обычно не в самом кристалле, а в том, как прошивка и окружающая микроконтроллер схема управляют питанием.

Микроконтроллеры STM32 поддерживают широкий набор режимов пониженного энергопотребления. Однако во многих проектах эти возможности почти не используются: типовой шаблон запускает систему в режиме Run, и процессор остаётся активным независимо от того, требуется ли в данный момент выполнение кода.

Как добиться действительно низкого энергопотребления STM32? Именно этому и посвящена данная статья.

Иерархия режимов энергопотребления

В этой статье режимы энергопотребления рассматриваются на примере STM32L476. Для других семейств названия режимов, доступная периферия и значения тока могут отличаться, поэтому их следует проверять по даташиту конкретного микроконтроллера.

Run

В режиме Run процессор выполняет код, а периферийные блоки тактируются в соответствии с настройками RCC.

При частоте 80 МГц в диапазоне напряжения Range 1 STM32L476 обычно потребляет около 9,9–10,2 мА при выполнении кода из Flash и отключённой периферии. Конкретное значение зависит от выполняемого кода, настроек кэша и ART Accelerator, источника тактирования и активности периферийных блоков.

Это режим с максимальной производительностью, но и с самым высоким током потребления.

Sleep

В режиме Sleep тактирование ядра останавливается, однако содержимое ОЗУ сохраняется, а периферийные блоки могут продолжать работать.

При частоте системной шины 80 МГц типичный ток STM32L476 составляет около 2,96 мА при отключённой периферии. Пробуждение происходит примерно за шесть тактов процессора при поступлении разрешённого прерывания или события.

Sleep подходит для коротких пауз между задачами, когда требуется практически мгновенная реакция системы.

Stop 2

В Stop 2 останавливаются высокочастотные генераторы и большая часть тактирования домена VCORE. При этом содержимое SRAM и регистров сохраняется, а отдельные низкопотребляющие периферийные блоки могут продолжать работу и формировать события пробуждения.

Для STM32L476 при напряжении 3,0 В и температуре 25°C типичный ток составляет:

  • около 1,18 мкА без RTC;
  • около 1,67 мкА при работающем RTC, тактируемом от кварцевого генератора LSE в режиме низкой мощности.

При пробуждении с выполнением кода из Flash и использованием MSI на частоте 48 МГц типичное время выхода из Stop 2 составляет около 8 мкс.

Именно Stop 2 часто используется в автономных сенсорных устройствах между измерениями: состояние программы сохраняется, а потребление остаётся на уровне единиц микроампер.

Standby

В режиме Standby внутренний домен VCORE отключается. Содержимое SRAM1 и большинство регистров теряются, а после пробуждения выполнение начинается с вектора сброса.

Для STM32L476 можно дополнительно сохранить 32 КБ SRAM2. При напряжении 3,0 В и температуре 25°C типичный ток составляет приблизительно:

  • 150 нА без RTC и без сохранения SRAM2;
  • 652 нА с RTC от кварцевого LSE;
  • дополнительно около 236 нА при сохранении SRAM2.

Таким образом, Standby с сохранением 32 КБ SRAM2 потребляет около 386 нА без RTC или около 888 нА с RTC от LSE.

Этот режим подходит для длительных периодов бездействия, когда допустим повторный запуск программы после пробуждения.

Shutdown

Shutdown обеспечивает минимальное потребление, но отключает внутренние стабилизаторы, SRAM и контроль напряжения BOR/PVD. Сохраняются регистры резервного домена, а RTC при необходимости может продолжать работу.

При 3,0 В и 25°C типичный ток STM32L476 составляет около:

  • 64 нА без RTC;
  • 554 нА с RTC, работающим от кварцевого LSE.

Время пробуждения составляет примерно 256 мкс, после чего система запускается заново.

Самый глубокий режим не всегда даёт минимальное среднее энергопотребление. Необходимо учитывать частоту пробуждений, энергию перехода между режимами, время активной обработки и требования к сохранению состояния. При частых пробуждениях Stop 2 может оказаться эффективнее Standby или Shutdown.

Архитектура прошивки: сон вместо постоянного опроса

Наибольший выигрыш обычно даёт не отдельная настройка регистра, а изменение архитектуры прошивки: переход от постоянного опроса к событийной модели.

Цикл вида:

				
					while (1)
{
    check_sensor();
}
				
			

постоянно удерживает процессор в режиме Run, даже когда состояние датчика не меняется.

В низкопотребляющей архитектуре таймер, внешний вход, RTC, UART или другой периферийный блок пробуждает ядро только при появлении реальной задачи. После обработки события микроконтроллер как можно быстрее возвращается в Sleep или Stop.

Обычный линейный цикл при этом часто приходится преобразовывать в конечный автомат, реагирующий на события. Для устройства, которое выполняет измерение один раз в секунду или передаёт данные несколько раз в час, такая архитектура может снизить средний ток на порядок и более.

Источники пробуждения и RTC

Для выхода из режима пониженного энергопотребления должно произойти разрешённое событие. В зависимости от выбранного режима и конкретной модели это может быть:

  • внешний сигнал на линии EXTI;
  • таймер RTC или будильник RTC;
  • низкопотребляющий таймер LPTIM;
  • приём данных через поддерживаемый USART или LPUART;
  • распознавание адреса I²C;
  • событие компаратора;
  • независимый сторожевой таймер;
  • один из специальных выводов WKUP.

Важно учитывать, что не вся периферия доступна во всех режимах. Например, в Stop 2 у STM32L476 работает только ограниченный набор блоков, включая LPUART1, I²C3, LPTIM1, RTC и компараторы.

В устройствах с батарейным питанием RTC особенно важен. При тактировании от внешнего низкочастотного кварцевого генератора LSE он продолжает работать в Stop, Standby и Shutdown и может пробуждать систему по расписанию без дополнительной внешней схемы.

Типичная структура автономного сенсорного узла выглядит следующим образом:

  • Микроконтроллер находится в Stop 2.
  • RTC пробуждает его, например, каждые 10 секунд.
  • Система включает датчик и выполняет измерение.
  • При необходимости данные передаются по радиоканалу.
  • Периферия отключается.
  • Микроконтроллер снова переходит в Stop 2.

Пример кода: Stop 2 с пробуждением от RTC

Ниже приведён упрощённый пример для STM32L4. Предполагается, что RTC тактируется от LSE с частотой 32,768 кГц.

При делении RTCCLK на 16 частота таймера пробуждения составляет 2048 Гц. Значение 10 × 2048 − 1 соответствует интервалу приблизительно 10 секунд.

				
					static volatile uint8_t rtc_wakeup_event = 0U;

/* Вызывается из обработчика прерывания RTC */
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
    if (hrtc->Instance == RTC)
    {
        rtc_wakeup_event = 1U;
    }
}

void Configure_RTC_Wakeup(void)
{
    /* Перед изменением параметров таймер необходимо отключить */
    HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);

    if (HAL_RTCEx_SetWakeUpTimer_IT(
            &hrtc,
            (10U * 2048U) - 1U,
            RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
    {
        Error_Handler();
    }
}

void LowPower_MainLoop(void)
{
    Configure_RTC_Wakeup();

    while (1)
    {
        if (rtc_wakeup_event != 0U)
        {
            rtc_wakeup_event = 0U;

            /* Измерение и передача выполняются вне обработчика прерывания */
            Take_Sensor_Reading();
            Transmit_Data();
        }

        Prepare_Peripherals_For_Stop2();

        /*
         * Останавливаем SysTick, иначе его периодическое прерывание
         * будет пробуждать ядро.
         */
        HAL_SuspendTick();

        /* Переход именно в Stop 2 */
        HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);

        /*
         * Выполнение продолжается здесь после пробуждения.
         * Если приложение использует PLL, HSE или другую рабочую
         * конфигурацию тактирования, её необходимо восстановить.
         */
        SystemClock_Config();

        HAL_ResumeTick();
    }
}
				
			

Для STM32L4 режим Stop 2 следует активировать через HAL_PWREx_EnterSTOP2Mode(). Функция HAL_PWR_EnterSTOPMode() относится к другой структуре режимов и не гарантирует переход именно в Stop 2.

Кроме того, длительную обработку, чтение датчиков или передачу данных не следует выполнять непосредственно в callback-функции RTC. Обработчик должен установить флаг, после чего основная программа выполнит необходимую работу.

После выхода из Stop 2 микроконтроллер может работать от выбранного источника пробуждения, например MSI или HSI16. Если периферия рассчитывает на прежнюю частоту PLL или HSE, конфигурацию системного тактирования необходимо восстановить до обращения к этой периферии.

Управление тактированием и периферией

Правильный выбор режима сна важен, однако значительная часть энергии часто расходуется блоками, которые продолжают работать без необходимости.

Отключайте тактирование неиспользуемых блоков

Даже если программа не обращается к периферийному модулю, включённое тактирование его шины и внутренних регистров увеличивает динамическое потребление.

Отключайте через RCC тактирование неиспользуемых GPIO, таймеров, SPI, UART, ADC, DMA и других блоков.

Переводите неиспользуемые GPIO в аналоговый режим

Неиспользуемые выводы рекомендуется настраивать как аналоговые входы без подтяжки.

В таком режиме отключается цифровой входной буфер и его триггер Шмитта. Это предотвращает переключения на плавающем входе и снижает потребление.

При этом нельзя бездумно переводить в аналоговый режим выводы, которые управляют внешними ключами, источниками питания или должны сохранять определённый логический уровень.

Не снижайте частоту автоматически до минимума

Уменьшение частоты снижает мгновенный ток, но одновременно увеличивает время выполнения задачи. Поэтому минимальная частота не всегда обеспечивает минимальную энергию за один рабочий цикл.

Для STM32L4 хорошая энергоэффективность часто достигается в Range 2 при частотах около 24–26 МГц. В некоторых приложениях выгоднее быстро выполнить вычисления и снова перейти в Stop, чем долго работать на очень низкой частоте.

Оптимальную частоту следует выбирать по энергии полного цикла, а не только по мгновенному току.

Отключайте отладку в низкопотребляющих режимах

Во время отладки настройки DBGMCU могут сохранять активными внутренние тактовые сигналы или изменять поведение Stop и Standby.

В производственной прошивке не следует оставлять включёнными функции отладки в режимах сна, если они не требуются. Измерять минимальный ток также лучше без подключённого отладчика и без активного режима отладки Stop.

Измеряйте потребление всей платы

Микроконтроллер может потреблять единицы микроампер, но общий ток устройства при этом останется высоким из-за внешних компонентов.

Частые источники скрытого потребления:

  • светодиод, оставшийся включённым;
  • подтягивающий резистор малого сопротивления;
  • датчик, не переведённый в сон;
  • радиомодуль в режиме ожидания;
  • преобразователь уровней;
  • внешняя Flash-память;
  • стабилизатор с высоким собственным током;
  • ток через защитные диоды выводов;
  • цепь измерения напряжения батареи.

Низкое потребление микроконтроллера само по себе ещё не означает низкое потребление устройства.

Справочная таблица

Значения ниже приведены для STM32L476 при температуре 25°C и напряжении питания 3,0 В.

РежимТипичное время пробужденияТипичный токСохранение состоянияТипичное применение
Run, 80 МГц, Range 1Не применяетсяоколо 10 мАПолноеАктивные вычисления
Sleep, 80 МГцоколо 6 тактов CPUоколо 2,96 мАSRAM и регистрыКороткие паузы
Stop 2около 8 мкс из Flash1,18 мкА / 1,67 мкА с RTCПолное сохранение SRAM и регистровПериодические измерения
Standby с 32 КБ SRAM2около 14 мксоколо 386 нА / 888 нА с RTCТолько 32 КБ SRAM2 и резервный доменДлительный сон с частичным сохранением данных
Standby без SRAMоколо 14 мксоколо 150 нА / 652 нА с RTCТолько резервный доменРедкие пробуждения
Shutdownоколо 256 мксоколо 64 нА / 554 нА с RTCРезервные регистры, без SRAMМаксимально длительное бездействие

Особенности печатной платы для низкого энергопотребления

Даже правильно написанная прошивка не обеспечит расчётное время автономной работы, если окружающая микроконтроллер схема не проектировалась с тем же вниманием к току потребления.

Выбирайте стабилизатор с низким собственным током

Когда STM32 потребляет 1–2 мкА в Stop 2, стабилизатор с собственным током 20–50 мкА полностью уничтожает преимущество выбранного режима.

Необходимо учитывать:

  • собственный ток стабилизатора Iq;
  • ток в режиме отключения;
  • обратный ток;
  • эффективность при малой нагрузке;
  • минимальный рабочий ток;
  • поведение при импульсной нагрузке радиомодуля;
  • падение напряжения и ESR батареи.

Параметры преобразователя при нагрузке в несколько микроампер могут быть важнее его максимального КПД.

Отключайте питание внешней периферии

Если датчик или радиомодуль не имеет достаточно экономичного режима сна, его питание можно отключать через load switch или MOSFET, управляемый отдельным GPIO.

При этом необходимо проверить:

  • время запуска устройства после подачи питания;
  • состояние интерфейсных линий при отключённом питании;
  • возможность паразитного питания через GPIO;
  • ток утечки ключа;
  • необходимость повторной инициализации периферии.

Нельзя считать систему спящей, если микроконтроллер находится в Stop 2, а внешний радиомодуль продолжает потреблять миллиамперы.

Сокращайте пути утечки на печатной плате

При токе активного режима утечки платы обычно незаметны. На уровне единиц микроампер они становятся частью энергетического бюджета.

Причинами могут быть:

  • остатки флюса;
  • загрязнение поверхности;
  • высокая влажность;
  • слишком малые расстояния между высокоомными цепями;
  • защитные компоненты с большим обратным током;
  • неправильно подобранные подтягивающие резисторы.

Для высокоомных измерительных цепей особенно важны чистота платы и контролируемый процесс мойки.

Правильно рассчитывайте цепь LSE

Для стабильной работы RTC необходимо правильно подобрать кварцевый резонатор 32,768 кГц, нагрузочные конденсаторы и уровень возбуждения LSE.

При расчёте следует учитывать не только номинал конденсаторов, но и:

  • ёмкость выводов микроконтроллера;
  • паразитную ёмкость дорожек;
  • эквивалентное последовательное сопротивление кварца;
  • требуемую нагрузочную ёмкость;
  • выбранный уровень LSEDRV;
  • расположение компонентов на плате.

Кварц и его конденсаторы должны находиться как можно ближе к выводам OSC32_IN и OSC32_OUT. Дорожки должны быть короткими, симметричными и удалёнными от импульсных узлов.

Отделяйте высокоомные сигналы от импульсных цепей

В ультранизкопотребляющих измерительных системах амплитуда полезного сигнала может быть очень мала.

Высокоомные входы ADC, усилителей и датчиков не следует прокладывать рядом с:

  • дросселями импульсных преобразователей;
  • узлами SW;
  • высокоскоростными цифровыми линиями;
  • тактовыми генераторами;
  • антенными фидерами;
  • цепями с большими фронтами тока.

Наведённый шум может оказаться больше измеряемого сигнала, даже если средний ток всей системы соответствует расчёту.

В заключение

Проектирование малопотребляющей системы на STM32 — это не разовая настройка, а последовательность решений, которые должны быть согласованы на всех уровнях: от архитектуры прошивки до схемотехники и разводки печатной платы.

Если вам требуется надёжный партнёр для производства и сборки плат на базе STM32, YPCB может помочь с DFM-проверкой, изготовлением печатных плат и PCBA, чтобы заложенный инженерами бюджет энергопотребления сохранялся и в реальном устройстве.

Часто задаваемые вопросы

Для грубой проверки — да, для коротких импульсов тока лучше использовать анализатор питания или осциллограф с шунтом.

Можно, если напряжение подходит, а пиковый ток нагрузки не превышает возможности батареи.

LDO удобен при малой разнице напряжений, а DC/DC обычно выгоднее при большом перепаде.

Нет, после генерации кода всё равно нужно проверить SysTick, GPIO, тактирование и отладочный интерфейс.

Нет, но LSE обеспечивает более точный ход часов, чем внутренний LSI.

В backup-регистрах, резервной SRAM или внешней энергонезависимой памяти.

Да, при высокой температуре растут токи утечки, а при низкой снижается доступная ёмкость батареи.

Прокрутить вверх

获取即时报价!​​

استعلام فوری قیمت!

Request an instant quote!