Shutdown 절전모드

STM32는 여러가지 절전모드를 제공한다. 어떤 모드에서는 메모리 내용을 보전해주고, 어떤 모드에서는 절전모드에서 빠져나오는 시간이 짧고. 각각 상황에서 필요한 모드가 있다.

Shutdown 모드는 말그대로 그냥 CPU, Memory, Peripheral, Clock Source 등 거의 다 꺼버린다. 당연히 원래 돌리고 있던 프로그램은 죽어버리고 다시 살아 올라올때는 main() 함수 처음부터 실행 된다.

Manual에는 wfi, wfe 둘다 Shutdown Mode로 들어갈 수 있다고 나오는데, HAL HAL_PWREx_EnterSHUTDOWNMode()에서는 wfi를 사용한다.(STM32CubeL4 v1.11.0)

RTC Periodic Auto-Wakeup

Shutdown 모드가 절전 모드로 유용하려면 꺼진 상태에서 다시 켜질 방법이 있어야 한다. Shutdown 모드에서 다시 켜지는 방법이 세 가지가 있다. 1) NRST Pin, 2) WKUPx Pin, 3) RTC Event.

1), 2)는 수동으로 해주던 다른 MCU에서 해주던 외부에 다른 무언가가 있어야한다. 3)은 L432 자체의 RTC를 사용하기 때문에 외부의 다른 무언가가 필요없기 때문에 주기적으로 실행되는 Application에서 가장 적합하다.

먼저 Shutdown 상태에서도 RTC를 살려 놓으려면 RTC Clock Source를 LSE로 해줘야한다. 그리고 Periodic Auto-Wakeup을 Interrupt로 설정하면 Shutdown 상태에서도 지정된 시간이 지나면 Wakeup Interrupt가 발생해서 Shutdown Mode에서 빠져나오도록 해준다. (메뉴얼 어디에는 Event로도 되는 것 처럼 써있고 다른 어디에는 Interrupt만 되는 것 처럼 써있고..)

Shutdown 문제

최초 전원을 넣고 한번은 Shutdown이 되고 RTC에 Auto-Wakeup으로 지정한 시간이 지나면 올라온다. 그런데 두 번째 Shutdown이 안되는 현상이 보였다.

Shutdown Mode에서 Auto-Wakeup으로 올라오면 WUTF 플래그가 설정 되는데 이걸 클리어 하지 않으면 Shutdown Mode로 못 들어간다. Shutdown Mode에서 Wakeup하고 나면 적어도 다음 Shutdown으로 들어가기 전에는 아래와 같이 플레그를 클리어 해야한다.

__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG();
__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);

RTC 시간 설정 문제

HAL로 RTC Code를 생성한 경우 RTC 시간 설정하는 코드가 아래의 if문 안쪽에 들어가게 된다.

  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2) {
  ...
  }

문제는 이 if문 안에 들어있는 코드는 최초 전원이 들어 올때만 실행되고, Reset이 되던, Code를 다시 Program해도 RTC_BKP_DR0 레지스터의 값이 살아있기 때문에 실행되지 않는다. 해당 if문 안쪽 코드를 수정했으면 전원을 아예 뺐다 껴줘야 한다.