Главная » Статьи » Энергосбережение в микроконтроллерах STM32

Энергосбережение в микроконтроллерах STM32

Снижение энергопотребления микроконтроллером может быть достигнуто путем уменьшения его тактовой частоты (что связано с замедлением работы) или путем выборочного отключения периферийных систем, встроенных в его структуру. Этот второй механизм идеально подходит для микроконтроллеров STM32, которые конструктивно адаптированы для выборочного включения и выключения большинства встроенных периферийных блоков.

Энергосбережение в микроконтроллерах STM32

Мы начнем с обсуждения доступных режимов сохранения, которые были протестированы на наборе STM3210B — EVAL / A.

Спящий режим

Этот режим энергосбережения является неотъемлемой частью ядра Cortex-M3, поэтому информацию о нем следует искать не в документации, подготовленной производителем микроконтроллеров STM32, а в описании ядра, подготовленное ARM.

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

Максимальное потребление, когда микроконтроллер работает с тактовой частотой 72 МГц (HSE и PLL включены) и все периферийные устройства включены, микроконтроллер может потреблять около 15 мА. Минимальное потребление — работа ядра с тактовой частотой 125 кГц с использованием внутреннего генератора HSI и после отключения всех периферийных устройств. В таких условиях микроконтроллер потребляет ток не более 0,5 мА.

В зависимости от механизмов «сна» и «пробуждения» различают несколько типов режимов работы. За управление этими режимами отвечают две инструкции: WFI (ожидание прерывания) и WFE (ожидание события). Использование этих инструкций в программе, написанной на C, требует использования двойного подчеркивания в качестве префикса. Например: чтобы вызвать инструкцию WFI, используйте следующую запись:

__WFI ();

Sleep-on-exit

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

Пример 1. Фрагмент программы, иллюстрирующий режим энергосбережения в режиме ожидания.

int main (void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_Conf ();
NVIC_Conf ();
GPIO_Conf ();
// Информируем об источнике прерывания
GPIO_EXTILineConfig (GPIO_PortSourceGPIOD, GPIO_PinSource0);
// Прерывание будет сгенерировано по заднему фронту на EXTI_Line0
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init (& EXTI_InitStructure);
// После обработки прерывания режим сна будет восстановлен
NVIC_SystemLPConfig (NVIC_LP_SLEEPONEXIT, ENABLE);
while (1);
}

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

Функция обработки прерываний выглядит следующим образом:

void EXTI9_5_IRQHandler (void)
{
EXTI_ClearITPendingBit (EXTI_Line9);
GPIO_SetBits (GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
delay_ms (2000);
GPIO_ResetBits (GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
}

Ядро просыпается примерно на 2 секунды, зажигает четыре светодиода, гасит их и снова «засыпает».

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

DBGMCU_Config (DBGMCU_SLEEP, ENABLE);

Cortex-M3 STM32 STMicroelectronics Компоненты Микроконтроллеры

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*