본문 바로가기
임베디드/STM32

15. [STM32] Power - Low Power Mode

by fuhehe 2024. 11. 4.

이번시간에는 STM32의 저전력 모드에 대해 알아보자.

STM32는 일반적인 상태의 Run Mode이외에도 필요한 경우 전력소모를 줄이기 위한 저전력 모드가( Low-Power Mode)존재한다.

해당 장비가 특정상태에서 더이상 정상구동을 할 필요없이 대기상태로 들어가서 전력소모를 줄이고 다시 특정 신호에 의해 정상구동 상태로 돌아오게 할 때 사용할 수 있는 모드들이다.

 

이번 장은 레지스터 설명등은 필요한 경우만 할 것이고 S/W 구현 중심으로 보도록 하겠다.

 

  • 본 블로그는 STM32를 소프트웨어 엔지니어 관점에서 바라본 블로그입니다. 따라서 회로등의 전자공학 관련 내용은 사실과 다를 수 있습니다.
  • 본 블로그에서 사용된 MCU 및 개발보드는 다음과 같습니다.
    1. NUCLEO-F429ZI (STM32F429ZIT LQFP144)
    2. NUCLEO-F439ZI (STM32F439ZIT LQFP144)

 

 

1. 준비물

앞장을 읽었다면 이미 받아놓았을 STM32F의 레퍼런스를 받자.

그리고 이번장에서는 저전력에 관한 내용이므로 STM32F시리즈뿐 아니라 STM32L시리즈에 대해서도 간단히 다룰것이다.

내가 가지고 있는 보드중 STM32L시리즈가 있는 보드는 NUCLEO-L433RC-P보드여서 STM32L433RC 를 기반으로 설명할 것이기 때문에 이 MCU의 레퍼런스 매뉴얼도 받아놓자.

 

저전력 모드를 테스트하기 위해 외부 푸시버튼 몇개와 Standby모드의 Wake Up신호를 위해 외부에 풀다운된 버튼이 하나 필요하므로 풀다운 저항도 하나 필요하다.

 

  • 푸시 버튼 4개
  • 10KΩ 저항 1개

 

2. STM32F 시리즈의 저전력 모드

STM32F시리즈의 전력 모드는 STM32L시리즈에 비해 단순하다. 

먼저 NRST핀이 Low에서 High가 될 때 MCU는 일반적으로 Run Mode에 진입해서 우리가 만든 소스를 실행하게 된다.

그리고 정상동작이 필요없이 유휴시간이 존재할 때 사용자가 대기상태로 설정하면 MCU는 전력 소모를 줄이기 위해 특정 클럭등의 동작을 중지시키거나 줄인다.

 

STM32F시리즈의 저전력 모드는 레퍼런스 문서의 127p에 설명이 되어 있다.

 

1. Run Mode

아래 그림과 같이 Power-on reset(POR), Power-down reset(PDR)값에 따라 VDD/VDDA전압이 바뀌면 슈밋트리거 방식으로 Reset핀(NRST)이 설정된다.

 

[POR/PDR waveform]

NRST핀이 High가 되면 MCU는 Run Mode로 진입하고 모든 클럭과 Peripheral, 인터럽트, 각 전원등이 정상 동작하는 상태가 된다.

 

2. Low-Power Mode

Run Mode상태에서 사용자 설정에 의해 MCU는 저전력 모드로 진입할 수 있다. 

저전력 모드에서는 종류에 따라 클럭의 동작이 느려지거나 작동을 중지하며 전원공급을 하는 레귤레이터도 전력소모를 줄이거나 중지된다.

당연한 말이지만 Low-Power모드로 들어갈 때 전력소모를 더 많이 줄이는 모드일수록 Wake-up시간은 늦어진다.

따라서 전력소모는 Sleep>Stop>Standby 이지만 Wake-up시간은 Standby>Stop>Sleep순이다.

 

A. Sleep Mode

모든 Peripheral 클럭들은 정상 동작하고 메인 프로세스 클럭만 중지시킨다. 따라서 모든 Peripheral핀들과 RTC, SRAM, 레지스터 내용은 그대로 보존된다.

시스템 컨트롤 레지스터(SCR)의 2번비트 SLEEPDEEP을 0으로 설정해서 진입할 수 있다. 

HAL 라이브러리에 Sleep Mode로 진입하는 함수가 있는데 프로토타입은 아래와 같다.

void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)

첫번째 파라미터인 Regulator는 MCU에 전원을 공급하는 레귤레이터의 종류를 지정하는 파라미터인데 PWR_MAINREGULATOR_ON, PWR_LOWPOWERREGULATOR_ON 두가지를 사용할 수 있으나 STM32F시리즈의 경우 함수내부에서 이 파라미터는 사용되지 않는다.

두번째 파라미터인 SLEEPEntry는 Sleep Mode로 들어간 뒤 Wake up 신호를 WFI(Wait for interrupt) 또는 WFE(Wait for event) 두개의 인스트럭션 중 어떤 걸 사용할 지 결정하는 파라미터이다. 다시 말해 Wake up신호를 Interrupt를 사용할 지 Event를 사용하지 결정하는 파라미터이다. 이 파라미터에는 다음의 값들을 사용할 수 있다.

  • PWR_SLEEPENTRY_WFI : WFI인스트럭션 사용
  • PWR_SLEEPENTRY_WFE : WFE인스트럭션 사용.(단, Sleep 모드 진입시 Pending된 이벤트는 모두 클리어)
  • PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR : WFE인스트럭션 사용.(단, Sleep 모드 진입시 Pending된 이벤트 클리어하지 않음)

 

B. Stop Mode

이 모드에서는 1.2V 도메인에 연결된 모든 클럭은 중지되고 PLL, HSI, HSE RC 오실레이터는 모두 Disable된다. 또한 PWR_CR레지스터의 PDDS, LPDS비트 값에 따라 레귤레이터를 Normal/Low-Power 둘 중 하나로 동작시킬 수 있다.

SRAM과 레지스터는 내용이 모두 보존된다.

이 모드로 진입하는 HAL Library함수는 다음과 같다.

void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry)

첫번째 파라미터는 Sleep Mode 함수와 동일한 값을 사용한다. Sleep Mode와 달리 Stop Mode에서는 이 파라미터가 유효하다.

두번째 파라미터도 Sleep Mode와 동일한데 정의된 이름만 약간 다르다.(PWR_STOPENTRY_WFI, PWR_STOPENTRY_WFE, PWR_STOPENTRY_WFE_NO_EVT_CLEAR)

 

 

C. Standby Mode

3개 모드중 전력소모가 가장 적은 모드로 이 모드에 진입하면 1.2V 도메인은 Off상태가 되며 PLL, HSI, HSE모두 꺼진다.

SRAM과 레지스터 역시 내용을 모두 잃는다.

한마디로 전원을 끈 상태와 비슷하게 된다.

이 모드로 진입하는 HAL Library함수는 다음과 같다.

void HAL_PWR_EnterSTANDBYMode(void)

이 함수는 파라미터가 없다.

Standby 모드에서 깨어나면 MCU가 Reset되어 다시 실행되는 상태와 비슷하다. main()함수도 처음부터 실행이 된다. 차이점이 있다면 Backup Domain으로 분류된 RTC 레지스터, RTC Backup 레지스터, Backup SRAM에 대해서는 값을 보존해준다는 것이다.  따라서 개발자가 필요에 따라 상태를 유지해야 하는 내용이 있다면 Standby모드 진입전 Backup Domain쪽에 먼저 저장 한 뒤 Wake up시 이 내용을 다시 가져와서 설정할 수 있다.

(Backup Domain 엑세스는 다음장에서 다뤄볼 것이다.)

 

Wake up방법은 WKUP 핀을 High상태로 만들거나, RTC 알람, RTC Wake-up, Tamper event, Time stamp event, NRST핀에 의한 외부 리셋, IWDG리셋을 하면 된다.

 

 

3. STM32L 시리즈의 저전력 모드

STM32L시리즈는 목적자체가 저전력을 위한 MCU이므로 STM32F 시리즈에 비해 모드의 종류가 다양하다.

STM32L의 저전력모드는 레퍼런스 매뉴얼 137p에 소개되어 있으므로 참고하자. 

STM32F시리즈와 비교해 가장 큰 차이점은 STM32L시리즈에는 Low power run mode가 존재한다는 것이다.

즉 일반적인 Run모드와 Low power run모드 두가지 상태가 존재하므로 이에 따른 Sleep모드와 Stop모드도 구분해서 정의되어 있다.

[STM32L시리즈의 Low-Power모드]

 

A. Low power run mode

이 모드는 PWR_CR1레지스터의 LPR비트를 1로 설정해서 진입하거나 HAL_PWREx_EnableLowPowerRunMode()함수를 호출해서 진입할 수 있다.

이 모드에서는 시스템 Clock이 2MHz로 감소한 채 시스템이 구동되며 레귤레이터 역시 저전력 모드로 구동된다.

 

B. Sleep mode

Sleep모드는 STM32F와 다르게 일반 Sleep Mode와 Low power Sleep Mode가 존재한다. 위의 그림에서 보듯 일반 Run mode에서는 Sleep mode로만, Low power run mode에서는 Low power sleep mode로만 진입이 가능하다.

Sleep모드로 진입하는 함수는 STM32F시리즈와 동일하다.

void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)

하지만 Regulator 파라미터가 STM32F에서는 사용되지 않았지만 STM32L에서는 사용되는데 이 값에 따라 일반 Sleep모드 (PWR_MAINREGULATOR_ON) 인지, Low power sleep모드(PWR_LOWPOWERREGULATOR_ON)인지가 결정된다.

이 함수 내부를 보면 현재 상태가 일반 Run모드 상태에서 Regulator파라미터를 PWR_LOWPOWERREGULATOR_ON 으로 입력하면 HAL_PWREx_EnableLowPowerRunMode()함수를 먼저 호출한 뒤 Sleep모드로 진입하도록 코딩되어 있다.

 

C. Stop mode

Stop모드에서는 SRAM1, SRAM2와 모든 레지스터 상태는 유지된다. Vcore Domain에 연결된 모든 Clock은 중지되므로 SRAM1, SRAM2, 레지스터를 제외한 메모리와 Digital Peripheral은 작동이 중지된다. 그리고 LSI, LSE를 제외한 PLL, MSI(STM32F시리즈에는 HSI, LSI이외에 MSI가 존재한다), HSI16, HSE모두 Disable된다.

Stop모드는 Stop0, Stop1, Stop2 총 세개의 모드로 구분되는데 Stop0, Stop1은 메인 레귤레이터가 Low Power인지 여부만 다르다. 

Stop2의 경우 Wake up신호 수신이 가능한 I2C3, LPUART등으로부터 신호를 수신할 때 HSI16을 켜서 확인할 수 있고 Wake up신호가 아닐 경우 다시 HSI16을 끌 수 있다.

Stop0, Stop1 모드 진입시 다음 함수를 사용한다.

void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry)

Regulator파라미터에 PWR_MAINREGULATOR_ON을 전달하면 Stop0모드, PWR_LOWPOWERREGULATOR_ON을 전달하면 Stop1모드로 진입한다.

STOPEntry파라미터는 STM32F시리즈와 비슷하게 PWR_STOPENTRY_WFI, PWR_STOPENTRY_WFE두가지가 있다.

사실 함수 내부에서는 다시 Regulator파라미터에 따라 HAL_PWREx_EnterSTOP0Mode(), HAL_PWREx_EnterSTOP1Mode()로 구분해서 별도 함수를 호출하게 되어 있으므로 실제 모드전환은 이 함수내부에서 처리된다.

Stop2로 진입하기 위해서는 HAL_PWREx_EnterSTOP2Mode()를 호출하면 된다.

 

D. Standby mode

이 모드에서는 Vcore domain의 전원이 차단되고 Clock또한 중지된다. 그리고 LSI, LSE를 제외한 PLL, MSI(STM32L시리즈에는 HSI, LSI이외에 MSI가 존재한다), HSI16, HSE모두 Disable된다.

호출함수는 STM32F와 동일하다.

void HAL_PWR_EnterSTANDBYMode(void)

 

E. Shutdown mode

이 모드는 Standby에 더해 LSI도 disable된다. 또한 전압공급 모니터링이 중지되므로 전압강하에 대한 정상구동을 보증할 수 없다.

호출함수는 아래와 같다.

void HAL_PWREx_EnterSHUTDOWNMode(void)

 

 

 

 

4. 저전력 모드 코딩

NUCLEO F429Zi보드로 저전력 모드를 테스트 해보자.

외부에 4개의 푸시 버튼을 연결하고 이 중 3개는 각각 Sleep/Stop/Standby 모드 선택용으로 사용한다. 이 3개는 각 GPIO핀과 다이렉트로 연결해서 사용할 것이다.

그리고 나머지 하나는 Standby Mode의 Wake up용 신호를 위해 WKUP핀에 연결할 것이다. Pull-down상태로 만들어야 하므로 저항을 하나 추가하여 회로를 구성하자.

그리고 NUCLEO보드의 LED 3개는 각각 Sleep/Stop/Standby모드 선택 표시용으로 사용한다.

보드에 달린 User Button은 Sleep/Stop 모드의 Wake up용 Event신호로 사용할 것이다.

 

[회로]

  • PA0 : NUCLEO보드의 WKUP핀은 PA0에 연결되어 있다. 따라서 PA0를 Pull-down된 버튼에 연결한다.
  • PA3 : Sleep모드 선택용 푸시 버튼에 연결한다.
  • PC0 : Stop모드 선택용 푸시 버튼에 연결한다.
  • PC3 : Standby모드 선택용 푸시 버튼에 연결한다.

GPIO설정은 다음과 같다.

[GPIO 설정]

User Button에 할당된 PC13의 경우 GPIO mode를 "External Event Mode with Rising edge trigger detection" 항목을 선택해서 Sleep/Stop 모드의 Wake up신호로 Event를 사용하도록 했다. (인터럽트 방식을 사용해도 무방하나 Sleep/Stop모드 진입 함수 호출시 파라미터에 WFE대신 WFI를 넘겨줘야 한다.)

또 PA0의 경우 위에도 설명했지만 Standby 모드의 Wake up신호로 사용하기 위해 아래 그림과 같이 SYS_WKUP로 설정해야 한다. 

[PA0핀 - SYS_WKUP설정]

또한 System Core-SYS 에서 System Wake-Up에 체크를 해주어야 PA0의 SYS_WKUP이 유효해진다. (PA0을 SYS_WKUP으로 지정하면 자동으로 체크된다.)

[System Wake-Up]

 

 

설정이 완료되었으면 다음과 같이 코딩하자. (main.c 전체 소스가 아니라 작성해야할 소스 위주로만 적었다)

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */


/* USER CODE BEGIN PV */
typedef enum
{
	UNSET_MODE		= 0,
	SLEEP_MODE		= 1,
	STOP_MODE		= 2,
	STANDBY_MODE		= 4
} ELOWPOWER_MODE;


ELOWPOWER_MODE gCurrentMode = UNSET_MODE;	// 최초 상태는 Low-Power모드 진입하지 않음

/* USER CODE END PV */


/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// SWV ITM콘솔창에 디버깅 메지시를 표시하기 위한 함수정의
int __io_putchar(int ch)
{
	// Write character to ITM ch.0
	ITM_SendChar(ch);
	return(ch);
}

// 현재 선택 모드에 따른 LED표시
void setLED(ELOWPOWER_MODE mode)
{
	uint8_t uiMode = (uint8_t)mode;

	HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, uiMode & 0x01);
	HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, uiMode & 0x02);
	HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, uiMode & 0x04);

}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ETH_Init();
  MX_USART3_UART_Init();
  MX_USB_OTG_FS_PCD_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  uint32_t uiStart = HAL_GetTick();	// 사용자 버튼 눌림 감지 시작 시간 설정
  uint32_t uiEnablePrint = 0;
  int nCount = 0;
  
  // LED초기화
  HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);


  printf("Started\n");

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	// 아무 입력없이 3초가 지났는지 체크
	if(HAL_GetTick() - uiStart >= 3000)
	{

		if(gCurrentMode != UNSET_MODE)
			printf("Entering Low Power Mode : ");

		if(gCurrentMode == SLEEP_MODE)
		{
			printf("Sleep Mode.\n");
			HAL_Delay(200);	// 디버깅 메시지를 표시하기 위한 Delay

			HAL_SuspendTick();
			__HAL_RCC_PWR_CLK_ENABLE();
			HAL_PWR_EnterSLEEPMode(0, PWR_SLEEPENTRY_WFE);	// WFE 즉 Event신호로 깨어나도록 함


			HAL_ResumeTick();
			SystemClock_Config();

			printf("Waking up Sleep Mode.\n");
		}
		else if(gCurrentMode == STOP_MODE)
		{
			printf("Stop Mode.\n");
			HAL_Delay(200);	// 디버깅 메시지를 표시하기 위한 Delay

			HAL_SuspendTick();
			__HAL_RCC_PWR_CLK_ENABLE();
			HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);	// WFE 즉 Event신호로 깨어나도록 함


			HAL_ResumeTick();
			SystemClock_Config();

			HAL_Delay(100);
			printf("Waking up Stop Mode.\n");
		}
		else if(gCurrentMode == STANDBY_MODE)
		{
			printf("Standby Mode.\n");
			HAL_Delay(200);	// 디버깅 메시지를 표시하기 위한 Delay



			// 모든 Wake-up 소스 Disable: PWR_WAKEUP_PIN1
			HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);

			// 모든 Wake-up 플래그 Clear
			__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

			//PA0에 연결된 PWR_WAKEUP_PIN1 다시 활성화
			HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);

			//__HAL_RCC_PWR_CLK_ENABLE();
			HAL_PWR_EnterSTANDBYMode();
		}

		// Wake up시 uiStart다시 설정
		uiStart = HAL_GetTick();

	}


	// 버튼 확인
	if(HAL_GPIO_ReadPin(BTN_SLEEP_GPIO_Port, BTN_SLEEP_Pin) == GPIO_PIN_SET)
	{
		gCurrentMode = SLEEP_MODE;
		uiStart = HAL_GetTick();
	}
	if(HAL_GPIO_ReadPin(BTN_STOP_GPIO_Port, BTN_STOP_Pin) == GPIO_PIN_SET)
	{
		gCurrentMode = STOP_MODE;
		uiStart = HAL_GetTick();
	}
	if(HAL_GPIO_ReadPin(BTN_STANDBY_GPIO_Port, BTN_STANDBY_Pin) == GPIO_PIN_SET)
	{
		gCurrentMode = STANDBY_MODE;
		uiStart = HAL_GetTick();
	}

	// LED표시
	setLED(gCurrentMode);

	// 디버그용 카운터 출력
	if(uiEnablePrint++ > 100000)
	{
		printf(">> Count : %d\n", nCount++);
		uiEnablePrint = 0;
	}

  }
  /* USER CODE END 3 */
}

 

HAL_PWR_EnterSLEEPMode()와 HAL_PWR_EnterSTOPMode()함수의 경우 호출되는 즉시 Low-Power모드로 진입하고  Wake-up시에 바로 함수 다음부터 실행을 재개한다. 따라서 이 두 모드의 경우 Wake-up시 해야 할 작업을 함수호출 바로 다음에 적어주면 된다.

하지만 HAL_PWR_EnterSTANDBYMode()함수의 경우 Wake-up시 대부분의 상태가 Reset되므로 main함수 처음부터 실행이 재개된다. 따라서 이 함수 뒤에 Wake-up시 수행할 작업을 코딩해봤자 실행되지 않는다.

다만, 다른장에서 설명할 Backup Domain관련 저장장소에 미리 값을 유지해야할 변수값을 저장해놓고 main함수가 다시 시작되어 while문 진입하기 전에 이 값을 읽어와서 변수값을 다시 설정할 수 있다.

 

그리고 중요한 내용 하나가 Sleep/Stop모드 진입시 반드시 SysTick 인터럽트를 중지해야 한다는 것이다. 그렇지 않으면 모드 진입 후 이 인터럽트 때문에 곧바로 Wake-up되어 버린다.

모드진입시 SleepEntry파라미터를 WFE로 설정해도 마찬가지이므로 반드시 위의 소스와 같이 HAL_SuspendTick()함수를 먼저 호출해주고 Wake-up시 다시 HAL_ResumeTick()함수로 SysTick인터럽트를 재개해주자.

 

이외에 진입전 __HAL_RCC_PWR_CLK_ENABLE() 매크로를 호출해 주는데 APB1에 RTC나 Backup SRAM같은 Backup Domain관련 장치들이 연결되어 있으므로 이를 활성화시키기 위함이다. main()함수 시작시 SystemClock_Config()에서 호출하기는 하지만 안전상 한번더 호출한 것이므로 빼도 무방하다.

 

Wake-up시 SysTick을 다시 재개하고 SystemClock_Config()도 호출해 주는데 이것역시 안전상 한번더 호출해준 것이다.

 

Standby모드의 경우 모드 진입전 Wake-up신호를 한번 클리어 해준 뒤 Standby모드로 진입하기 위해 몇가지 작업이 선행되었다.

 

 

코딩이 완료되었으면 F11을 눌러 Debug모드로 실행하면 SWV ITM Console창에 nCount값이 표시될 것이다.(SWV/ITM관련 설정은 SWV/ITM을 사용한 디버깅 글을 참조하라)

최초 상태는 UNSET모드이므로 nCount값만 증가된다. 이때  PA3, PC0, PC3에 연결된 외부 버튼을 눌러 각 모드를 설정하면 3초 뒤 해당 모드로 진입하면서 Console창에 모드로 진입한다는 메시지가 표시된다.

그리고 Sleep/Stop모드인 경우 NUCLEO보드의 User Button을, Standby모드인 경우 외부 PA0에 연결된 버튼을 누르면 Wake-up된다.

각 모드로 테스트 해보면 알겠지만 Sleep/Stop모드는 Wake-up시에도 nCount값을 그대로 유지한다. 하지만 Standby모드인 경우 nCount값이 초기화되어 버린다.

 

 

5. 각 모드별 전류값 알아보기

NUCLEO보드를 사용하고 있다면 각 모드별로 전류값을 측정하기는 쉽다.

보드의 IDD 점퍼 스위치를 빼고 거기에 멀티미터를 연결하기만 하면 된다.

[IDD 점퍼 스위치]

위 NUCLEO-F429/439 그림처럼 보드의 중앙 위쪽의 Idd Measurement(JP5)핀의 딥스위치를 빼고 거기에 멀티미터를 연결해 측정이 가능하다.

 

6. 마무리

이번장에서는 STM32의 Low-Power 모드에 대해 알아보았다.

소스대로 한다면 구현에 그리 어려운 내용은 없다. 다만 HAL_PWR_EnterSLEEPMode(), HAL_PWR_EnterSTOPMode() 함수를 인터럽트 콜백 함수안에서 호출한다면 Wake-up되지 않으므로 주의하자.

 

다음 시간에는 Standby모드 진입과 Wake-up시 기존 정보를 저장하는 Backup Domain에 대해 살펴볼 것이다.

 

 

'임베디드 > STM32' 카테고리의 다른 글

17. [STM32] Power - PVD  (0) 2024.11.08
16. [STM32] Power - Backup Domain Access  (0) 2024.11.07
14. [STM32] Interrupt 구현하기  (0) 2024.10.10
13. [STM32] Interrupt-Register  (0) 2024.09.26
12. [STM32] Interrupt 개요  (0) 2024.09.26