STM32

STM32 저전력 모드 활용하기

임베디드 친구 2024. 12. 3. 08:55
반응형

안녕하세요, 여러분! 오늘은 STM32F429ZI를 이용해 저전력 모드의 활용 방법에 대해 알아보려고 합니다. STM32 마이크로컨트롤러는 다양한 저전력 모드를 지원하여, 배터리 소모를 줄이고 효율적인 전력 관리를 가능하게 합니다. 이를 통해 전력 효율성을 극대화하는 방법을 배워 보겠습니다. 이번 포스팅에서는 전력 관리 기능, 저전력 모드의 종류, 설정 방법, 그리고 간단한 예제를 통해 저전력 모드를 어떻게 활용할 수 있는지 알아보겠습니다.

STM32F429ZI의 전력 관리 기능

STM32 마이크로컨트롤러는 다양한 전력 관리 기능을 제공하여 여러 상황에서 전력 소비를 최소화할 수 있도록 설계되었습니다. 주요 전력 관리 기능은 다음과 같습니다.

  • Sleep Mode: 코어 클럭을 정지하여 전력 소비를 줄이지만, 주변 장치들은 계속 동작할 수 있습니다.
  • Stop Mode: 대부분의 주변 장치와 클럭을 정지시키고 RAM 유지만 하는 상태로, 보다 낮은 전력을 소비합니다.
  • Standby Mode: 가장 낮은 전력 소비를 제공하는 모드로, 거의 모든 주변 장치와 클럭을 정지하고 데이터의 지속성을 최소화합니다.

각 저전력 모드는 상황에 맞게 사용되어 전력 소비를 최적화할 수 있도록 도와줍니다.

저전력 모드 설정 방법

STM32CubeIDE를 사용해 저전력 모드를 설정하는 방법을 단계별로 설명하겠습니다.

1. HAL 라이브러리의 전력 관리 기능 이해하기

STM32Cube HAL 라이브러리는 저전력 모드 설정을 쉽게 도와줍니다. 저전력 모드를 사용하기 위해서는 HAL_PWR_EnterSLEEPMode(), HAL_PWR_EnterSTOPMode(), HAL_PWR_EnterSTANDBYMode()와 같은 함수를 사용합니다. 이러한 함수들을 통해 개발자는 원하는 전력 모드를 선택할 수 있습니다.

2. Sleep Mode 설정하기

Sleep Mode는 가장 기본적인 저전력 모드로, 시스템 클럭을 멈추지만 주변 장치는 계속해서 동작하도록 설정됩니다. 이를 위해 아래와 같이 HAL 라이브러리를 사용하여 설정할 수 있습니다.

#include "stm32f4xx_hal.h"

void EnterSleepMode(void) {
    // WFI 명령어를 사용하여 SLEEP 모드로 진입
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}

PWR_MAINREGULATOR_ON은 전력 조절기를 켜진 상태로 유지하는 옵션이며, PWR_SLEEPENTRY_WFI는 WFI 명령어(Wait For Interrupt)를 사용하여 저전력 모드로 진입하도록 합니다.

3. Stop Mode 설정하기

Stop Mode는 보다 낮은 전력 소비를 위해 코어 클럭과 주변 장치 클럭을 모두 멈춥니다. 이 모드를 설정하기 위해서는 다음과 같이 설정합니다.

#include "stm32f4xx_hal.h"

void EnterStopMode(void) {
    // 모든 클럭을 멈추고 저전력 모드로 진입
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

    // 시스템이 깨어난 후 클럭 구성을 다시 설정
    SystemClock_Config();
}

Stop Mode에서는 PWR_LOWPOWERREGULATOR_ON 옵션을 사용하여 저전력 상태에서도 최소한의 전력 조절기를 유지할 수 있으며, 깨어난 이후에 시스템 클럭을 재설정하는 것이 필요합니다.

4. Standby Mode 설정하기

Standby Mode는 가장 낮은 전력을 소모하는 모드로, 대부분의 주변 장치 및 내부 상태를 유지하지 않고 시스템을 거의 완전히 끕니다.

#include "stm32f4xx_hal.h"

void EnterStandbyMode(void) {
    // Standby 모드로 진입
    HAL_PWR_EnterSTANDBYMode();
}

Standby Mode는 모든 주변 장치를 정지하고, 마이크로컨트롤러를 재부팅하는 경우에만 복원될 수 있습니다.

저전력 모드 예제 코드

다음은 저전력 모드의 사용을 설명하는 간단한 예제 코드입니다. 이 예제에서는 버튼을 눌렀을 때 각기 다른 저전력 모드로 진입하고, 인터럽트를 통해 다시 활성 상태로 돌아오는 기능을 구현하였습니다.

예제 코드

#include "stm32f4xx_hal.h"

// 외부 버튼 인터럽트 설정
void EXTI15_10_IRQHandler(void) {
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}

// 인터럽트 콜백 함수
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    if (GPIO_Pin == GPIO_PIN_13) {
        // 버튼을 눌렀을 때 Stop Mode로 진입
        EnterStopMode();
    }
}

// 메인 함수
int main(void) {
    HAL_Init();
    SystemClock_Config();

    // GPIO 설정 (버튼 입력)
    __HAL_RCC_GPIOC_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    // EXTI 라인 설정
    HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

    while (1) {
        // 시스템은 SLEEP 모드로 진입 대기
        EnterSleepMode();
    }
}

void SystemClock_Config(void) {
    // 기본 클럭 설정 함수 (HAL 라이브러리를 통해 설정)
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = 8;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 7;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
        // 오류 처리
        Error_Handler();
    }

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
                                  RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
        // 오류 처리
        Error_Handler();
    }
}

void Error_Handler(void) {
    // 오류 발생 시 LED를 점멸하거나 시스템을 정지하는 등의 처리
    while (1) {
    }
}

이 예제에서는 버튼 인터럽트를 통해 Stop Mode로 진입한 후, 다시 깨어나서 메인 루프에서 Sleep Mode로 대기하는 간단한 로직을 구현했습니다.

결론

이번 포스팅에서는 STM32F429ZI의 저전력 모드를 설정하고 활용하는 방법에 대해 알아보았습니다. STM32의 저전력 모드는 배터리 기반의 시스템이나 전력 효율이 중요한 프로젝트에서 매우 유용하게 사용될 수 있습니다. 저전력 모드를 적절히 사용하여 장치의 에너지 소비를 줄이고, 보다 효율적인 시스템을 설계하는 데 도움이 되었으면 합니다.

반응형