CH582 마이크로컨트롤러 저전력 슬립 모드 구현 및 테스트

CH582 저전력 슬립 모드 개요

임베디드 시스템에서 전력 효율은 특히 배터리 구동 장치에서 중요한 설계 요소입니다. CH582 마이크로컨트롤러는 다양한 절전 모드를 제공하여 전력 소비를 최소화할 수 있습니다. 이 문서는 CH582의 슬립 모드를 활용한 저전력 구현 전략과 RTC(실시간 클럭) 및 외부 인터럽트를 통한 시스템 깨우기(Wake-up) 방법을 설명합니다.

다음 표는 CH582 슬립 모드에서 RTC 깨우기 기능을 사용할 때의 예상 전력 소비량 데이터를 요약합니다. 이는 저전력 설계를 위한 기준점으로 활용될 수 있습니다.

CH582 슬립 모드 RTC 깨우기 주기 슬립 모드 (비활성 상태) 전력 소비량 깨어난 후 동작 (지연 루틴만) 전력 소비량 주기당 평균 전력 소비량 (RTC 깨우기 + 2ms 활성)
RTC 타이머 1초 깨우기 3.23uA 5.46mA 12.31uA
RTC 타이머 250ms 깨우기 3.22uA 5.41mA 54.46uA

저전력 설계를 위한 권장 사항

효율적인 저전력 시스템을 구축하기 위해 다음 사항들을 고려해야 합니다:

  1. **IO 핀 설정 최적화**: 모든 IO 핀은 가능한 한 풀업(Pull-Up) 또는 풀다운(Pull-Down) 입력으로 구성하거나, 중간 전압 상태일 경우 아날로그 입력으로 설정해야 합니다. 출력이 필요한 경우 하드웨어적으로 풀업/풀다운 저항을 추가하는 것이 좋습니다.
  2. **미사용 IO 핀 처리**: 사용하지 않는 IO 핀은 부동(floating) 상태로 두면 상당한 전력 소모가 발생할 수 있습니다. 따라서 반드시 IPU(내부 풀업), IPD(내부 풀다운), 또는 PP(푸시-풀) 출력으로 설정하여 안정화해야 합니다.
  3. **외부 장치와의 연결**: 칩의 IO 핀과 외부 장치 연결 시, 외부 장치의 전압 레벨과 일치하도록 칩의 IO 핀을 구성하여 불필요한 전류 흐름을 방지합니다. 예를 들어, 외부 핀이 High 레벨이면 칩 핀도 풀업으로, Low 레벨이면 풀다운으로 설정합니다.
  4. **외부 발진기 사용 제한**: 슬립 모드에서는 외부 크리스털 발진기를 사용하지 않는 것이 좋습니다. 대신 내부 RC 발진기를 활용하고, 외부 크리스털 핀은 일반 IO로 재매핑하여 IPU/IPD/PP로 설정하여 부동 상태가 되지 않도록 합니다.
  5. **전원 관리 모듈 클럭 활성화**: 특정 아키텍처 (예: ARM Cortex-M 기반)에서 전력 관리 모듈을 사용하려면 해당 클럭(예: RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE))을 반드시 활성화해야 합니다.
  6. **디버그 포트 비활성화**: JTAG 포트와 같은 디버그 인터페이스는 사용하지 않을 때 비활성화하고 일반 IO로 재구성하여 전력 소모를 줄입니다.
  7. **미사용 주변 장치 클럭 관리**: 사용하지 않는 주변 장치의 클럭은 비활성화하여 전력을 절약합니다. 단, 인터럽트를 통해 시스템을 깨울 때 사용되는 주변 장치(예: RTC)의 클럭은 유지해야 합니다.

외부 인터럽트를 이용한 슬립 모드 해제

CH582는 GPIO 핀을 통해 외부 인터럽트를 발생시켜 슬립 모드에서 깨어날 수 있습니다. 다음은 PB1 핀의 하강 에지를 사용하여 시스템을 깨우는 예시 코드입니다.

GPIO 초기화 및 인터럽트 설정


// 모든 GPIO 핀을 초기 풀업 입력으로 설정하여 안정화
Initialize_All_GPIO_Pins(GPIO_PORT_A, GPIO_MODE_INPUT_PULLUP);
Initialize_All_GPIO_Pins(GPIO_PORT_B, GPIO_MODE_INPUT_PULLUP);

// PB1 핀을 인터럽트 소스로 구성
Configure_GPIO_Pin(GPIO_PORT_B, GPIO_PIN_1, GPIO_MODE_INPUT_PULLUP);
Set_External_Interrupt_Trigger(GPIO_PORT_B, GPIO_PIN_1, INTERRUPT_EDGE_FALLING); // 하강 에지 트리거
Enable_Peripheral_Interrupt(IRQ_GPIO_B_VECTOR);

// 전원 관리 시스템에 GPIO를 깨우기 소스로 등록
Power_System_Set_Wakeup_Source(ENABLE_WAKEUP, WAKEUP_SOURCE_GPIO_EVENT, WAKEUP_DELAY_LONG_PERIOD);

메인 루프 동작

시스템은 짧은 활성 기간을 거친 후 슬립 모드로 진입하고, PB1 인터럽트가 발생하면 다시 깨어나 일정 시간 동작한 후 재차 슬립 모드로 들어갑니다.


// 메인 애플리케이션 루프
while(1)
{
    Serial_Debug_Print("시스템 절전 모드 진입 준비 중...\n");
    HAL_DelayMillis(2); // 2ms 지연

    // 80MHz 주파수에서 슬립 모드 깨어나기 시 플래시 내 코드 호출 제한에 유의
    // 32KB SRAM 전원을 유지하며 저전력 슬립 모드 진입
    PowerManager_EnterSleep(SRAM_RETENTION_MODE_32KB_TOTAL);

    // HSE 발진기 편향 전류를 정격 수준으로 복원 (저전력 함수 내에서 일시적으로 증가했을 수 있음)
    Oscillator_HSE_Set_Current(HSE_CURRENT_RATED);

    HAL_DelayMillis(5); // 5ms 지연
    Serial_Debug_Print("슬립 모드에서 시스템 재활성화...\n");
    HAL_DelayMillis(200); // 200ms 지연
}

GPIOB 인터럽트 서비스 루틴

PB1 핀에 대한 인터럽트가 발생하면 다음 ISR이 실행되어 인터럽트 플래그를 클리어합니다.


// GPIOB 인터럽트 서비스 루틴
__INTERRUPT
__HIGH_CODE
void GPIOB_Interrupt_Handler(void)
{
    // PB1 핀의 인터럽트 플래그를 클리어
    Clear_GPIO_Interrupt_Flag(GPIO_PORT_B, GPIO_PIN_1);
}

이 구성을 통해 시스템은 PB1 핀의 외부 신호에 반응하여 저전력 상태에서 복귀할 수 있습니다. 위 코드를 실행하면, 시스템은 일정 주기로 슬립 모드와 활성 모드를 반복하는 전력 파형을 관찰할 수 있습니다.

RTC 타이머를 이용한 슬립 모드 해제

RTC는 정확한 시간 간격으로 시스템을 슬립 모드에서 깨울 수 있는 효과적인 방법입니다. 다음은 RTC를 사용하여 시스템을 주기적으로 깨우는 방법을 보여줍니다.

1초 주기 RTC 깨우기 설정


// RTC 타이머를 1초 주기로 설정
RTC_Timer_Configure_Period(RTC_PERIOD_1_SECOND);
// RTC 인터럽트 활성화
Enable_Peripheral_Interrupt(RTC_TIMER_IRQ_VECTOR);
// 전원 관리 시스템에 RTC를 깨우기 소스로 등록
Power_System_Set_Wakeup_Source(ENABLE_WAKEUP, WAKEUP_SOURCE_RTC_TIMER, WAKEUP_DELAY_SHORT_PERIOD);

RTC 알람 인터럽트 서비스 루틴

RTC 타이머 이벤트가 발생하면 다음 ISR이 호출되어 이벤트 플래그를 처리합니다.


// RTC 알람 인터럽트 핸들러
__INTERRUPT
__HIGH_CODE
void RTC_Alarm_Interrupt_Handler(void)
{
    // RTC 타이머 이벤트 플래그 확인 및 클리어
    if (RTC_Get_Event_Flag(RTC_EVENT_TIMER_MATCH))
    {
        RTC_Clear_Event_Flag(RTC_EVENT_TIMER_MATCH);
    }
}

250ms 주기 RTC 깨우기 설정

RTC 타이머 주기를 250ms로 변경하여 더 짧은 간격으로 시스템을 깨울 수도 있습니다.


// RTC 타이머를 250ms 주기로 설정
RTC_Timer_Configure_Period(RTC_PERIOD_250_MILLISECONDS);
// RTC 인터럽트 활성화
Enable_Peripheral_Interrupt(RTC_TIMER_IRQ_VECTOR);
// 전원 관리 시스템에 RTC를 깨우기 소스로 등록
Power_System_Set_Wakeup_Source(ENABLE_WAKEUP, WAKEUP_SOURCE_RTC_TIMER, WAKEUP_DELAY_SHORT_PERIOD);

태그: CH582 저전력 슬립모드 RTC GPIO인터럽트

7월 22일 08:56에 게시됨