Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Управление питанием

508

цессорная связь. Для передачи/приема данных может использоваться DMA даже в режиме останова stop2.

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

19.4.4.2. LPTIM

Таймер с пониженным энергопотреблением (Low-Power Timer, LPTIM) – это 16-разрядный таймер, который спроектирован, исходя из последних достижений в области снижения энергопотребления. Благодаря разнообразию источников тактового сигнала LPTIM может работать независимо от выбранного режима питания, в отличие от стандартных таймеров STM32, которые не работают в режимах останова. Учитывая его способность работать даже без внутреннего источника тактового сигнала, LPTIM можно использовать в качестве счетчика импульсов, что может быть полезно в некоторых приложениях. Более того, способность LPTIM выводить систему из режимов пониженного энергопотребления позволяет реализовать функции тайм-аута с чрезвычайно низким энергопотреблением. В Главе 23 о FreeRTOS мы будем использовать таймер LPTIM в качестве источника временного отсчета для бестикового режима работы (tickless idle mode). LPTIM предоставляет гибкую схему тактирования, которая обеспечивает необходимые функциональные возможности и производительность, минимизируя энергопотребление.

Соответствующие характеристики периферийного устройства LPTIM:

16-разрядный счетчик восходящего отсчета

3-разрядный предделитель с 8 возможными коэффициентами деления (1, 2, 4, 8, 16, 32, 64, 128)

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

Внутренние источники тактового сигнала: тактовый сигнал от LSE-, LSI-, HSI16-генераторов или от шины APB

Внешний источник тактового сигнала через вход ULPTIM (работает без LPгенератора, используется приложением для отсчета импульсов)

16-разрядный регистр периода

16разрядный регистр сравнения

Непрерывный/однократный режим

Выбор программного/аппаратного входного триггера

Конфигурируемый выход: импульсный, ШИМ

Конфигурируемая полярность I/O

Режим энкодера

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

19.5. Инспекторы источников питания

Большинство микроконтроллеров STM32 предоставляют два инспектора напряжения питания (power supply supervisors): BOR и PVD. Сброс при провале напряжения (Brownout Reset, BOR) – это блок, который удерживает сброс микроконтроллера до тех пор, пока напряжение питания не достигнет заданного порогового значения VBOR. VBOR конфигурируется через байты конфигурации (option bytes) устройства. По умолчанию BOR отключен. Пользователь может выбрать от трех до пяти программируемых пороговых уровней VBOR. Для получения полной информации о характеристиках BOR обратитесь

HAL_DBGMCU_EnableDBGSleepMode()

Управление питанием

509

к разделу «Электрические характеристики» (“Electrical characteristics”) в техническом описании устройства. Устройства STM32, которые не предоставляют блок BOR, обычно имеют аналогичный блок, называемый Сброс при подаче питания (Power on Reset, POR)/Сброс при снятии питания (Power Down Reset, PDR), которые выполняют ту же работу, что и блок BOR, но с фиксированным и сконфигурированным заводом-изготови- телем порогом напряжения.

Микропрограмма может активно контролировать источник питания с помощью

Программируемого детектора напряжения (Programmable Voltage Detector, PVD). PVD поз-

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

19.6. Отладка в режимах пониженного энергопотребления

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

CubeHAL предоставляет удобные функции для включения/отключения режима отладки в режимах пониженного энергопотребления. Функция

используется для включения отладки в спящем режиме21; функции HAL_DBGMCU_Ena-

bleDBGStopMode() и HAL_DBGMCU_EnableDBGStandbyMode() позволяют использовать интер-

фейс отладки в режимах останова и ожидания соответственно.

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

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

включен путем вызова макроса __HAL_RCC_DBGMCU_CLK_ENABLE().

21 Отладка в спящем режиме недоступна в микроконтроллерах STM32F0, и, следовательно, соответствующая функция HAL не предоставляется его CubeHAL.

Управление питанием

510

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

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

CubeMX предоставляет удобный инструмент под названием Калькулятор энергопотребления (Power Consumption Calculator, PCC), который позволяет построить последовательность подачи питания и выполнять оценки энергопотребления микроконтроллера.

Рисунок 10. Главный экран представления Power Consumption Calculator

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

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

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

Управление питанием

511

пониженным энергопотреблением, минуя рабочий режим с пониженным энергопотребле-

нием). Для получения дополнительной информации о представлении PCC обратитесь к

UM171822 от ST.

19.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.

22 http://www.st.com/content/ccc/resource/technical/document/user_manual/10/c5/1a/43/3a/70/43/7d/DM00104712.pdf/files/DM00104712.pdf/jcr:content/translations/en.DM00104712.pdf