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

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

Power Management часть 1. Управление питанием в микроконтроллерах Cortex-M
Power Management часть 2. Управление питанием в микроконтроллерах STM32F
Power Management часть 3. Управление питанием в микроконтроллерах STM32L

18.5 Инспекторы напряжения питания

Большинство микроконтроллеров STM32 предоставляют два супервизора напряжения питания: BOR и PVD. BOR (Brownout Reset) это блок, который сохраняет состояние сброса микроконтроллера для тех пор, пока напряжение питания не достигнет заданного порогового значения VBOR. VBOR настраивается через Option bytes микроконтроллера. По умолчанию BOR выключен. Пользователь может выбрать от трех до пяти программируемых пороговых значений VBOR. Для получения более полной информации по характеристикам BOR обратитесь к разделу “Электрические характеристики” в даташите на микроконтроллер. Те микроконтроллеры STM32, которые не имеют BOR, обычно имеют аналогичный модуль, называемый POR (Power On Reset)/PDR (Power Down Reset), который выполняет ту же операцию, что и BOR, но с фиксированным и, настроенным на заводе, пороговым значением напряжения.

Прошивка устройства может активно контролировать электропитание с помощью программируемого детектора напряжения PVD (Programmable Voltage Detector). PVD позволяет настроить напряжение для мониторинга, и если это напряжение VDD выше или ниже заданного уровня, то устанавливается соответствующий бит в регистре управления питанием PWR->CSR. При соответствующей настройке микроконтроллер может генерировать прерывание через EXTI контроллер внешних прерываний. Чтобы включить или отключить PVD в микроконтроллерах с данной функцией HAL имеет функции HAL_PWR_EnablePVD() и HAL_PWR_DisablePVD(), а для настройки уровня напряжения предоставляется функция HAL_PWR_ConfigPVD(). Чтобы получить более подробную информацию по этим функциям можете обратиться к модулю HAL_PWREx CubeHAL.

18.6 Отладка в режимах с пониженным энергопотреблением

По умолчанию, отладочное соединение теряется, если приложение переводит микроконтроллер в режим сна, остановки или ожидания, во время использования функций отладки. Это связано с тем, что ядро Cortex-M перестает тактироваться. Однако, установив некоторые биты конфигурации в регистре DBGMCU_CR компонента DBGMCU микроконтроллера, можно использовать отладку даже при использовании режимов с пониженным энергопотреблением.

CubeHAL имеет удобные функции для включения и отключения отладки в режиме с пониженным энергопотреблением. Функция HAL_DBGMCU_EnableDBGSleepMode() используется для включения отладки в спящем режиме; функции HAL_DBGMCU_EnableDBGStopMode() и HAL_DBGMCU_EnableDBGStandbyMode() позволяют использовать интерфейс отладки в режимах остановки и ожидания соответственно.

Важно отметить, что, если мы хотим отлаживать микроконтроллер в режиме с пониженным энергопотреблением, мы также должны оставить включенным периферийное устройство GPIO, соответствующее выводам SWDIO / SWO / SWCLK. На всех платах Nucleo эти выводы совпадают с PA13, PA14 и PB3.

Обратите внимание, что перед включением отладки микроконтроллера в режимах с пониженным энергопотреблением интерфейс DBGMCU должен быть включен путем вызова макроса __HAL_RCC_DBGMCU_CLK_ENABLE().

18.7 Использование калькулятора энергопотребления CubeMX

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

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

Главное окно калькулятора энергопотребления сubemx
Рисунок 10. Главное окно калькулятора энергопотребления сubemx

На рисунке 10 показан главный вид калькулятора энергопотребления Cubemx. Чтобы его использовать, мы должны сначала выбрать источник питания VDD, в противном случае утилита не позволит нам выстроить шаги последовательности питания. Следующим необязательным условием является выбор батареи, используемой для питания микроконтроллера в отсутствие основного напряжения питания. Это может быть полезно для оценки автономности работы устройства. Можно выбрать из списка известных типов батарей или добавить свои пользовательские настройки.

Нажав на зеленый “+”, мы можем добавить шаг последовательности. Здесь можно указать режим питания (активный, спящий и т.д.), конфигурацию памяти (включен/отключен FLASH, ART и т.д.) и уровень напряжения питания. В этом же диалоговом окне мы также можем выбрать частоту тактирования микроконтроллера, продолжительность шага и включенные периферийные устройства.

С помощью этого инструмента мы можем выяснить сколько энергии потребуется микроконтроллеру. В микроконтроллерах L0, L1 и L4 также можно включить проверку переходов, которая позволяет определить недопустимые переходные состояния (например, мы не можем переключиться из активного режима в спящий режим с пониженным энергопотреблением, минуя активный режим с пониженным энергопотреблением). Для получения дополнительной информации смотрите документ UM1718 от ST.

18.8 Пример: использование сторожевых таймеров в режимах пониженного энергопотребления

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

Если вам необходимо использовать оба сторожевых таймера и режимы энергосбережения в вашем приложении, то вам нужно использовать небольшой трюк, основанный на том, что содержимое памяти SRAM сохраняется до следующего сброса. Таким образом, для отслеживания сброса, вызванного сторожевым таймером во время нахождения в режиме пониженного энергопотребления, вы можете использовать переменную, которая отслеживает этот факт (например, вы устанавливаете содержимое переменной uint32_t в специальный ключ перед переходом в режим пониженного энергопотребления). После сброса микроконтроллера, вы можете проверить содержимое этой переменной и избежать запуска сторожевого таймера, если эта переменная настроена соответствующим образом.

Однако, необходимо “безопасное” место для хранения этой переменной, иначе она может быть перезаписана процедурами запуска. Поэтому лучше всего уменьшить размер области SRAM внутри файла mem.ld и поместить эту переменную в конец памяти SRAM, где обычно начинается основной стек:

volatile uint32_t *lpGuard = (0x20000000 + SRAM_SIZE);

Для примера, предположим, что микроконтроллер STM32F030R8 с 8кб SRAM и предположим, что мы определяем область SRAM в файле mem.ld следующим образом:

MEMORY {
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
SRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K - 4
}

мы имеем то, что макрос SRAM_SIZE будет равен 0x2000-4 = 0x1FFC. Содержимое переменной lpGuard будет размещено по адресу 0x2000 1FFC.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *