Программирование ARM Режимы пониженного энергопотребления STM32F103xx Mon, September 27 2021  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Режимы пониженного энергопотребления STM32F103xx Печать
Добавил(а) microsin   

Этот апноут (перевод AN2629 [1]) предназначается для разработчиков систем, кому нужна программная и аппаратная реализация одного из режимов пониженного энергопотребления (low-power mode) микроконтроллеров серий STM32F101xx, STM32F102xx и STM32F103xx (далее для сокращения MCU). Объясняется, как использовать MCU STM32F10xxx, подробности их систем тактирования, настройки регистров и управление пониженным энергопотреблением, чтобы оптимизировать использование STM32F10xxx в приложениях, где важна экономия энергии.

Этот апноут целесообразоно читать вместе с даташитом на используемый STM32F10xxx и справочным руководством по программированию STM32F10xxx [2]. Для информации по программированию, стиранию и защите внутренней памяти Flash обращайтесь к руководству [3].

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

[1. Источник питания]

MCU требует напряжения питания от 2.0V до 3.6V (VDD). Встроенный регулятор используется для формирования внутреннего напряжения 1.8V для питания цифровых узлов MCU.

Блок часов реального времени (real-time clock, RTC) и регистры резервного хранения (backup) могут получать питание от отдельного напряжения VBAT, когда основной источник питания VDD выключен.

AN2629 power supply overview fig01

Рис. 1. Общая схема питания.

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

● Вход источника питания ADC доступен на отдельной ножке корпуса VDDA.
● Изолированное соединение с землей предоставляется на ножке VSSA.

Когда это доступно (в зависимости от корпуса MCU), ножка VREF– должна быть притянута к VSSA.

100-выводные корпуса. Для гарантии повышенной точности на низковольтных входах, пользователь может подключить отдельное внешнее опорное напряжение ADC ко входу на выводе VREF+. Напряжение VREF+ может быть в диапазоне от 2.0V до VDDA.

Корпуса с 64 выводами и меньше. Ножки VREF+ и VREF- недоступны, они внутри корпуса соединены с напряжением питания ADC (VDDA) и землей (VSSA).

Battery backup. Для сохранения содержимого регистров Backup, когда VDD выключено, ножка VBAT опционально может быть подключена к не отключаемому напряжению (standby voltage), поступающему от батареи или другого источника.

Ножка VBAT также предоставляет питание блоку RTC, что дает возможность работать для RTC (отсчет реального времени сохраняется), даже когда основной источник цифрового питания (VDD) выключен. Переключением на питание VBAT управляет схема сброса при выключении (power down reset, PDR), которая встроена в блок сброса Reset.

Если в приложении не используется внешняя батарея для VBAT, то ножка VBAT должна быть соединена снаружи с VDD.

Регулятор напряжения. После сброса внутренний регулятор напряжения всегда разрешен. Он работает в 3 разных режимах, в зависимости от режимов приложения:

● В режиме Run (нормальный рабочий режим) регулятор напряжения подает полное питание в домен 1.8V (ядро, области памяти и цифровые периферийные устройства).
● В режиме Stop регулятор предоставляет пониженную мощность для домена 1.8V, сохраняя содержимое регистров и SRAM.
● В режиме Standby регулятор выключается. Содержимое регистров и SRAM теряется, за исключением тех регистров и ячеек памяти, которые относятся к схеме Standby и домену Backup.

[Режимы пониженного энергопотребления]

По умолчани, MCU находится в режиме Run после включения питания или сброса. Имеется несколько режимов пониженного энергопотребления (low power modes), которые доступны для экономии питания, когда для CPU не нужны активные вычисления, например когда он просто ждет наступления внешнего события. Пользователь выбирает, какой режим ему необходим, и как часто он активируется - чтобы достичь оптимального компромисса между низким потреблением тока, быстрым возвратом в рабочее состояние (short startup time) и доступными для пробуждения источниками сигналов (wakeup sources).

У MCU STM32F10xxx есть три режима пониженного энергопотребления (low-power modes):

● Sleep mode - тактирование CPU выключено, все периферийные устройства, включая периферийные устройства ядра Cortex-M3, наподобие NVIC, SysTick, и т. п., остаются в рабочем состоянии.
● Stop mode - тактирование всех узлов остановлено.
● Standby mode - питание домена 1.8V выключено.

Дополнительно потребление энергии в режиме Run может быть снижено одним из следующих способов:

● Уменьшением тактовой частоты.
● Отключение тактов для периферийных устройств шин APB и AHB, когда эти устройства не используются.

В таблице 1 ниже суммарно показаны режимы low-power для STM32F10xxx MCU.

Таблица 1. Режимы пониженного энергопотребления.

Имя режима Вход Выход (wakeup) Влияние на домен тактов 1.8V Влияние на домен тактов VDD Регулятор напряжения
Sleep (Sleep-now или Sleep-on-exit) Инструкция WFI Любое прерывание Тактирование CPU отключается. Тактирование цифровых или аналоговых устройств сохраняется. Нет влияния ON (включен)
Инструкция WFE Событие пробуждения (wakeup event)
Stop Биты PDDS и LPDS + бит SLEEPDEEP + WFI или WFE Любая линия EXTI (сконфигурированная в регистрах EXTI) Все такты в домене 1.8 отключаются. Генераторы HSI и HSE выключаются. Либо ON, либо в режиме low-power (т. е. выключен) - в зависимости от регистра управления питанием (Power control register, PWR_CR).
Standby Бит PDDS + бит SLEEPDEEP + WFI или WFE Фронт нарастания уровня на ножке WKUP, будильник (RTC alarm), внешний сброс на ножке NRST, сброс от IWDG. OFF (выключен)

Снижение частоты системных тактов. В режиме Run скорость системных тактов (SYSCLK, HCLK, PCLK1, PCLK2) может быть снижена программированием регистров прескалера. Эти прескалеры могут также использоваться для замедления периферийных устройств перед входом в режим Sleep.

Отключение тактов периферии. В режиме Run такты HCLK и PCLKx для отдельных периферийных устройств и видов памяти могут быть остановлены в любое время с целью снижения потребляемой мощности.

Чтобы еще больше снизить потребление тока в режиме Sleep такты периферийных устройств могут быть запрещены перед выполнением инструкций WFI или WFE.

Тактированием тактов периферии управляет регистр AHB peripheral clock enable (RCC_AHBENR), регистр разрешения тактирования периферийных устройств шины APB1 (RCC_APB1ENR) и регистр разрешения тактирования периферийных устройств шины APB2 (RCC_APB2ENR).

[Режим Sleep]

Вход в Sleep. Вход в режим Sleep производится выполнением инструкций WFI (Wait For Interrupt) или WFE (Wait for Event). Доступны 2 опции для выбора механизма входа в режим Sleep, в зависимости от бита SLEEPONEXIT в регистре Cortex-M3 System Control:

● Sleep-now: если бит SLEEPONEXIT очищен, то MCU войдет в режим Sleep как только выполнится инструкция WFI или WFE.
● Sleep-on-exit: если бит SLEEPONEXIT установлен, то MCU войдет в режим Sleep, как только произойдет выход из ISR прерывания с самым низким приоритетом.

В режиме Sleep все ножки I/O сохраняют то же состояние, в каком они были во время режима Run mode.

См. таблицы 2 и 3 для подробной информации, как входить в режим Sleep.

Выход из Sleep. Если для входа в Sleep использовалась инструкция WFI, то любое прерывание периферии, подтвержденное контроллером прерываний с поддержкой вложенности (nested vectored interrupt controller, NVIC), может вывести MCU из режима Sleep.

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

● разрешением прерывания в регистре управления периферийным устройством, но не в NVIC, и разрешением бита SEVONPEND в регистре Cortex-M3 System Control. Когда MCU возобновит работу после WFE, должны быть очищены ожидающий обработки бит прерывания периферии, и б бит канала NVIC IRQ периферии (в регистре NVIC interrupt clear pending);
● конфигурированием внешней или внутренней линии EXTI в режиме события (event mode). Когда CPU возобновит работу после WFE, нет необходимости очистить ожидающий обработки бит прерывания периферии или бит канала NVIC IRQ периферии, поскольку не установится бит прерывания, соответствующий линии события.

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

См. таблицы 2 и 3 для подробной информации, как выходить из режима Sleep.

Таблица 2. Работа Sleep-now.

Sleep-now Описание
Вход (засыпание) Инструкция WFI (Wait for Interrupt, ожидание прерывания) или инструкция WFE (Wait for Event, ожидания события), когда SLEEPDEEP = 0 и SLEEPONEXIT = 0.
См. описания регистра управления системой (Cortex-M3 System Control register).
Выход (пробуждение, wakeup) Если для входа использовалась WFI, то ожидание прерывания.
Если для входа использовалась WFE, то ожидание события (см. таблицу 1).
Латентность (задержка) пробуждения Отсутствует

Таблица 3. Работа Sleep-on-exit.

Sleep-now Описание
Вход (засыпание) Инструкция WFI (Wait for Interrupt, ожидание прерывания), когда SLEEPDEEP = 0 и SLEEPONEXIT = 1.
См. описания регистра управления системой (Cortex-M3 System Control register).
Выход (пробуждение, wakeup) Ожидание прерывания для выхода.
Латентность (задержка) пробуждения Отсутствует

[Режим Stop]

Режим Stop основан на режиме Cortex-M3 deepsleep, комбинированном с управлением тактированием периферии. Регулятор напряжения может быть сконфигурирован либо в нормальном режиме, либо в режиме low-power. В режиме Stop все такты в домене 1.8V останавливаются, PLL, генераторы HSI и HSE RC запрещаются. Содержимое SRAM и регистров сохраняется.

В режиме Stop все ножки I/O сохраняют то же состояние, которое у них было в режиме Run.

Вход в Stop. Обратитесь к таблице 4 для подробностей, как войти в режим Stop.

Чтобы еще больше снизить потребление энергии в режиме Stop, внутренний регулятор напряжения может быть переведен в режим low-power. Это конфигурируется битом LPDS регистра управления питанием (Power control register, PWR_CR).

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

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

В режиме Stop могут быть выбраны следующие функции путем программирования отдельных бит управления:

● Independent watchdog (IWDG): независимый сторожевой таймер IWDG [5] запускается записью в его регистр ключа (Key register), либо аппаратной опцией. Будучи запущенным, IWDG не может быть остановлен, кроме как через Reset.
● Real-time clock (RTC): это конфигурируется битом RTCEN в регистре Backup domain control (RCC_BDCR).
● Внутренний RC-генератор (LSI RC): это конфигурируется битом LSION в регистре управления и состояния (Control/status register, RCC_CSR).
● Внешний генератор 32.768 кГц (LSE OSC): это конфигурируется битом LSEON в регистре Backup domain control (RCC_BDCR).

ADC или DAC также могут потреблять энергию в режиме Stop, если они не были запрещены перед входом в режим Stop. Для их запрета бит ADON регистра ADC_CR2 и бит ENx регистра DAC_CR оба должны быть записаны в 0.

Выход из Stop. См. таблицу 4 для подробной информации о том, как выйти из режима Stop.

Когда происходит выход из Stop по прерыванию или по событию пробуждения, в качестве системных тактов выбирается внутренний высокоскоростной генератор HSI RC.

Когда регулятор напряжения работает в режиме low-power, при выходе из режима Stop добавляется дополнительная задержка. Если же оставить внутренний регулятор включенным в режиме Stop, то потребляемый ток увеличивается, но время запуска снижается.

Таблица 4. Stop mode.

Sleep-now Описание
Вход (засыпание) Инструкция WFI (Wait for Interrupt, ожидание прерывания) или инструкция WFE (Wait for Event, ожидания события), когда SLEEPDEEP = 1 в регистре управления системой,PDDS = 0 в регистре управления питанием PWR_CR, и выбран режим регулятора напряжения битом LPDS в регистре PWR_CR.
См. описания регистра управления системой (Cortex-M3 System Control register).

Примечание: для входа в режим Stop, все биты EXTI Line (в регистре ожидания обработки EXTI_PR) и флаг будильника (RTC Alarm) должны быть сброшены. Иначе процедура входа в режим Stop будет проигнорирована и программа продолжит свое выполнение.
Выход (пробуждение, wakeup) Если для входа использовалась WFI, то ожидание сигнала любой EXTI Line, сконфигурированной в режиме прерывания (соответствующий вектор прерывания EXTI должен быть разрешен в NVIC).
Если для входа использовалась WFE, то ожидание сигнала любой EXTI Line, сконфигурированной в режиме события.
Латентность (задержка) пробуждения Время старта внутреннего высокоскоростного генератора (HSI RC wakeup time) + время выхода из сна регулятора напряжения (regulator wakeup time from low-power mode).

[Режим Standby]

Режим Standby позволяет достичь самого низкого потребления энергии. Он основан на режиме Cortex-M3 deepsleep, с запретом регулятора напряжения. Следовательно, питание домена 1.8V выключено. PLL, опорные генераторы HSI и HSE также выключены. Содержимое SRAM и регистров теряется, кроме схемы Standby тех регистров, которые получают отдельное питание в домене Backup (см. рис. 1).

Вход в Standby. См. таблицу 5 для дополнительной информации о том, как войти в режим Standby.

В режиме Standby путем программирования отдельных бит управления можно выбрать следующие функции:

● Independent watchdog (IWDG): независимый сторожевой таймер IWDG [5] запускается записью в его регистр ключа (Key register), либо аппаратной опцией. Будучи запущенным, IWDG не может быть остановлен, кроме как через Reset.
● Real-time clock (RTC): это конфигурируется битом RTCEN в регистре Backup domain control (RCC_BDCR).
● Внутренний RC-генератор (LSI RC): это конфигурируется битом LSION в регистре управления и состояния (Control/status register, RCC_CSR).
● Внешний генератор 32.768 кГц (LSE OSC): это конфигурируется битом LSEON в регистре Backup domain control (RCC_BDCR).

Выход из Standby. MCU выходит из режима Standby (происходит пробуждение, wakeup), когда активируется сигнал внешнего сброса (external Reset, вывод корпуса NRST), сброс от сторожевого таймера (IWDG Reset), фронт нарастания уровня на ножке WKUP, или при возникновении события будильника часов реального времени (RTC alarm). После пробуждения из режима Standby все регистры сбрасываются, кроме регистра Power control/status (PWR_CSR).

После пробуждения из режима Standby выполнение программы перезапускается точно так же, как после Reset - анализируется состояние выводов управления загрузкой (BOOT1, BOOT0), захватывается вектор сброса, и т. д. Флаг статуса SBF в регистре Power control/status (PWR_CSR) показывает, что MCU был в режиме Standby.

Таблица 5. Работа Standby mode.

Sleep-now Описание
Вход (засыпание) Инструкция WFI (Wait for Interrupt, ожидание прерывания) или инструкция WFE (Wait for Event, ожидания события), когда SLEEPDEEP = 1, установлен бит  PDDS в регистре управления питанием PWR_CR и очищен бит WUF в регистре управления/статуса питания PWR_CSR.
Выход (пробуждение, wakeup) Фронт нарастания уровня на ножке WKUP, сигнал будильника (RTC alarm), сигнал внешнего сброса на ножке NRST, сброс от IWDG.
Латентность (задержка) пробуждения Время запуска регулятора напряжения + время фазы сброса.

В режиме Standby все ножки I/O находятся в состоянии высокого сопротивления, кроме:

● Ножка Reset (все еще доступна).
● Ножка TAMPER, если это сконфигурировано для функции детектирования вмешательства (tamper) или для выхода калибровки.
● Ножка пробуждения WKUP, если это разрешено.

[Режим отладки (Debug mode)]

По умолчанию соединение с отладчиком теряется, если приложение переводит MCU в режим Stop или Standby, в то время как функции отладки используются. Потеря связи с отладчиком происходит потому, что ядро Cortex™-M3 больше не тактируется.

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

[Auto-wakeup (AWU)]

Часы реального времени RTC могут использоваться для пробуждения MCU из режима low-power без зависимости от внешнего прерывания (Auto-wakeup mode, режим автономного пробуждения). Блок RTC предоставляет программируемую базу времени для пробуждения из режимов Stop или Standby, с повторяющимися интервалами. Для этой цели могут использоваться два из трех альтернативных источника тактирования RTC, путем программирования бит RTCSEL[1:0] в регистре Backup domain control (RCC_BDCR):

● Low-power 32.768 кГц внешний кварцевый генератор (LSE OSC). Этот источник тактов предоставляет точную базу времени с низким потреблением тока (менее 1 μA, добавляемых а потреблению тока в обычных условиях).
● Low-power внутренний RC-генератор (LSI RC). У этого источника тактов достоинство в том, что экономится стоимость применения кварца 32.768 кГц (он не нужен). Внутренний RC-генератор разработан с целью минимально возможного потребления энергии.

Для пробуждения из режима Stop событием RTC alarm необходимо выполнить следующее:

● Сконфигурировать EXTI Line 17 на чувствительность к фронту нарастания уровня.
● Сконфигурировать RTC для генерации RTC alarm.

Для пробуждения из режима Standby не нужно конфигурировать EXTI Line 17.

[2. Тактирование]

Для генерации системных тактов (system clock, SYSCLK) могут использоваться 3 разных источника:

● HSI oscillator clock (внутренний RC-генератор 8 МГц)
● HSE oscillator clock (внешний генератор, работающий с кварцем, или получающий такты от внешнего источника)
● PLL clock (ФАПЧ для умножения частоты)

У MCU есть два вторичных источника тактов:

● Внутренний, низкоскоростной RC-генератор 40 кГц (LSI RC), который подает такты на независимый сторожевой таймер IWDG, и опционально может тактировать RTC, используемый для Auto-Wakeup из режимов Stop/Standby.
● Внешний кварц 32.768 кГц (LSE), который опционально может генерировать такты для RTC (RTCCLK).

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

AN2629 clock tree fig02

Рис. 2. Схема тактирования.

Легенда рис. 2:

HSE High-speed external clock signal, высокоскоростной внешний тактовый сигнал.
LSE Low-speed external clock signal, низкоскоростной внешний тактовый сигнал.
LSI Low-speed internal clock signal, низкоскоростной внутренний тактовый сигнал.
HSI High-speed internal clock signal, высокоскоростной внутренний тактовый сигнал.
Clock enable разрешение тактирования.
PCE Peripheral Clock Enable, разрешение тактирования периферийного устройства (clock gating).
FCLK Cortex free running clock постоянно генерируемая тактовая частота ядра Cortex.

Примечание: когда HSI используется на входе тактов PLL, может получена максимальная системная тактовая частота 64 МГц.

Несколько прескалеров позволяют конфигурировать частоту доменов шины AHB, высокоскоростной шины APB (APB2) и низкоскоростной шины APB (APB1). Максимальная частота доменов AHB и APB2 составляет 72 МГц, максимально допустимая частота домена APB1 составляет 36 МГц. RCC подает внешний тактовый сигнал системного таймера Cortex (SysTick) с тактовой частотой AHB (HCLK), поделенной на 8. SysTick может работать либо с этими тактами, либо с тактами Cortex (HCLK), что конфигурируется в регистре статуса и управления SysTick (SysTick Control and Status Register). Аналого-цифровые преобразователи (ADC) тактируются от тактов высокоскоростного домена (APB2), поделенных на 2, 4, 6 или 8.

Тактовые частоты таймера в 2 раза выше частоты домена APB, к которому они подключены (разные таймеры могут иметь разные тактовые домены APB). Тем не менее, если прескалер APB равен 1, то тактовая частота таймера совпадает с частотой домена APB, к которому он подключен.

FCLK действует как свободный тактовый сигнал Cortex™-M3 (free running clock). Для получения подробностей обращайтесь к техническому руководству ARM Cortex™-M3 Technical Reference Manual.

[3. Real-time clock (RTC)]

Часы реального времени (real-time clock, RTC) это независимый таймер. RTC предоставляет набор постоянно работающих счетчиков, которые можно использовать, вместе с соответствующим программным обеспечением, для предоставления функции часов и календаря. Значения счетчиков можно записывать, чтобы установить в системе текущие время/дату.

Основные функции и особенности RTC:

● Программируемый прескалер: коэффициент деления до 220.
● 32-разрядный программируемый счетчик для долговременного измерения.
● Два отдельных источника тактирования: PCLK1 для интерфейса APB1 и для тактов RTC (такты RTC должны быть как минимум в 4 раза медленнее, чем частота PCLK1).
● Два отдельных типа сброса:
   – Интерфейс APB1 сбрасывается от системного сброса.
   – Ядро RTC (Prescaler, Alarm, Counter и Divider) сбрасываются только от сброса домена Backup (см. секцию "Backup domain reset" в руководстве пользователя STM32F10xxx [2]).
● Три выделенные, маскируемые линии прерывания:
   – Alarm interrupt, для генерации программируемого прерывания будильника.
   – Seconds interrupt, для генерации периодического сигнала прерывания с программируемой длиной периода (до 1 секунды).
   – Overflow interrupt, для определения момента, когда внутренний программируемый счетчик переполнится, и снова окажется в значении 0.

RTC состоит из двух основных узлов (см. рис. 3). Первый (интерфейс APB1) используется для подключения к шине APB1. Этот узел также содержит набор 16-битных регистров, доступных через шину APB1 для чтения и записи. Интерфейс APB1 тактируется от шины APB1, чтобы обеспечивалось взаимодействие с шиной APB1.

Другой узел RTC Core (ядро часов реального времени) состоит из цепочки программируемых счетчиков, образующих два основных блока. Первый блок это прескалер RTC, который генерирует базу отсчета времени RTC - сигнал TR_CLK, который может быть запрограммирован для получения периода времени в 1 секунду. Он включает 20-битный программируемый делитель (RTC Prescaler). Каждый период TR_CLK ядро RTC генерирует прерывание (Second Interrupt, прерывание секунд), если это разрешено в регистре RTC_CR. Блок секунд это 32-битный программируемый счетчик, который может быть инициализирован текущим системным временем. Системное время инкрементируется с частотой TR_CLK, и сравнивается с запрограммированной датой (сохраненной в регистре RTC_ALR), чтобы генерировать прерывание будильника (alarm interrupt), если это разрешено в регистре управления RTC_CR.

AN2629 RTC simplified block diagram fig03

Рис. 3. Упрощенная блок-схема RTC.

Сброс регистров RTC. Все регистры системы асинхронно сбрасываются от системного сброса (System Reset) или от сброса по питанию (Power Reset), за исключением регистров RTC_PRL, RTC_ALR, RTC_CNT и RTC_DIV. Они сбрасываются только от сброса домена резервирования (Backup Domain reset), см. руководство STM32F10xxx [2].

Чтение регистров RTC. Ядро часов реального времени (RTC core) полностью независимо от интерфейса RTC APB1. Программное обеспечение осуществляет доступ к прескалеру RTC, значениям регистров счетчиков и будильника через интерфейс APB1, но соответствующие читаемые регистры внутренне обновляются по каждому фронту нарастания тактов RTC, рассинхронизированных с тактами RTC APB1. Это также верно для флагов RTC.

Это означает, что первое чтение регистров RTC APB1 может быть поврежденным (обычно с результатом 0), если ранее интерфейс APB1 был запрещен, и чтение произошло сразу после разрешения интерфейса APB1, но перед первым внутренним обновлением регистров. Такое может произойти, если:

● Произошел системны сброс, или сброс по питанию.
● MCU только что пробудился из режима Standby (см. руководство STM32F10xxx [2]).
● MCU только что пробудился из режима Stop (см. руководство STM32F10xxx [2]).

Во всех перечисленных выше случаях ядро RTC продолжало работать, когда интерфейс APB1 был запрещен (сброшен, не тактировался или не получал питание).

Как следствие, когда происходит чтение регистров RTC, после того, как был запрещен интерфейс RTC APB1, программа должна сначала подождать аппаратной установки флага RSF bit (Register Synchronized Flag) в регистре RTC_CRL.

Следует отметить, что на интерфейс APB1 RTC не влияют режимы низкого энергопотребления WFI и WFE.

Конфигурирование регистров RTC. Чтобы записать регистры RTC_PRL, RTC_CNT, RTC_ALR, периферийное устройство RTC должно войти в режим конфигурации (Configuration Mode). Это осуществляется установкой бита CNF в регистре RTC_CRL.

Кроме того, запись в любой регистр RTC разрешена только если предыдущая операция записи была завершена. Чтобы позволить программе детектировать эту ситуацию, предоставляется бит статуса RTOFF в регистре RTC_CR, который показывает, что происходит процесс обновления регистров. Новое значение может быть записано в регистры RTC только когда значение бита RTOFF равно 1.

Процедура конфигурирования следующая:

1. Опрашивается бит RTOFF с ожиданием, когда его значение станет равным 1.
2. Устанавливается бит CNF для входа в режим конфигурации RTC.
3. Записывается один или несколько регистров RTC.
4. Очищается бит CNF для выхода из режима конфигурации.
5. Опрашивается бит RTOFF с ожиданием, когда его значение станет равным 1. Это необходимо, чтобы определить завершение операции записи.

Операция записи выполняется только когда очищен бит CNF. Для полного завершения операции записи требуется как минимум 3 такта RTCCLK.

Установка флага RTC. Флаг секунд RTC (Second flag, SECF) устанавливается на каждом такте ядра RTC Core перед обновлением счетчика RTC.

Флаг переполнения RTC (Overflow flag, OWF) устанавливается на последнем такте ядра RTC Core перед тем, как счетчик достигнет значения 0x0000.

RTC_Alarm и флаг будильника RTC (Alarm flag, ALRF, см. рис. 4) установятся на последнем такте ядра RTC перед тем, как счетчик достигнет значения RTC Alarm, сохраненного в регистре будильника, увеличенного на 1 (RTC_ALR + 1). Операция записи в RTC Alarm и флаг секунд RTC (SECF) должна быть синхронизирована путем использования одной из следующих последовательностей:

● Использование прерывания будильника (RTC Alarm interrupt). RTC Alarm и/или регистра счетчика RTC обновляются внутри ISR.
● Ожидание установки бита SECF в регистре управления RTC. Обновление регистра RTC Alarm и/или регистра счетчика RTC.

AN2629 RTC second and alarm waveform example PR0003 ALARM00004 fig04

Рис. 4. Пример диаграммы секунд RTC и будильника (PR=0003, ALARM=00004).

AN2629 RTC overflow waveform example PR0003 fig05

Рис. 5. Пример диаграммы переполнения RTC (PR=0003).

[4. Регистры Backup]

Регистры backup (BKP) это десять 16-битных регистров для хранения 20 байт данных приложения пользователя. Они реализованы в домене backup, который сохраняет питание, если на VBAT присутствует соответствующее напряжение, даже когда основное питание VDD выключено. Регистры BKP не сбрасываются, когда MCU пробуждается из режима Standby, или когда происходит системный сброс или сброс по питанию.

Дополнительно регистры управления BKP используются для управления функцией детектирования проникновения (Tamper detection) и функцией калибровки RTC.

После сброса доступ к регистрам BKP и RTC запрещен, и домен Backup защищен от возможных паразитных попыток записи. Чтобы разрешить доступ к регистрам Backup и RTC, должен быть установлен бит DBP в регистре управления питанием (Power control register, PWR_CR).

Функции регистров BKP:

● Десять 16-битных регистров.
● Регистр статуса/управления для обслуживания функции защиты от взлома (anti-Tamper).
● Регистр калибровки, куда сохраняется значение калибровки RTC.

Детектирование взлома. Ножка TAMPER генерирует событие (Tamper detection), когда уровень на ней меняется с 0 на 1, или с 1 на 0, в зависимости от бита TPAL в регистре управления Backup (BKP_CR). Событие детектирования взлома (tamper detection event) сбрасывает все регистры данных backup.

Однако чтобы избежать потери событий Tamper, сигнал, используемый для детектирования перепада, складывается логической операцией И с разрешением Tamper, чтобы определить событие Tamper для случая, когда оно возникло перед тем, как ножка TAMPER разрешена.

● Когда TPAL=0: если ножка TAMPER уже в лог. 1 перед тем, как она была разрешена (установкой бита TPE), то детектируется дополнительное событие Tamper, как только ножка TAMPER разрешена (хотя не было положительного перепада уровня на ножке TAMPER после установки TPE).
● Когда TPAL=1: если ножка TAMPER уже в лог. 0 перед тем, как она была разрешена (установкой бита TPE), то детектируется дополнительное событие Tamper, как только ножка TAMPER разрешена (хотя не было отрицательного перепада уровня на ножке TAMPER после установки TPE).

После того, как событие Tamper было обнаружено и очищено, ножка TAMPER должна быть запрещена и затем снова разрешена битом TPE перед повторной записью в регистры данных backup (BKP_DRx). Это не даст программному обеспечению записать регистры данных backup (BKP_DRx), когда ножка TAMPER все еще показывает детектирование Tamper. Это эквивалентно детектированию уровня на ножке TAMPER.

Примечание: детектирование Tamper все еще активно, когда питание VDD выключено. Чтобы избежать нежелательного сброса данных регистров backup, ножка TAMPER должна быть снаружи подтянута к корректному уровню.

Калибровка RTC. Для измерения частоты тактовый сигнал 32.768 кГц RTC может быть выведен на ножку TAMPER. Это разрешается установкой бита CCO в регистре калибровки RTC (BKP_RTCCR).

Тактовая частота может быть замедлена на величину до 121 ppm конфигурированием бит CAL[6:0].

[5. Питание и интервалы времени пробуждения]

Эта секция описывает измерения потребления тока STM32F10xxx в режимах low-power, и измерения интервалов времени пробуждения. Все описанные тесты были проведены на плате разработчика STM3210B (коммерческий код STM3210B-EVAL), и они могут быть просто перенесены на любое другое железо.

Эта секция поделена на 2 основные части: первая описывает измерения энергопотребления, и вторая измерения времени, требуемого для STM32F10xxx для выхода из разных режимов low-power.

[Потребление тока]

Здесь описывается, как измерить потребление мощности STM32F10xxx, используя firmware, поставляемого в ZIP-файле вместе с этим апноутом [7]. Это firmware находится в папке CurrentMeasurements. Все подкаталоги папки CurrentMeasurements содержат файлы, необходимые для сборки примера приложения:

● Подкаталог inc содержит заголовочные файлы (*.h).
● Подкаталог src содержит файлы исходного кода примера приложения.
● Подкаталог project содержит два проекта, которые компилируют файлы примера:
   – EWARMv5: содержит проект для тулчейна IAR EWARM.
   – RVMDK: содержит проект для тулчейна Keil.
   – RIDE: содержит проект для тулчейна RIDE.

Измерения потребляемой мощности STM32F10xxx проводятся в следующих режимах low-power:

● Sleep mode: потребление тока в этом режиме зависит от используемого тактирования и активных периферийных устройств. Поэтому, чтобы покрыть всю возможную функциональность в этом режиме, измерения делались при разных источниках тактирования (HSI и HSE), разных тактовых частотах (от 125 кГц до 72 МГц) и разных конфигурациях APB (тактирование всех периферийных устройств включено или тактирование всех периферийных устройств выключено).

● Stop mode: потребление тока в этом режиме измерялось в двух возможных конфигурациях режима Stop (регулятор в режиме Run и регулятор в режиме low-power).

Обратите внимание, что для всех режимов Sleep и Stop все неиспользуемые ножки I/O (ввода-вывода) сконфигурированы как аналоговые порты. Таким образом, вход триггера Шмитта деактивируется, что приводит к нулевому потреблению для этих контактов ввода-вывода.

● Standby mode: потребление тока в режиме standby измеряется с выключенными RTC и включенными RTC.

Примечание: для дополнительной информации по режимам пониженного потребления см. выше секцию "1. Источник питания".

Используемое аппаратное обеспечение:

● Sleep, Stop и Standby (с выключенными RTC): измерение потребляемой мощности производится заменой перемычки JP9 на плате STM3210B-EVAL на миллиамперметр. Питание подается от внешнего источника питания, либо через кабель USB.
● RTC с питанием от VBAT: измерение производилось подключением внешнего источника питания к контакту 2 перемычки J11. Миллиамперметр подключен последовательно с источником питания.

Предоставляемый код firmware поделен на следующие файлы:

● main.c: этот файл содержит основное тело тестовой программы. Пользователь может выбрать необходимый low-power режим путем раскомментирования соответствующей строки:

/* Определение режима пониженного
   энергопотребления (Low power mode) */
//#define SLEEP
//#define SLEEP_ALLPERIPH_ENABLE
//#define SLEEP_ALLPERIPH_DISABLE
//#define STOP
//#define STOP_Regulator_ON
//#define STOP_Regulator_LowPower
 
//#define STANDBY
//#define RTC_ON

● hw_config.c и hw_config.h: эти файлы содержат все функции, относящиеся к конфигурации STM32F10xxx (конфигурация тактов, разрешение/запрет периферийных устройств MCU, конфигурация I/O, и т. д.).

Для выбора способа входа в режимы Sleep и Stop (WFI или WFE) раскомментируйте соответствующую строку в файле hw_config.h:

/* Определение входа в режим low power */
//#define Entry_WFE
//#define Entry_WFI

Для выбора необходимой конфигурации для режима Sleep раскомментируйте соответствующую строку в файле hw_config.h:

/* Определение настроек тактирования */
#define HSE_PLL_ON
#define HSE_PLL_ON_72MHz
//#define HSE_PLL_ON_48MHz
//#define HSE_PLL_ON_36MHz
//#define HSE_PLL_ON_24MHz
//#define HSE_PLL_ON_16MHz
//#define HSE_PLL_OFF
//#define HSE_PLL_OFF_8MHz
//#define HSE_PLL_OFF_4MHz
//#define HSE_PLL_OFF_2MHz
//#define HSE_PLL_OFF_1MHz
//#define HSE_PLL_OFF_500kHz
//#define HSE_PLL_OFF_125kHz
//#define HSI_PLL_ON
//#define HSI_PLL_ON_64MHz
//#define HSI_PLL_ON_48MHz
//#define HSI_PLL_ON_36MHz
//#define HSI_PLL_ON_24MHz
//#define HSI_PLL_ON_16MHz
//#define HSI_PLL_OFF
//#define HSI_PLL_OFF_8MHz
//#define HSI_PLL_OFF_4MHz
//#define HSI_PLL_OFF_2MHz
//#define HSI_PLL_OFF_1MHz
//#define HSI_PLL_OFF_500kHz
//#define HSI_PLL_OFF_125kHz

Примечания:

(1) С обоими источниками тактов HSI и HSE, если частота тактов равна или меньше 8 МГц, то PLL выключается.
(2) Кнопка пробуждения (Wakeup push-button) оценочной платы STM3210B-EVAL (подключено к ножке PA0 микроконтроллера STM32F10xxx) используется для подачи сигнала пробуждения для всех режимов low-power.

● stm32f10x_it.c: это файл предоставляет обработчик прерывания (interrupt service routine, ISR) для внешнего прерывания EXTI line 0, если выбрана инструкция WFI в качестве способа входа в режим low-power.

Результаты измерений. В таблицах 6 и 7 суммарно показаны результаты испытаний по потребляемой мощности в режимах Sleep, Stop и Standby.

Таблица 6. Варианты потребления тока в режиме Sleep (в столбцах EN и DIS указан ток потребления IDD, мА).

Условия fHCLK EN(1) DIS(1)
Работа от HSE, прескалер AHB используется
для понижения частоты.
72 МГц 14.4 5.5
48 МГц 9.9 3.9
36 МГц 7.6 3.1
24 МГц 5.3 2.3
16 МГц 3.8 1.8
8 МГц 2.1 1.2
4 МГц 1.6 1.1
2 МГц 1.3 1
1 МГц 1.11 0.98
500 кГц 1.04 0.96
125 кГц 0.98 0.95
Работа от высокоскоростного внутреннего
RC-генератора (HSI), прескалер AHB
используется для понижения частоты.
64 МГц 12.3 4.4
48 МГц 9.3 3.3
36 МГц 7 2.5
24 МГц 4.8 1.8
16 МГц 3.8 1.2
8 МГц 1.6 0.6
4 МГц 1 0.5
2 МГц 0.72 0.47
1 МГц 0.56 0.44
500 кГц 0.49 0.42
125 кГц 0.43 0.41

Примечание (1): столбец EN показывает ток потребления в миллиамперах при всех разрешенных периферийных устройствах шин APB, столбец DIS показывает ток потребления в миллиамперах при всех запрещенных (их тактирование запрещено) периферийных устройствах шин APB.

Таблица 7. Варианты потребления тока в режимах Stop и Standby (в столбцах 2.4V и 3.3V указан ток потребления IDD и IDD_VBAT, мкА).

Ток Параметр Условия 2.4V(1) 3.3V(1)
IDD Ток потребления в Stop Регулятор работает (режим Run),  - 24
Регулятор в режиме low power, генераторы HSE и HSI выключены (IWDG не используется). - 14
Ток потребления в Standby Генератор HSI выключен, IWDG выключен, блок RTC и его генератор 32.768 кГц выключен. - 2
IDD_VBAT Ток потребления домена Backup Блок RTC и его генератор 32.768 кГц включен. 1.08 1.4

Примечание (1): указаны напряжения питания цепей VDD и VBAT.

[Измерения времени пробуждения]

Здесь описано, как измерять время, необходимое MCU STM32F10xxx для выхода из режимов low-power. Для этого предоставляется специальное firmware [7], которое находится внутри ZIP-архива, в папке WakeUpTiming.

Папка WakeUp_Timing содержит все подкаталоги и файлы, из которых состоит ядро примера тестового приложения:

● Подкаталог inc содержит заголовочные файлы (*.h).
● Подкаталог src содержит файлы исходного кода примера приложения.
● Подкаталог project содержит два проекта, которые компилируют файлы примера:
   – EWARMv5: содержит проект для тулчейна IAR EWARM.
   – RVMDK: содержит проект для тулчейна Keil.
   – RIDE: содержит проект для тулчейна RIDE.

Время пробуждения определяется следующим образом.

● Sleep и Stop. В этих режимах время пробуждения начинается с момента установки источника пробуждения (в нашем случае это кнопка Wakeup платы STM3210B-EVAL, подключенная к ножке порта PA0), и завершается:
   – после выполнения первой инструкции после WFE (в случае пробуждения от внешнего события) или
   – после выполнения первой инструкции ISR (в случае пробуждения от внешнего прерывания).

● Standby. После пробуждения из этого режима выполнение программы начинается с начала, точно так же, как после Reset. Таким образом, для режима Standby это время между выбором между источником пробуждения (у нас это кнопка Wakeup) и выполнением первой инструкции программы.

Примечание: для дополнительной информации по режимам пониженного потребления см. выше секцию "1. Источник питания".

Используемое аппаратное обеспечение: ножка порта PC6 устанавливается в лог. 1 после пробуждения из режимов low-power, поэтому измерение времени пробуждения делается с помощью осциллографа, входы которого подключены к ножкам портов PC6 и PA0. Время пробуждения это время между фронтом нарастания уровня на PA0 (момент нажатия на кнопку Wakeup) и фронтом нарастания уровня на PC6.

Предоставляемый код firmware поделен на следующие файлы:

● main.c: этот файл содержит основное тело тестовой программы. Пользователь может выбрать необходимый low-power режим путем раскомментирования соответствующей строки:

/* Определение режима пониженного
   энергопотребления (Low power mode) */
//#define SLEEP
//#define STOP_Regulator_ON
//#define STOP_Regulator_LowPower
//#define STANDBY

Перед входом в режим low-power ножка порта PC6 конфигурируется как выход с двухтактным драйвером (output push-pull, скорость переключения 50 МГц), и сбрасывается в состояние лог. 0.

a) Для режимов Sleep и Stop:
   – в случае инструкции WFE для перевода ножки порта PC6 в лог. 1 используется запись в регистр BSRR (Bit Set Reset register).
   – в случае инструкции WFI установка установка в лог. 1 ножки порта PC6 выполняется в ISR прерывания EXTI line 0.

b) Для режима Standby уровень лог. 1 на ножке PC6 должен быть установлен в в самом начале программы, в коде startup (эта часть программы реализована в отдельных файлах, см. описание ниже).

● startup. Для измерения времени пробуждения в режиме Standby, самыми первыми действиями в программе должны быть настройка на выход и установка в лог. 1 ножки порта PC6. Для этого на ассемблере добавляются строки в файл startup:

; Установка тактов GPIOC (APB)
MOVW.W r3,#0x1000
MOVT.W r3,#0x4002
MOVS r1,#0x10
STR r1,[r3,#0x18]
; Установка конфигурации GPIOC для ножки 6:
; выход, двухтактный драйвер (Output Push-Pull)
MOVW.W r3,#0x1000
MOVT.W r3,#0x4001
MOVS r1,#0x03000000
STR r1,[r3,#0x00]
; GPIOC, GPIO_Pin_6, Bit_SET
MOVS r2,#0x40
STR r2,[r3,#0x10]

– В тулчейне Keil (RVMDK) этот код вставляется в файл startup_stm32f10x_md.s перед ветвлением в функцию main.
– В тулчейне IAR (EWARM) этот код вставляется в файл startup_stm32f10x_md.s, в функцию __low_level_init(void).

● hw_config.c и hw_config.h. Эти файлы содержат все функции, относящиеся к конфигурации STM32F10xxx (конфигурация тактов, конфигурация I/O, и т. д.). Чтобы выбрать способ входа в режим Sleep и Stop (инструкцией WFI или WFE), раскомментируйте соответствующую строку в файле hw_config.h:

/* Определение входа в режим low power */|
//#define Entry_WFE
//#define Entry_WFI

Примечание: для всех измерений источником тактирования при пробуждении является HSI.

● stm32f10x_it.c. Этот файл содержит обработчик (interrupt service routine, ISR) прерывания EXTI line 0, если в качестве способа входа в режим low-power выбрана инструкция WFI.

Результаты измерений. В таблице 8 суммарно показаны времена пробуждения для режимов Sleep, Stop и Standby.

Таблица 8. Результаты измерений времени Wakeup.

Символ Параметр Условия Typ Ед.
tWUSLEEP Пробуждение из Sleep (WFE) Пробуждение
с работающими
тактами HSI RC
1.8 мкс
Пробуждение из Sleep (WFI) 3.75
tWUSTOP Пробуждение из Stop (регулятор работает + WFE) 3.52
Пробуждение из Stop (регулятор работает + WFI) 5.42
Пробуждение из Stop (регулятор в режиме low power + WFE) 5.32
Пробуждение из Stop (регулятор в режиме low power + WFI) 7.21
tWUSTDBY Пробуждение из Standby 50

Приведенные результаты показывают варианты компромисса между потреблением энергии и временем пробуждения для MCU STM32F10xxx. Общая тенденция - чем меньше потребление тока в режиме энергосбережения, тем больше получается время пробуждения (wakeup time). Таким образом, пользователь должен подобрать подходящий компромисс в соответствии с ограничениями конкретного приложения.

[6. Оптимизация потребления энергии]

В соответствии с законами физики, потребление микроконтроллером (MCU) мощности растет с увеличением его тактовой частоты. Поэтому нужно найти самое лучшее соотношение между потреблением тока и необходимой производительностью MCU. Во многих приложениях потребление мощности можно снизить подстройки тактовой частоты системы/периферии для достижения требуемой производительности. Для достижения этой цели STM32F10xxx предоставляет функции медленного режима (Slow mode). Если нет специальных требований по непрерывной активности системы/периферийных устройств, то можно использовать low-power режимы STM32F10xxx.

В этой секции описывается, как использовать режимы Slow и Low-power для оптимизации потребления энергии в соответствии с требованиями приложения. Предоставляется пример программы [7] с практической реализацией оптимизации потребляемой мощности. С помощью этой программы пользователь может измерить потребление тока STM32F10xxx с различными опциями оптимизации.

[Продвинутая конфигурация тактов]

Здесь описывается пример конфигурации тактов в firmware для STM32F10xxx, который можно найти в ZIP-архиве [7], поставляемом с этим апноутом. Код этого firmware находится в папке Run_Mode. Папка Run_Mode содержит все подкаталоги и файлы, составляющие ядро примера приложения:

● Подкаталог inc содержит заголовочные файлы (*.h).
● Подкаталог src содержит файлы исходного кода примера приложения.
● Подкаталог project содержит два проекта, которые компилируют файлы примера:
   – EWARMv5: содержит проект для тулчейна IAR EWARM.
   – RVMDK: содержит проект для тулчейна Keil.
   – RIDE: содержит проект для тулчейна RIDE.

Программа это базовое приложение, которое посылает время из RTC через последовательный порт (USART, см. на рис. 6 ниже окно терминала).

● В начале приложения пользователь должен подстроить время, например с помощью программы HyperTerminal.
● Время отображается в терминале, и обновляется каждую секунду. Практически RTC конфигурируется для генерации прерывания каждую секунду.
● Когда происходит прерывание, захватывается счетчик RTC; время вычисляется и посылается через USART1.

AN2629 HyperTerminal time adjustment interface fig06

Рис. 6. Интерфейс HyperTerminal для подстройки времени.

Аппаратное обеспечение. Используйте этот пример с оценочной платой разработчика STM32F10xxx (STM3210B-EVAL): см. руководство пользователя UM0426 [6].

● Сигналы USART1 (RX, TX) должны быть соединены с коннектором DB9, с использованием трансивера RS232.
● Null-модемный кабель female/female RS232 должен соединять коннектор DB9 (CN6 на плате STM3210B-EVAL) и последовательный порт компьютера PC.
● После подключения источника питания и инструментария JTAG потребление тока можно измерить заменой перемычки JP9 на миллиамперметр.

Описание firmware. Как использовать тестовый пример приложения:

● Запустите этот пример тем тулчейном, который используете. Можно применить стандартный инструментарий. Файл .uv2 используется для запуска проекта в тулчейне RVMDK (Keil), этот файл содержится в папке RVMDK. Файл .eww, используемый для запуска проекта в тулчейне EWARM (IAR), находится в папке EWARM.

● Сконфигурируйте HyperTerminal на компьютере PC (или любую другую программу терминала, например Putty или SecureCRT) со следующими настройками последовательного порта:

– длина слова 8 бит
– один Stop-бит
– без контроля четности (No parity)
– скорость (Baud rate) 115200 baud
– управление потоком отключено (flow control: none)

● Сконфигурируйте firmware. В заголовочном файле (main.h) могут быть выбраны несколько определений #define, чтобы настроить нужные параметры примера. Используя #define, пользователь может самостоятельно измерить значения потребляемого тока, как показано далее в таблице 9.

– #define для конфигурации прескалера тактов APB1 и APB2:

#define ABP1_DIV4
#define ABP2_DIV2
#define ABP1_DIV8
#define ABP2_DIV8

– #define для выбора тактирования периферийных устройств:

#define ALL_PERIPHERIALS_ENABLE
#define USART_ONLY

– #define для выбора тактовой частоты:

#define HCLK_FREQ_72MHz /* Только с внешним генератором или кварцем */
#define HCLK_FREQ_8MHz

– #define для предварительной выборки инструкций (Prefetch) или использования функции половины такта (Half Cycle):

#define PREFETCH_ON
#define HALF_CYCLE_ON

– #define для переключения в режим Sleep, в то время как приложение ждет прерывания от RTC:

#define WFI_ON

– #define для выбора внутреннего или внешнего генератора тактов:

#define HSI_ENABLE   /* Использовать внутренний генератор */
#define HSE_ENABLE   /* Использовать внешний генератор    */

Предупреждение: для перезагрузки памяти Flash после запуска примера low-power, конфигурация ножек выбора загрузки (BOOT1, BOOT0) должна быть временно изменена с BOOT FLASH на BOOT RAM, и должна быть нажата кнопка сброса. Причина этого в том, что отладчик не может взять на себя управление, когда STM32F10xxx находится в режиме low-power. Как только это сделано, выводы выбора загрузки должны быть обратно сконфигурированы для BOOT FLASH. Затем измерение запускается отключением и повторным подключением источника питания. Последовательность выключения/сброса при подаче питания (power off/power on reset) необходима, чтобы избежать дополнительного потребления тока модулем отладки.

Типовые результаты измерения. Таблица 9 показывает измерения, которые были сделаны с этими примерами.

Таблица 9. Результаты измерений.

APB1 APB2 Периферийные
устройства
Частота Prefetch Half
cycle
WFI Генер. Ток
DIV4 DIV2 Все включены 72 МГц ON OFF OFF HSE 33.35
DIV8 DIV8 ON OFF OFF 27.85
USART ON OFF OFF 25.13
DIV4 DIV2 USART 8 МГц ON OFF OFF 9.23
USART OFF ON OFF 6.42
USART OFF ON ON 1.67
USART OFF ON ON HSI 1.09

Примечание: в столбце ток указано типовое потребление тока в мА, при 25°C.

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

● Частота тактов системы и периферийных устройств.

– Если приложению не нужно работать на максимальной частоте, пользователь может понизить HCLCK, используя PLL или делитель частоты прескалера.
– Частоты шины периферийных устройств может быть понижена с помощью прескалеров APB1 и APB2.

Примечание: для дополнительной информации о дереве формирования тактов см. выше рис. 2.

● Запрет тактов периферии

– Для оптимизации потребления энергии должны получать тактирование только используемые периферийные устройства MCU. Это можно реализовать функцией конфигурирования тактов периферии (clock gating).

Примечание: для дополнительной информации о функции clock gating обращайтесь к руководству пользователя STM32F10xxx [2].

● Функции prefetch или half cycle

– Функция предварительной выборки инструкций (prefetch) полезна для улучшения производительности. Использования буфера prefetch в приложении предотвращает потерю производительности из-за тактов ожидания (wait state) при доступе к памяти Flash.
– В приложениях, которые не чувствительны к тактам ожидания Flash, функция half cycle может использоваться для уменьшения потребления тока.

Предупреждение: конфигурация half cycle недоступна в комбинации с прескалером на шине AHB. Частота тактов системы должна быть равна частоте тактов HCLK. Эта функция, таким образом, может использоваться только при прямом тактировании от внутреннего 8 МГц RC-генератора (HSI), или от генератора HSE.

● Внутренний или внешний генератор

– Использование внутреннего генератора вместо внешнего также уменьшает потребление энергии. Однако в этом случае может быть получена максимальная системная тактовая частота 64 МГц, и точность этой частоты намного ниже, чем при использовании внешнего кварцевого генератора или керамического резонатора (HSE).

Примечание: для дополнительной информации о генераторах тактов обращайтесь к руководству пользователя STM32F10xxx [2].

● Режим Sleep

Другой способ снижения потребления энергии - переключение STM32F10xxx в режим Sleep, когда приложение ждет события (event) или прерывания (interrupt).

Этот пример показывает возможные конфигурации тактирования STM32F10xxx, которые можно использовать для оптимизации потребления энергии приложения. Эти конфигурации касаются выбора тактовых частот, управление разрешением тактирования периферийных устройств (clock gating), применение функции half cycle, внутреннего генератора и режима ожидания прерывания с инструкцией WFI - все это можно использовать в различных комбинациях для конкретного приложения с целью оптимизации потребления энергии.

[7. Stop и Standby в приложениях с батарейным питанием]

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

Ядро Cortex-M3 было разработано, чтобы учесть эти требования и интегрировать специальные режимы и инструкции на уровне ядра.

Программное обеспечение, предоставленное с этим апноутом, показывает два примера (WFE_Stop_Flash и WFE_Stop_RAM), как использовать STM32F10xxx в приложениях, работающих от батареи. В этих примерах STM32F10xxx переключается в режим low-power, как только не требуется программная обработка - вместо того чтобы оставаться в режиме Run на низкой тактовой частоте.

Эти два режима low-power основывается функции Cortex-M3 Deep Sleep и инструкции WFE (Wait for Event).

Использование Wait For Event и Stop Wait For Event. Эта секция описывает, как использовать инструкцию Wait for Event (WFI) и режима Stop микроконтроллера STM32F10xxx. Вместе с этим апноутом поставляется в ZIP-файле исходный код соответствующего firmware. Код firmware в виде двух проектов доступен в следующих папках: WFE_Stop_Flash и WFE_Stop_RAM.

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

● WFE_Stop_Flash жестко привязан к памяти Flash, и работает из памяти Flash.
● WFE_Stop_Ram загружается из памяти Flash, но некоторые функции отображаются в RAM кодом startup. Как делать отображение кода (remap) в RAM, объясняется в документации к набору инструментария программиста.

Папки WFE_Stop_Flash и WFE_Stop_Ram содержат все подкаталоги и файлы, из которых создается ядро примера приложения:

● Подкаталог inc содержит заголовочные файлы (*.h).
● Подкаталог src содержит файлы исходного кода примера приложения.
● Подкаталог project содержит два проекта, которые компилируют файлы примера:
   – EWARMv5: содержит проект для тулчейна IAR EWARM.
   – RVMDK: содержит проект для тулчейна Keil.
   – RIDE: содержит проект для тулчейна RIDE.

Пример выполняет периодические измерения уровня напряжения с помощью ADC, и сохранение измеренных значений в буфер RAM. Используется функция автоматического пробуждения (Auto-Wakeup, AWU) для выхода из режима low-power, как это описывалось выше в секции "Auto-wakeup (AWU)".

● Сначала функции конфигурируют такты, GPIO, RTC и ADC. Эти функции реализованы в конце файла main.c, и они используют стандартную библиотеку функций для работы с периферийными устройствами (STM32F10xxx standard peripheral library).
● Работают часы RTC, и каждое преобразование ADC и сохранение результата преобразования запускаются будильником (RTC Alarm) в главном цикле функции main.
● RTC Alarm выводит STM32F10xxx из режима WFE или STOP_WFE.
● Ножка порта PC1 показывает время, затрачиваемое на преобразование ADC и перезагрузку регистра будильника RTC Alarm.

AN2629 WFE and STOP WFE fig07

Рис. 7. WFE и STOP WFE.

Используемая аппаратура. Используйте этот пример с оценочной платой разработчика STM32F10xxx (STM3210B-EVAL), см. руководство пользователя UM0426 [6]. После подключения источника питания и инструментария JTAG потребление тока можно измерить путем замены перемычки JP9 на миллиамперметр.

Описание firmware:

● Запустите этот пример в используемом Вами тулчейне. Можно использовать стандартный тулчейн. Файл .uv2 используется для запуска проекта в среде тулчейна RVMDK (Keil), этот файл находится в папке RVMDK. Файл .eww, используемый для запуска проекта в среде тулчейна EWARM (IAR), находится в папке EWARM.

● Сконфигурируйте firmware. В начале модуля main.c четырьмя определениями #define можно выбрать параметры примера:

– два #define выбирают время прокрутки цикла:

#define LOOP_20ms
#define LOOP_200ms

– еще два #define выбирают режим low-power:

#define WFE
#define STOP_WFE

– Для запуска примера нужно раскомментировать по одному определению #define каждого типа.
– После компиляции примера его можно загрузить в память Flash микроконтроллера STM32F10xxx.

Предупреждение: для перезагрузки памяти Flash после запуска примера low-power, конфигурация ножек выбора загрузки (BOOT1, BOOT0) должна быть временно изменена с BOOT FLASH на BOOT RAM, и должна быть нажата кнопка сброса. Причина этого в том, что отладчик не может взять на себя управление, когда STM32F10xxx находится в режиме low-power. Как только это сделано, выводы выбора загрузки должны быть обратно сконфигурированы для BOOT FLASH. Затем измерение запускается отключением и повторным подключением источника питания. Последовательность выключения/сброса при подаче питания (power off/power on reset) необходима, чтобы избежать дополнительного потребления тока модулем отладки.

[Прикладное использование режима Standby]

Здесь описывается, как использовать режим Standby микроконтроллера STM32F10xxx на примере, который можно найти в ZIP-архиве [7], поставляемом с этим апноутом. Код этого firmware находится в папке Standby. Папка Standby содержит все подкаталоги и файлы, составляющие ядро примера приложения:

● Подкаталог inc содержит заголовочные файлы (*.h).
● Подкаталог src содержит файлы исходного кода примера приложения.
● Подкаталог project содержит два проекта, которые компилируют файлы примера:
   – EWARMv5: содержит проект для тулчейна IAR EWARM.
   – RVMDK: содержит проект для тулчейна Keil.

Пример выполняет периодические измерения уровня напряжения с помощью ADC, и сохранение измеренных значений в буфер RAM. Используется функция автоматического пробуждения (Auto-Wakeup, AWU) для выхода из режима low-power, как это описывалось выше в секции "Auto-wakeup (AWU)".

● Сначала функции конфигурируют такты, GPIO, RTC и ADC. Эти функции реализованы в конце файла main.c, и они используют стандартную библиотеку функций для работы с периферийными устройствами (STM32F10xxx standard peripheral library).
● Работают часы RTC, и будильник (RTC Alarm) выводит STM32F10xxx из режима Standby.
● После каждого пробуждения из режима Standby программа STM32F10xxx запускается сначала, как после сброса, и после конфигурирования ADC выполняется его преобразование уровня напряжения в цифровой формат.
● Ножка порта PC1 показывает время, затрачиваемое на преобразование ADC и перезагрузку регистра будильника RTC Alarm, однако без учета времени, которое требуется STM32F10xxx для перезапуска.

AN2629 Standby fig08

Рис. 8. Standby.

Используемая аппаратура. Используйте этот пример с оценочной платой разработчика STM32F10xxx (STM3210B-EVAL), см. руководство пользователя UM0426 [6]. После подключения источника питания и инструментария JTAG потребление тока можно измерить путем замены перемычки JP9 на миллиамперметр.

Описание firmware:

● Запустите этот пример в используемом Вами тулчейне. Можно использовать стандартный тулчейн. Файл .uv2 используется для запуска проекта в среде тулчейна RVMDK (Keil), этот файл находится в папке RVMDK. Файл .eww, используемый для запуска проекта в среде тулчейна EWARM (IAR), находится в папке EWARM.

● Сконфигурируйте firmware. В начале модуля main.c двумя определениями #define можно выбрать параметры примера:

В начале модуля main.c двумя определениями #define можно выбрать параметры примера.

- Два #define определяют время прокрутки цикла main, нужно выбрать один из вариантов:

#define LOOP_20ms
#define LOOP_200ms

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

Предупреждение: для перезагрузки памяти Flash после запуска примера low-power, конфигурация ножек выбора загрузки (BOOT1, BOOT0) должна быть временно изменена с BOOT FLASH на BOOT RAM, и должна быть нажата кнопка сброса. Причина этого в том, что отладчик не может взять на себя управление, когда STM32F10xxx находится в режиме low-power. Как только это сделано, выводы выбора загрузки должны быть обратно сконфигурированы для BOOT FLASH. Затем измерение запускается отключением и повторным подключением источника питания. Последовательность выключения/сброса при подаче питания (power off/power on reset) необходима, чтобы избежать дополнительного потребления тока модулем отладки.

Таблица 10 показывает типовые результаты измерений потребления тока этих примеров.

Таблица 10. Результаты измерений потребляемого тока при температуре TA = +25°C.

#define
Потребление тока
 20 мс  200 мс
WFE 1 мА 970 мкА
STOP_WFE, код крутится в памяти Flash 58 мкА 18.5 мкА
STOP_WFE, сделан remap кода в RAM 34.7 мкА 16.2 мкА
Standby 106 мкА 14 мкА

Общие выводы. Эти примеры показывают, как Cortex-M3 интегрирует в себе эффективные инструкции уровня ядра для приложений с низким потреблением тока (режим Sleep и режим Deepsleep), связанные с функциями STM32F10xxx (AWU, Stop, Low-power и Standby).

Измерения показывают варианты компромисса между временем пробуждения и потреблением тока, которые необходимо принять внимание при разработке:

● Режим Standby более эффективен с точки зрения потребления тока (3.6 мкА), однако приложение каждый раз перезапускается из состояния сброса, и время повторной инициализации не такое уж маленькое. Конечно, фаза инициализации работает на частоте 8 МГц, и потребляет ток. Если время повтора цикла сон/пробуждение слишком маленькое (20 мс), то этот режим менее эффективен, чем режим Stop (106 мкА против 34.7 мкА).
● Режим Stop менее эффективен по сравнению с режимом Standby по току потребления low-power, но у режима Stop есть достоинство в том, что сохраняется контекст выполнения кода и содержимое RAM. В этом примере если время повторения цикла короче 200 мс, то режим Stop становится более эффективным, особенно если код цикла отображен (remapped) для работы в RAM. Однако, если цикл длится 200 мс или более, режим Standby становится более предпочтительным.

[8. Домен Backup в приложениях с очень низким потреблением]

Эта секция описывает, как использовать регистры резервного хранения (backup) микроконтроллера STM32F10xxx и сохранить преимущества потребления тока в режимах low-power для домена Backup.

Прикладное использование домена Backup. Здесь описывается, как использовать регистры backup микроконтроллера STM32F10xxx, используя то же самое firmware, которое было показано выше в секции 6. Код firmware можно найти в папке Run_Mode архива ZIP [7].

● Подкаталог inc содержит заголовочные файлы (*.h).
● Подкаталог src содержит файлы исходного кода примера приложения.
● Подкаталог project содержит два проекта, которые компилируют файлы примера:
   – EWARMv5: содержит проект для тулчейна IAR EWARM.
   – RVMDK: содержит проект для тулчейна Keil.
   – RIDE: содержит проект для тулчейна RIDE.

Программа это базовое приложение, которое посылает время из RTC через последовательный порт (USART). Каждую секунду это время сохраняется в регистрах backup. После сброса при включении питания (power on reset) содержимое регистров backup отправляется через USART. Время, на котором произошло событие выключения, отображается в окне терминала, как показано на рис. 9.

AN2629 HyperTerminal display time fig09

Рис. 9. Окно HyperTerminal, где отображается время.

Исчерпывающее описание см. выше в разделе "6. Оптимизация потребления энергии".

Аппаратное обеспечение. Используйте этот пример с оценочной платой разработчика STM32F10xxx (STM3210B-EVAL): см. руководство пользователя UM0426 [6].

● Сигналы USART1 (RX, TX) должны быть соединены с коннектором DB9, с использованием трансивера RS232.
● Null-модемный кабель female/female RS232 должен соединять коннектор DB9 (CN6 на плате STM3210B-EVAL) и последовательный порт компьютера PC.
● RTC с питанием от VBAT: замените перемычку J11 на миллиамперметр (чтобы измерить потребление тока), или подключите батарею на 3V к ножке VBAT (батарея уже смонтирована на плате STM3210B-EVAL) с помощью этой перемычки.

Описание firmware. Как использовать тестовый пример приложения:

● Запустите этот пример тем тулчейном, который используете. Можно применить стандартный инструментарий. Файл .uv2 используется для запуска проекта в тулчейне RVMDK (Keil), этот файл содержится в папке RVMDK. Файл .eww, используемый для запуска проекта в тулчейне EWARM (IAR), находится в папке EWARM.

● Сконфигурируйте HyperTerminal на компьютере PC (или любую другую программу терминала, например Putty или SecureCRT) со следующими настройками последовательного порта:

– длина слова 8 бит
– один Stop-бит
– без контроля четности (No parity)
– скорость (Baud rate) 115200 baud
– управление потоком отключено (flow control: none)

● Сконфигурируйте firmware. В заголовочном файле (main.h) могут быть выбраны несколько определений #define, чтобы настроить нужные параметры примера. Используя #define, пользователь может самостоятельно измерить значения потребляемого тока, как показано далее в таблице 9.

Функция домена Backup используется для выключения STM32F10xxx с сохранением работы RTCи содержимого десяти 16-битных регистров. Это позволяет сохранить некоторую полезную информацию между перезапусками (выключением и включением общего питания) приложения. В этом примере просто записывалось время момента последнего выключения. Точно так же может сохраняться и некоторый контекст приложения.

[Ссылки]

1. AN2629 STM32F101xx, STM32F102xx and STM32F103xx low-power modes site:st.com.
2. RM0008 Reference manual STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs site:st.com.
3. PM0075 Programming manual STM32F10xxx Flash memory microcontrollers site:st.com.
4. ARM Cortex™-M3 Technical Reference Manual site:developer.arm.com.
5. STM32 IWDG.
6. UM0426 User manual STM3210B-EVAL evaluation board site:st.com.
7210510AN2629-STM32F10xxx-low-power-modes.zip - исходный код примеров, документация.

 

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


Защитный код
Обновить

Top of Page