Power Management часть 3 (перевод из книги Mastering STM32)

Добрался я и до третьей части этой объемной главы и здесь будет про особенности управления энергопотреблением микроконтроллеров серии STM32L. Ссылки на другие части перевода:

Power Management часть 1. Управление питанием в микроконтроллерах Cortex-M
Power Management часть 2. Управление питанием в микроконтроллерах STM32F
Power Management часть 4. Использование калькулятора энергопотребления CubeMX

18.4 Управление питанием в микроконтроллерах STM32L

Серия STM32L представляет собой несколько семейств микроконтроллеров, предназначенных для приложений с низким энергопотреблением. Вот основные из них: L0, L1 и более новый L4. Эти микроконтроллеры обеспечивают больше режимов питания, чем микроконтроллеры серии STM32F, предлагая возможность точной настройки потребляемой мощности ядром и периферийными устройствами. Кроме того, в них предусмотрены специальные периферийные устройства с низким энергопотреблением (такие как LPUART или LPTIM). Все эти функции делают микроконтроллеры STM32L подходящими для устройств с батарейным питанием.

В этой части главы мы проанализируем важные характеристики управления питанием, предлагаемые микроконтроллерами STM32L, сосредоточив свое внимание в основном на семействе STM32L4.

18.4.1 Источники питания

На рисунке 6 показаны источники питания для микроконтроллеров семейства STM32L4. Как видно, для точной настройки мощности, потребляемой периферийными устройствами, эти микроконтроллеры предоставляют больше различных напряжений питания по сравнению с STM32F.

источники питания stm32l
Рисунок 6. Источники питания микроконтроллеров STM32L4

Как и в других семействах питание VDD является основным для микроконтроллера. Оно используется для питания других доменов напряжения, таких как VDDIO1, который используется для питания большинства выводов микроконтроллера, внутренний регулятор напряжения, используемый для питания домена VCORE. Как и в STM32F, здесь два программных диапазона мощности (scale1 и scale2), для того чтобы оптимизировать потребление в зависимости от максимальной рабочей тактовой частоты (благодаря технологии масштабирования напряжения, рассмотренной ранее). Интересно, что для тех микроконтроллеров, которые имеют GPIOG порт (а это в основном те, которые имеют большое число выводов) домен VDDIO2 используется для питания GPIOG независимо от остальных портов ввода/вывода. Это напряжение вместе с доменом питания USB можно включать/выключать независимо с помощью специальных функций HAL:

HAL_PWREx_EnableVddIO2();
HAL_PWREx_EnableVddUSB();

и т.д.

Чтобы обеспечить сохранение содержимого резервных регистров и работоспособность RTC при отключенном VDD, предусмотрен вывод VBAT, к которому можно подключить резервную батарею или другой источник питания. VBAT обеспечивает питание модуля RTC, генератора LSE и одного или двух выводов, используемых для пробуждения микроконтроллера из режимов глубокого сна, позволяя работать RTC даже когда отключен основной источник питания. По этой причине говорят, что VBAT питает RTC. Переключение на питание VBAT контролируется PDR. Вывод VLCD предназначен для управления контрастностью ЖК-дисплея.

18.4.2 Режимы питания

Помимо специального дизайна, который помогает снизить энергопотребление каждого компонента микроконтроллера, STM32L предоставляет пользователю до одиннадцати различных режимов питания, которые показаны на рисунке 7. Для первых трех из них значение потребления мощности на МГц составляет среднее значение энергопотребления между тем, когда процессор выполняет инструкции из flash памяти и из SRAM. Первые три режима питания основаны на режиме Run Cortex-M, а следующие 4 на спящем режиме Sleep. И все остальные режимы используют глубокий спящий режим Cortex-M.

В таблице 2 суммируются 9 режимов питания и показываются функции HAL для перевода микроконтроллера в соответствующий режим. Более подробно рассмотрим их позже.

Режимы питания STM32L
Рисунок 7. Одиннадцать режимов питания, поддерживаемых микроконтроллерами STM32L4

18.4.2.1 Режим Run

По умолчанию, после включения питания или сброса, микроконтроллер STM32L переводится в активный режим работы. Источником тактирования по умолчанию устанавливается MSI, оптимизированный по потребляемой мощности источник тактирования, который мы уже рассматривали в главе 10. Микроконтроллеры STM32L предлагают разработчикам более тонкие возможности настройки, которые позволяют снизить энергопотребление в этом режиме. Если нам не нужна большая вычислительная мощность то в качестве источника тактовой частоты мы можем оставить MSI, избежав повышенного потребления энергии, которое даст мультиплексор PLL. Уменьшая тактовую частоту до 24-26 МГц, мы можем настроить Dynamic Voltage Scaling (DVS), уменьшив напряжение VCORE до 1.0 В в более новых микроконтроллерах STM32L4. Этот режим также называется рабочим диапазоном 2 (Run range 2) и общее энергопотребление в нем может быть дополнительно уменьшено путем отключения flash памяти.

Как было сказано ранее, flash память микроконтроллеров STM32L и некоторых STM32F4 (например, STM32F446) может быть отключена даже в рабочем режиме. Функция HAL_FLASHEx_EnableRunPowerDown() выполняет эту операцию автоматически, в то время как функция HAL_FLASHEx_DisableRunPowerDown() снова ее включает. Единственным условием является то, что эта функция и все остальные, используемые при выключенном flash (включая вектора прерываний), помещаются заранее в SRAM, в противном случае мы получим Bus Fault, как только выполним данную инструкцию. Это можно легко сделать, создав собственный скрипт линкера, как мы увидим в следующей главе. По этой причине инженеры ST собрали эти подпрограммы в отдельный файл stm32f4xx_hal_flash_ramfunc.c

Сравнение режимов питания STM32L
Таблица 2. 9 из 11 режимов питания доступных в микроконтроллерах STM32L

Для дальнейшего снижения энергопотребления в активном режиме, внутренний регулятор напряжения может быть сконфигурирован в режиме пониженного энергопотребления. В этом режиме частота системы не должна превышать 2 МГц. Функция HAL_PWREx_EnableLowPowerRunMode() выполняет эту операцию автоматически. В этом режиме можно в конечном итоге отключить flash память, чтобы еще больше снизить общее энергопотребление.

Малопотребляющий активный режим работы представляет собой лучший компромисс в микроконтроллерах STM32L с точки зрения энергоэффективности, как показано на рисунке 8. Как видно, включение ускорителя ART повышает производительность, но также снижает динамическое потребление. Наилучшее решение достигается, когда кэш инструкций (Instruction Cache) включен, кэш данных (Data Cache) включен, а буфер предварительной выборки (Prefetch Buffer) выключен, поскольку данная конфигурация уменьшает количество обращений к flash памяти.

Малое динамическое потребление flash памяти обеспечивает небольшое потребление каждый раз, когда прошивке требуется доступ к flash памяти. Потребление SRAM1 и SRAM2 довольно похожи, но SRAM2 намного более энергоэффективен, чем SRAM1, когда не заремапен по адресу 0, благодаря его доступу в состояние 0-wait.

Оптимизация энергопотребления в STM32L
Рисунок 8. Оптимизация потребления энергии против частоты тактирования в серии STM32L4

18.4.2.2 Режим Sleep

Спящие режимы позволяют использовать все периферийные устройства, одновременно обеспечивая самое быстрое время пробуждения. В этих режимах процессор останавливает свою работу и тактирование каждого периферийного устройства может быть настроено для включения или отключения в спящем режиме или в спящем режиме с низким энергопотреблением. Данные режимы включаются с помощью инструкций WFI и WFE. Чтобы перевести микроконтроллер в один из двух спящих режимов, CubeHAL предоставляет функцию:

void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry);

Первый параметр, Regulator, может принимать значения PWR_MAINREGULATOR_ON и PWR_LOWPOWERREGULATOR_ON: первый переводит микроконтроллер в спящий режим, второй — в спящий режим с низким энергопотреблением. Второй параметр SLEEPEntry может принимать значения PWR_SLEEPENTRY_WFI или PWR_SLEEPENTRY_WFE: как следует из названий этих значений, первый выполняет инструкцию WFI, а второй — WFE.

Обратите внимание, что для микроконтроллеров STM32L частота тактирования не должна превышать значение диапазона 1 MSI в этом режиме питания. Пожалуйста, обратитесь к документации на конкретный микроконтроллер для уточнения информации о работе регулятора напряжения и периферийных устройств.

Если используется инструкция WFI, то любое прерывание от периферийного устройства, подтвержденное в NVIC, может вывести устройство из спящего режима.

Если используется инструкция WFE, то микроконтроллер выходит из спящего режима как только происходит событие. Событие пробуждения может быть сгенерировано:

  • включено прерывание регистре управления периферийного устройства, но не в NVIC, установлен бит SEVONPEND в регистре управления System Control Register – когда микроконтроллер возобновляет работу после инструкции WFE, бит ожидания прерывания от периферии и бит IRQ в регистре NVIC должны быть очищены;
  • сконфигурировано внешнее и внутреннее прерывание линии EXTI в режиме события – когда микроконтроллер возобновляет работу после инструкции WFE, нет необходимости очищать бит ожидания прерывания периферийного устройства или NVIC, поскольку бит ожидания, соответствующий данному событию, не устанавливается.

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

18.4.2.2.1 Пакетный режим сбора данных

Пакетный режим сбора данных или Batch Acquisition Mode (BAM) — это неявный и оптимизированный режим передачи данных. Только одно необходимое периферийное устройство передачи данных (например, I2C), один канал DMA и SRAM конфигурируются с включением тактирования в спящем режиме.

Микроконтроллер может войти в спящий режим или в спящий режим с низким энергопотреблением. Обратите внимание, что тактовая частота I2C может быть установлена в 16 МГц даже в спящем режиме с низким энергопотреблением, что позволяет позволяет поддерживать fast mode режим работы I2C. Тактирование USART и LPUART также может быть от генератора HSI. Типичная область применения BAM — концентраторы датчиков.

18.4.2.3 Режим Stop

В микроконтроллерах STM32L есть 2 различных режима остановки, названных STOP1 и STOP2. Данные режимы основаны на режиме глубокого сна Cortex-M в сочетании с управлением тактированием периферийных устройств. Регулятор напряжения может быть настроен как в нормальном режиме работы, так и в режиме пониженного энергопотребления. В режиме STOP1 все тактирование домена VCORE останавливается; генераторы PLL, MSI, HSI16 и HSE отключены. Некоторые периферийные устройства с возможностью пробуждения (I2C, USART и LPUART) могут включить HSI16 для получения фрейма данных и выключать его, если фрейм не является пробуждающим. В этом случае тактирование HSI16 распространяется только на периферийное устройство, запрашивающее его. SRAM1, SRAM2 и содержимое регистров сохраняются. В режиме STOP1 могут работать несколько периферийных устройств: PVD, контроллер LCD, цифро-аналоговые преобразователи, операционные усилители, компараторы, независимый сторожевой таймер, таймеры LPTIM (если таковые есть), I2C, USART и LPUART. STOP2 режим отличается от режима STOP1 тем, что доступны только следующие периферийные устройства: PVD, контроллер LCD, компараторы, независимый сторожевой таймер, таймеры LPTIM1, I2C, USART и LPUART.

BOR (о данном супервизоре будет рассказано в следующей части перевода) всегда доступен в обоих режимах STOP1 и STOP2. Потребление будет выше когда используется порог выше VBOR0.

Для перевода микроконтроллера в режим остановки HAL предоставляет функцию:

void HAL_PWREx_EnterSTOPxMode(uint8_t STOPEntry);

где ‘x’ имеет значение 0, 1 и 2 в зависимости от режима остановки. Параметр STOPEntry может принимать значения PWR_STOPENTRY_WFI или PWR_STOPENTRY_WFE. Для совместимости с другими версиями HAL также доступна функция HAL_PWR_EnterSTOPMode().

Чтобы войти в режим остановки все биты ожидания линии EXTI, все биты ожидания прерывания периферийных устройств и флаг RTC Alarm должны быть сброшены. В противном случае процедура входа в режим остановки игнорируется и выполнение программы продолжается. В режим STOP1 можно войти из активного режима и из режима с низким энергопотреблением, в то время как в режим STOP2 невозможно перейти из режима с низким энергопотреблением.

Любая линия EXTI, сконфигурированная в режиме прерывания или события, вынуждает процессор выйти из режима остановки, если вход в него был совершен из режима с низким энергопотреблением с использованием инструкций WFI или WFE. Поскольку и HSE, и PLL отключаются перед входом в режим остановки, при выходе из него тактирование микроконтроллера переключается на HSI. Это означает, что вам нужно позаботиться о настройке тактирования и переконфигурировать его для желаемой SYSCLK.

18.4.2.4 Режим Standby

В микроконтроллерах STM32L предусмотрено два режима ожидания, которые основаны на глубоком спящем режиме Cortex-M. Данный режим характеризуется наименьшим энергопотреблением, при котором можно сохранить 32 кбайта SRAM2, поддерживается автоматическое переключение с VDD на VBAT, а уровень портов ввода/вывода можно настроить с помощью независимых схем подтяжек к питанию и земле.

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

Для перевода микроконтроллера в режим ожидания в HAL предусмотрена функция:

void HAL_PWR_EnterSTANDBYMode(void);

Если мы хотим сохранить 32 кб SRAM2, то мы можем вызвать функцию:

void HAL_PWREx_EnableSRAM2ContentRetention(void);

прежде чем мы вызовем функцию HAL_PWR_EnterSTANDBYMode().

В микроконтроллерах STM32L каждый вывод может быть сконфигурирован с подтяжкой или без путем вызова функции HAL_PWREx_EnablePullUpPullDownConfig(). Это позволяет контролировать состояние входов внешних компонентов даже в режиме ожидания. Для получения дополнительной информации по данному вопросу обратитесь к документации на конкретный микроконтроллер.

Микроконтроллер может выйти из режима ожидания когда происходит сброс (вывод NRST), сброс IWDG, при нарастающем фронте на одном из активированных выводов WKUPx или событие RTC. Все регистры сбрасываются после выхода из режима ожидания, за исключением регистра управления питанием PWR->CSR. После выхода из режима ожидания выполнение программы возобновляется так же, как и после сброса. Используя макрос:

__HAL_PWR_GET_FLAG(PWR_FLAG_SB);

мы можем проверить, сбрасывается ли микроконтроллер после выхода из режима ожидания. Поскольку и HSE, и PLL отключаются перед входом в режим ожидания, то при выходе из него источником системной тактовой частоты устанавливается HSI. Это означает, что наш код должен переконфигурировать дерево тактирования в соответствии с желаемой SYSCLK.

18.4.2.5 Режим Shutdown

Режим выключения — режим с наименьшим энергопотреблением, около 30 нА при 1,8 В в микроконтроллерах STM32L4. Этот режим похож на режим ожидания, но без какого-либо контроля питания: BOR отключен, переключения на VBAT не поддерживается. LSI также недоступен, а следовательно и независимый сторожевой таймер IWDG. Когда микроконтроллер выходит из режима выключения, генерируется сброс: все регистры, кроме тех, которые находятся в резервном домене, сбрасываются. 128- байтовые резервные регистры сохраняются в режиме отключения. При выходе из него тактирование MSI работает на частоте 4 МГц.

Для перевода микроконтроллера в режим отключения в HAL предусмотрена функция:

void HAL_PWREx_EnterSHUTDOWNMode(void);

Микроконтроллер выходит из режима выключения, когда происходит внешний сброс (вывод NRST), при нарастающем фронте на одном из активированных выводов WKUPx или событие RTC. Все регистры сбрасываются после выхода из режима выключения, включая регистр управления питанием PWR->CSR. После чего выполнение программы возобновляется так же, как и после сброса.

18.4.3 Переходы режимов питания

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

На рисунке 9 показаны разрешенные переходы между режимами питания в микроконтроллере STM32L4. Как видно из рисунка, из активного режима можно получить доступ к любому из режимов с низким энергопотреблением, кроме спящего режима с низким потреблением. Для этого требуется поочередно сперва перейти в активный режим с низким потреблением и затем выполнить инструкцию WFI или WFE пока внутренний регулятор напряжения работает в режиме низкого потребления. Верно и обратное, при выходе из спящего режима с низким потреблением микроконтроллер находится в активном режиме с низким потреблением.

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

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

Рисунок 9. Разрешенные переходы между режимами энергопотребления в микроконтроллерах STM32L4

18.4.4 Периферийные устройства с низким энергопотреблением

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

18.4.4.1 LPUART

UART с низким энергопотреблением (LPUART) — это интерфейс, который обеспечивает двусторонний обмен данными с ограниченным потреблением энергии. Для обеспечения связи со скоростью до 9600 бод/с требуется тактовая частота LSE 32,768 кГц. Соответственно, добиться более высоких скоростей передачи данных можно при тактировании от других источников.

Даже когда микроконтроллер находится в режиме остановки, LPUART может ожидать входящее сообщение, имея при этом чрезвычайно низкое энергопотребление. LPUART включает в себя всю необходимую аппаратную поддержку, чтобы реализовать асинхронный последовательный канал передачи данных с минимальным энергопотреблением. Поддерживается полудуплексная однопроводная связь и работа в режиме модема (CTS/RTS). Также поддерживается мультипроцессорная связь. В режиме STOP2 может использоваться DMA для передачи и приема данных.

Для программирования LPUART используются те же функции из модуля HAL_UART.

18.4.4.2 LPTIM

Малопотребляющий таймер (LPTIM) это 16-битный таймер, который спроектирован, исходя из последних достижений в снижении энергопотребления. Благодаря разнообразию источников тактовых импульсов LPTIM может работать независимо от выбранного режима питания, в отличие от стандартных таймеров STM32, которые не работают в режимах остановки. Учитывая его способность работать даже без внутреннего источника синхронизации, LPTIM может использоваться в качестве счетчика импульсов, который может быть полезен в некоторых приложениях. Более того, его возможности пробуждать систему из режимов с низким энергопотреблением позволяют реализовать функции таймаута с очень низким энергопотреблением. В следующей главе о FreeRTOS мы будем использовать таймер LPTIM в качестве времязадающего для режимов ожидания. LPTIM предоставляет гибкую схему синхронизации, которая обеспечивает необходимые функциональные возможности и производительность, минимизируя энергопотребление.

Ниже перечислены функциональные возможности LPTIM:

  • 16-битный счетчик
  • 3-битный предделитель с 8 возможными значениями деления (1, 2, 4, 8, 16, 32, 64, 128)
  • Выбираемый источник тактирования (внутренний LSE, LSI, HSI16 или APB; внешний через ULPTIM вход, работает без LP генератора и используется приложением счетчика импульсов)
  • 16-битный регистр для периода
  • 16-битный регистр сравнения
  • Непрерывный или одноразовый режим
  • Выбор программно или аппаратного входа триггера
  • Конфигурируемый выход: импульсный или ШИМ
  • Режим кодирования

Для программирования LPTIM используется специальный модуль HAL_LPTIM.


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

3 Ответов в “Power Management часть 3 (перевод из книги Mastering STM32)

  1. Спасибо тебе чувак! Очень помогла инфа!
    Вопрос такой: есть stm32L073. он всё время в standby режиме. всегда. просыпается только по тамперам RTC или wake up таймеру.
    флаги тамперов RTC_FLAG_TAMP1F и RTC_FLAG_TAMP2F отображаются и норм работают. А вот вейкап таймер — нет. как его увидеть? и какой он?

    вопрос два: как сделать так чтобы чип из стендбая просыпался по таймеру и по wkup пинам.
    сейчас чушь какая — то: вейкап пины работают пока не пройдёт время на вейкап таймере.
    кубик + атллик тру студия. чип на нуклео L073rz

    1. Привет, я сделал перевод из книги, сам на практике еще не пробовал заводить WKUP пины, так что не подскажу.

Комментарии отключены.