
MSPM0Gxx 시리즈의 특징으로 고성능, 저전력 기능이다. 전통적으로 MSP430시리즈는 저전력 기능이 우수 하였지만 성능에서 아쉬운점이 있었는데 MSPM0 시리즈로 오면서 성능까지 향상된것 같다.
MSPM0의 저전력 모드는 SLEEP, STOP, STANDBY, SHUTDOWN 모드로 구분된다.

Sleep 모드 4Mhz에서 200uA를 소모하고 Stop 모드에서 32khz에서 50uA를 소고 한다고 한다. 모소 전력 면에서 역시 MSPM0 시리즈가 탁월한 것 같다.

클럭이 살아 있는 STOP 모드에서 최소 46uA를 소모 한다고 하니.. 테스트 해볼 필요가 있을것 같다.

MSPM0G3507을 이용해서 스위치를 누르면 Sleep 모드로 진입 했다가 다시 누르면 깨어나서 동작 하는 기본 예제를 테스트 해보자.
우선 MSPM0G3507 SSM 보드의 PA18에 연결된 스위치에 인터럽트를 추가 한다.

스위치 인터럽트 핸들러에서 슬립모드로 진입하는 플그를 설정하고 메인함수에서 플래그 상태에 따라 각 슬립 모드함수로 파워 다운 할 수 있는 코드를 작성 했다.
#define Led1Off() DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN)
#define Led1On() DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN)
#define Led1Toggle() DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN)
#define Led2Off() DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_2_PIN)
#define Led2On() DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_2_PIN)
#define GetSwitch1() DL_GPIO_readPins(GPIO_SWITCH_PORT, GPIO_SWITCH_USER_SWITCH_1_PIN)
#define DELAY (16000000)
volatile bool g_stopMode = false; // 현재 STOP 모드 상태 플래그
void GROUP1_IRQHandler(void)
{
switch(DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1))
{
case GPIO_SWITCH_INT_IIDX:
/* If SW is high, turn the LED off */
if (GetSwitch1())
{
Led2On();
}
else {
Led2Off();
g_stopMode ^= 1;
}
break;
}
}
int main(void)
{
SYSCFG_DL_init();
Led1Off();
Led2Off();
NVIC_EnableIRQ(GPIO_SWITCH_INT_IRQN);
while(1)
{
if (g_stopMode) {
// STOP 모드 진입
//DL_SYSCTL_enterHaltMode(); // STOP 모드 진입
// 이 지점 이후는 버튼 눌림으로 깨어난 뒤 실행됨
Led2Off();
Led1Off();
// STOP0 정책 설정
//DL_SYSCTL_setPowerPolicySTOP0();
DL_SYSCTL_setPowerPolicySTOP2();
// WFI 실행 시 STOP0 진입
__WFI();
}
Led1Toggle();
delay_cycles(DELAY);
}
}
구동 테스트 결과 MSPM0 (MSPM0g3507) 에서 스위치를 누르면 저전력 모드로 진입하고 평소 2mA 정도의 소모 전류로 LED점등하다가 Stop모드로 진입하면 45uA 소모 되는것을 확인 할수 있다.
간단한 코드로 슬립모드 테스트가 가능하고 거의 스펙시트와 유사한 소모 전류가 측정되는것을 확인했다.

STM32U5 시리즈의 저전력 STOP2 모드 8uA와 비교하면 비교적 많이 소모 하는 편이지만 가격대비로 보면 나쁘지 않을것 같다.