Введение
В современных условиях к микроконтроллерам предъявляются требования пониженного энергопотребления и малого тепловыделения. Выполнение таких требований обеспечивается, в первую очередь, снижением питающего напряжения ядра микроконтроллера и введением специальных режимов энергосбережения. Микроконтроллеры серии STM32 [1] включают в свой состав специальный блок управления питанием, благодаря которому полностью удовлетворяют изложенным выше требованиям.
Блок управления питанием STM32 состоит из набора регуляторов напряжения и логики управления режимами работы. В первоисточнике этот блок носит название «Power Control» или сокращённо – PWR.
Регуляторы напряжения
Для нормальной работы микроконтроллеру серии STM32 необходимо питающее напряжение от 2,0 до 3,6 В, подаваемое на выводы цепей питания VDD. Встроенный в микроконтроллер регулятор напряжения обеспечивает формирование из внешнего питающего напряжения 1,8 В для питания ядра.
Часы реального времени RTC и регистры для резервного сохранения информации могут быть запитаны отдельно от вывода VBAT и сохраняют свою работоспособность даже при отключённом питании на выводе VDD.
Структурная схема питания микроконтроллера приведена на рисунке 1.
Цепи VDDA и VSSA предназначены для питания аналоговых блоков микроконтроллера. Они должны быть гальванически связаны с цепями VDD и VSS, соответственно.
Питание АЦП и ЦАП
Чтобы обеспечить точность преобразования, блоки АЦП и ЦАП имеют отдельную цепь питания VDDA и цепь нулевого потенциала VSSA, которые необходимо дополнительно отфильтровать от помех и экранировать при разводке печатной платы.
Вывод для опорного напряжения VREF+ может быть подключён к цепи VDDA. Для повышения точности преобразования при малых максимальных уровнях напряжения на выводах АЦП и ЦАП, можно подключить вывод VREF+ к внешнему источнику опорного напряжения. Напряжение на выводе VREF+ определяет напряжение, которое соответствует максимальному значению преобразованного сигнала в АЦП и ЦАП. Напряжение на вход VREF+ может подаваться в диапазоне от 2,4 В до уровня напряжения питания VDDA.
Резервные источники питания
Для обеспечения сохранности содержимого резервных регистров (Backup) и нормального функционирования RTC в случае, когда вывод VDD отключён от источника питания, у микроконтроллера имеется вывод VBAT, который может быть подключён к резервному источнику питания, например, в виде автономного элемента питания.
От вывода VBAT питаются: блок RTC, LSE-генератор и выводы PC13…PC15, обеспечивающие функционирование часов реального времени даже при отключённом питании на выводе VDD.
Подключением питания от VBAT управляет блок сброса при пропадании питания PDR (Power Down Reset), который встроен в общий блок сброса.
В течение времени между моментом, когда напряжение VDD равно VPOR, и выходом контроллера из режима сброса, именуемым tRSTTEMPO, или после того, как был обнаружен сигнал PDR, переключатель между VDD и VBAT остаётся подключённым к VBAT.
Во время запуска микроконтроллера, в случае если время подачи питания на VDD меньше времени tRSTTEMPO и напряжение VDD больше VBAT +0,6 В, напряжение VDD может быть приложено к цепи VBAT через внутренний диод.
Если источник питания, подключённый к VBAT, слаботочный и не способен выдерживать ток, потребляемый через вывод VDD, то необходимо предусмотреть в схеме питания микроконтроллера установку внешнего диода с низким падением напряжения между источником питания и входом VBAT.
Если не планируется использовать источник резервного питания, то рекомендуется подключить между выводами VBAT и VDD керамический конденсатор ёмкостью 0,1 мкФ.
Когда на блок Backup подаётся напряжения от VDD, появляются следующие возможности:
- PC14 и PC15 используются как обычные выводы GPIO или LSE;
- PC13 может использоваться как GPIO, вывод TAMPER, калибрующий сигнал RTC или будильник RTC.
Если же на него подаётся напряжение от VBAT, то доступны следующие возможности:
- PC14 и PC15 используются только как выводы LSE;
- PC13 может использоваться как вывод TAMPER, будильник RTC.
Регулятор напряжения
Регулятор напряжения микроконтроллера самостоятельно активируется после сброса. В зависимости от режима работы микроконтроллера, регулятор напряжения функционирует следующим образом:
- в рабочем режиме микроконтроллера регулятор обеспечивает питанием блоки, работающие от напряжения 1,8 В, такие как ядро, память и цифровая периферия;
- в режиме приостановки микроконтроллера регулятор снабжает пониженным питанием блоки, работающие от напряжения 1,8 В, при этом содержимое регистров и SRAM сохраняется;
- в режиме ожидания микроконтроллера регулятор выключается. Содержимое регистров и SRAM теряется, за исключением блоков Standby и BKP.
Супервизор подачи питания
Для обеспечения стабильного запуска и работы контроллера микроконтроллеры серии STM32 имеют в своём составе встроенный супервизор подачи питания в виде схем: POR (Power On Reset – сброс при подаче питания) и PDR (Power Down Reset – сброс при снижении питания). Микроконтроллер будет находиться в режиме сброса, пока напряжение питания на выводе VDD не достигнет установленного порога POR. При снижении напряжения питания ниже порога PDR микроконтроллер вновь будет переведён в состояние сброса.
На рисунке 2 приведена временна¢я диаграмма работы супервизора.
Программируемый детектор напряжения
Для контроля напряжения питания микроконтроллер имеет программируемый детектор напряжения PVD (Programmable Voltage Detector), который сравнивает напряжение питания VDD с порогом, заданным разрядами PLS[2:0] в регистре управления питанием PWR_CR. Разрешение работы PVD устанавливается битом PVDE. Флаг PVDO, доступный в регистре PWR_CSR, указывает превышение напряжения VDD над заданным для PVD порогом. Это событие внутри микроконтроллера связано с линией 16 EXTI и может генерировать прерывание, если оно разрешено в EXTI-регистрах. Прерывание от PVD может быть сгенерировано, когда напряжение VDD станет ниже или выше порога PVD, в зависимости от конфигурации перепада (фронт или срез) на линии 16 EXTI. На программу обработчика прерывания можно возложить выполнение некоторых задач при аварийном завершении задачи. Например, сохранение важных вычисленных значений в энергонезависимой памяти.
Временная диаграмма работы PVD приведена на рисунке 3.
Режимы пониженного энергопотребления
По умолчанию после сброса микроконтроллер серии STM32 работает в режиме нормального энергопотребления. Режимы пониженного энергопотребления предназначены для снижения потребления энергии контроллером, когда нет необходимости в его функционировании. Например, при ожидании внешнего события.
Микроконтроллер может работать в следующих режимах пониженного энергопотребления:
- спящий режим – тактирование ядра остановлено, периферия, в том числе и ядро, работают;
- режим останова – тактирование всех устройств отключено;
- режим ожидания – отключён блок 1,8 В.
Снижение энергопотребления может быть осуществлено путём замедления тактирования системы и отключением тактирования периферии на шинах APB и AHB, когда они не используются.
В обычном режиме значения таких системных частот, как SYSCLK, HCLK, PCLK1 и PCLK2 могут быть программно уменьшены с помощью предварительных делителей частоты. Предварительные делители частоты могут также использоваться для замедления периферии перед переходом микроконтроллера в спящий режим.
В режиме нормального энергопотребления сигналы синхронизации HCLK и PCLKx для периферии и внешних запоминающих устройств могут быть отключены в любой момент для снижения потребления тока микроконтроллером.
Спящий режим
Вход в спящий режим осуществляется с помощью инструкций WFI (Wait for Interrupt) или WFE (Wait for Event). Есть возможность выбора механизма входа в спящий режим в зависимости от бита SLEEPONEXIT.
Если бит SLEEPONEXIT сброшен, то устройство уходит в спящий режим, как только была вызвана инструкция WFI или WFE.
Если бит SLEEPONEXIT установлен, то устройство входит в спящий режим, как только произойдёт выход из обработчика прерывания.
В спящем режиме все цепи ввода-вывода микроконтроллера сохраняют своё состояние.
Если для входа в спящий режим была задействована инструкция WFI, то выход контроллера из спящего режима может быть осуществлён вызовом любого прерывания от периферии.
Если для входа в спящий режим была задействована инструкция WFE, то выход контроллера из спящего режима осуществляется, как только происходит какое-либо событие. Это событие может быть сгенерировано следующим образом:
- включением прерывания в регистре управления периферией, но не в NVIC;
- установкой бита SEVONPEND в регистре управления ядром;
- конфигурированием внешнего или внутреннего прерывания EXTI в режиме событий.
Режим останова
Режим останова базируется на режиме глубокой спячки ядра. В этом режиме останавливаются все генераторы тактовой частоты в блоке 1,8 В, а также отключаются узлы PLL, HSI и HSE RC.
В режиме останова все цепи ввода-вывода сохраняют своё состояние.
Вход в режим останова может быть осуществлён вызовом инструкций WFI или WFE, пока:
- установлен бит SLEEPDEEP;
- очищен бит PDDS в регистре PWR_CR;
- выбран режим регулятора напряжения битом LPDS в регистре PWR_CR.
Если во время перехода устройства в спящий режим происходит программирование флэш-памяти, то переход откладывается до завершения процесса программирования.
В режиме останова можно включить независимый сторожевой таймер IWDT, часы реального времени RTC, внутренний тактирующий генератор LSI RC и внешний генератор LSE OSC, путём изменения соответствующих конфигурационных бит.
Независимый сторожевой таймер IWDT может быть запущен с помощью своего регистра. После этого его останов возможен только вводом контроллера в режим сброса.
Часы реального времени RTC включаются с помощью бита RTCEC в своём регистре управления.
Внутренний тактирующий генератор LSI RC запускается с помощью бита LSION.
Внешний генератор LSE OSC на 32,768 кГц активируется с помощью бита LSEON.
Выход из режима останова зависит от вхождения в этот режим. Если вход был инициирован с помощью WFI, то выход возможен с помощью любой линии EXTI, сконфигурированной в режиме прерывания. Если вход был выполнен с помощью WFE, то выход производится с помощью любой линии EXTI, сконфигурированной в режиме события. Во время выхода из режима останова генератор HSI RC выбран как основное системное тактирующее устройство.
Режим ожидания
Режим ожидания является режимом с минимальным энергопотреблением. Он основан на режиме глубокого сна микроконтроллера вместе с отключённым регулятором питания. В этом режиме блок 1,8 В отключается вместе с генераторами PLL, HSI и HSE. Содержимое памяти SRAM и всех регистров, за исключением резервных, теряется.
Вход в режим ожидания возможен вызовом инструкций WFI или WFE, пока:
- установлен бит SLEEPDEEP;
- установлен бит PDDS в регистре PWR_CR;
- сброшен бит WUF в регистре PWR_CSR.
В режиме ожидания можно включить независимый сторожевой таймер IWDT, часы реального времени RTC, внутренний тактирующий генератор LSI RC и внешний генератор LSE OSC, так же, как в режиме останова.
Выход из режима ожидания может быть осуществлён с помощью:
- нарастающего фронта на выводе WKUP;
- нарастающего фронта будильника RTC;
- внешнего сигнала на выводе NRST;
- сброса от IWGT.
Отладочный режим
По умолчанию отладочный режим отключается при переходе контроллера в режим останова или ожидания, так как ядро больше не получает тактирующего сигнала.
Однако с помощью битов регистра DBGMCU_CR можно включить возможность отладки микроконтроллера в режимах с низким потреблением энергии.
Автоматический выход из режима пониженного энергопотребления
Для пробуждения микроконтроллера из режима с низким потреблением можно использовать блок часов реального времени RTC, который позволяет программировать интервал времени для периодического пробуждения из режима останова или ожидания. С помощью битов RTCSEL[1:0] регистра RCC_BDCR, для этой цели можно выбрать любой из следующих источников тактового сигнала для RTC:
- генератор LSE OSC от внешнего кварца на 32,768 кГц;
- внутренний RC генератор LSI RC.
Чтобы вывести микроконтроллер из режима останова с помощью события от будильника RTC необходимо выполнить следующие операции:
- настроить линию 17 EXTI на возрастающий фронт;
- настроить RTC на генерацию сигнала тревоги (будильника).
Для пробуждения микроконтроллера из режима ожидания конфигурировать линию 17 EXTI не требуется.
Описание регистров
Блок управления питанием включает в свой состав всего два регистра. Карта размещения данных регистров в пространстве памяти и их значения после сброса представлены в таблице.
На этой карте представлены относительные адреса регистров. Рассмотрим подробнее назначение всех разрядов этих регистров.
Регистр управления питанием PWR_CR имеет нулевое смещение адреса и обнуляется при пробуждении из режима ожидания.
Биты 31…9 данного регистра зарезервированы и всегда читаются как нулевые данные.
Бит 8 DBP позволяет отключить защиту от записи блока BKP. После сброса микроконтроллера регистры блока RTC и BKP защищены от доступа на запись. Чтобы разрешить запись в эти регистры нужно установить этот бит в единичное состояние. Если для тактирования блока RTC используется сигнал от HSE, поделённый на 128, то бит DBP всегда должен быть установлен в единичное состояние.
Биты 7…5 PLS[2:0] служат для выбора уровня порога срабатывания цепи PVD (Power Voltage Detector). Они устанавливаются программно и могут принимать следующие значения, соответствующие пороговому напряжению:
- 000 – 2,2 В;
- 001 – 2,3 В;
- 010 – 2,4 В;
- 011 – 2,5 В;
- 100 – 2,6 В;
- 101 – 2,7 В;
- 110 – 2,8 В;
- 111 – 2,9 В.
Бит 4 PVDE отключает и включает цепь PVD. При нулевом состоянии бита цепь PVD отключается, а при единичном – включается.
Бит 3 CSBF служит для очистки флага SBF нахождения микроконтроллера в режиме ожидания. Этот бит всегда читается как нулевой. При записи в него единицы – очищается флаг SBF-регистра состояния PWR_CSR.
Бит 2 CWUF позволяет очистить флаг пробуждения WUF микроконтроллера. Данный бит всегда читается как нулевой. При записи в него единицы – очищается флаг WUF регистра состояния PWR_CSR через два тактовых цикла.
Бит 1 PDDS определяет режим микроконтроллера для глубокого сна. Данный бит устанавливается и очищается программно. Он работает совместно с нулевым битом LPDS регистра PWR_CR. Нулевое значение этого бита переключает микроконтроллер в режим останова. Состояние регулятора напряжения зависит от бита LPDS. Единичное значение бита включает режим ожидания.
Бит 0 LPDS управляет режимом регулятора напряжения. Он устанавливается и очищается программно и работает совместно с битом PDDS. Нулевое значение этого бита переключает регулятор напряжения в режим приостановки, а единичное – включён регулятор напряжения в режим малого потребления.
Регистр управления и статуса PWR_CSR с адресом смещения 0´004 не сбрасывается при пробуждении из режима ожидания. Для чтения этого регистра требуются дополнительные циклы шины APB.
Биты 31…9 данного регистра зарезервированы и всегда читаются как нулевые данные.
Бит 8 EWUP управляет выводом WKUP. Этот бит устанавливается и очищается программно. Нулевое значение этого бита настраивает вывод WKUP, как вывод общего назначения. Событие на этом выводе не пробуждает устройство из режима ожидания. Единичное значение этого бита определяет, что вывод WKUP используется для пробуждения из режима ожидания и принудительно устанавливается в режим входа, притянутого к земле. Данный бит сбрасывается во время общего сброса микроконтроллера.
Биты 7…3 зарезервированы и читаются как нулевые данные.
Бит 2 PVDO : PVD output (Выход детектора PVD). Этот бит ставится и очищается программно. Он работает только при разрешённом PVD битом PVDE.
0: Напряжение на VDD/VDDA выше, чем порог, выбранный битами PLS[2:0].
1: Напряжение на VDD/VDDA ниже, чем порог, выбранный битами PLS[2:0].
Работа детектора PVD останавливается в режиме ожидания. По этой причине этот бит равен 0 после выхода из режима ожидания или после сброса и остаётся в этом состоянии, пока не будет поставлен бит PVDE.
Бит 1 SBF является флагом нахождения микроконтроллера в режиме ожидания. Этот бит устанавливается аппаратно и очищается при сбросе микроконтроллера или установкой бита CSBF в регистре PWR_CR.
Бит 0 WUF служит флагом события пробуждения. Этот бит устанавливается аппаратно и очищается при сбросе микроконтроллера или установкой бита CWUF в регистре PWR_CR. Нулевое состояние бита означает отсутствие события пробуждения, а единичное состояние означает факт события пробуждения на выводе WKUP или от сигнала тревоги RTC. Кроме того, флаг детектирует дополнительное событие пробуждения, если разрешён вывод WKUP с помощью установки бита EWUP, во время высокого уровня на этом выводе.
Программирование блока управления питанием
Существует набор готовых функций для работы с блоком управления питанием микроконтроллера. Рассмотрим их синтаксис и назначение.
Функция: void PWR_BackupAccessCmd (FunctionalState NewState).
Назначение: включает или отключает доступ к резервным регистрам и регистрам RTC.
Вход: NewState – состояние разрешения доступа. Может принимать значение ENABLE или DISABLE.
Выход: значения не возвращает.
Функция: void PWR_ClearFlag (uint32_t PWR_FLAG).
Назначение: очищает указанный флаг PWR_FLAG.
Вход: PWR_FLAG – флаг, который необходимо сбросить. Может принимать следующие значения: PWR_FLAG_WU (Wake up Flag) и PWR_FLAG_SB (Standby Flag).
Выход: значения не возвращает.
Функция: void PWR_DeInit (void).
Назначение: сбрасывает значения регистров PWR к их первоначальному значению.
Вход: параметров нет.
Выход: значения не возвращает.
Функция: void PWR_EnterSTANDBYMode (void).
Назначение: переводит микроконтроллер в режим ожидания.
Вход: параметров нет.
Выход: значения не возвращает.
Функция: void PWR_EnterSTOPMode (uint32_t PWR_Regulator, uint8_t PWR_STOPEntry).
Назначение: переводит микроконтроллер в режим останова.
Вход: PWR_Regulator – устанавливает состояние регулятора при входе в режим останова. Принимает следующие значения: PWR_Regulator_ON (регулятор включён) и PWR_Regulator_LowPower (регулятор находится в режиме пониженного энергопотребления). PWR_STOPEntry – устанавливает тип инструкции (WFE или WFI), с которой должен быть осуществлён вход в режим останова. Принимает следующие значения: PWR_STOPEntry_WFI и PPWR_STOPEntry_WFE.
Выход: значения не возвращает.
Функция: FlagStatus PWR_GetFlagStatus (uint32_t PWR_FLAG).
Назначение: возвращает состояние указанного флага (установлен или нет).
Вход: PWR_FLAG – указывает флаг, состояние которого надо проверить. Принимает следующие значения: PWR_FLAG_WU (Wake up Flag), PWR_FLAG_SB (Standby Flag) и PWR_FLAG_PVDO (PVD Output).
Выход: состояние флага. Варианты: SET или RESET.
Функция: void PWR_PVDCmd (FunctionalState NewState).
Назначение: включает или отключает детектор напряжения.
Вход: NewState – статус детектора напряжения. Принимает следующие значения: ENABLE, DISABLE (Standby Flag) и PWR_FLAG_PVDO (PVD Output).
Выход: значения не возвращает.
Функция: void PWR_PVDLevelConfig (uint32_t PWR_PVDLevel).
Назначение: устанавливает порог срабатывания детектора напряжения.
Вход: PWR_PVDLevel – значение напряжения порога. Принимает следующие значения: от PWR_PVDLevel_2V2 (2,2 В) до PWR_PVDLevel_2V9 (2,9 В) с шагом 0,1 В.
Выход: значения не возвращает.
Функция: void PWR_WakeUpPinCmd (FunctionalState NewState).
Назначение: устанавливает возможность пробуждения контроллера по сигналу на пробуждающем пине.
Вход: NewState – состояние возможности пробуждения. Принимает следующие значения: ENABLE и DISABLE.
Выход: значения не возвращает.
Используя данные функции, можно изменять режим работы микроконтроллера в соответствии с алгоритмом функционирования разрабатываемого устройства.
Подробнее познакомиться с блоком управления питанием можно в первоисточнике [2].
Литература
Если вам понравился материал, кликните значок - вы поможете нам узнать, каким статьям и новостям следует отдавать предпочтение. Если вы хотите обсудить материал - не стесняйтесь оставлять свои комментарии : возможно, они будут полезны другим нашим читателям!