|
MCU는 내부에 많은 시스템 제어 기능을 가지고 있다.
전력관리 제어기 (PWR)
PWR은 기본적으로 VDD 단자를 통해 입력된 전원전압 2.0 ~ 3.6V를 각 회로에 공급하고, 이로부터 내부 정전압 레귤레이터에서 1.8V의 전원을 만들어 CPU 코어에 공급한다.
그러나 LSE 발진 회로, RTC, 백업 레지스터 등은 VDD 단자의 전원이 차단되더라도 이와 별도로 VBAT 단자로 공급되는 전원으로 사용하여 동작한다.
또한 ADC, DAC, 리셋회로, 온도센서, PLL 회로와 같은 아날로그 회로에는 VDDA 단자를 통하여 별도의 전원을 공급해야 하는데, 이 아날로그 전압의 범위는 2.4~3.6V로서 VDD 전압보다 크거나 같아야 한다.
정전압 레귤레이터
CPU가 정상 모드 (Run mode) 로 동작할 때 이 레귤레이터는 1.8V의 전압을 출력하며,
CPU가 정지 모드 (Stop mode) 에 있을 때는 내부의 레지스터나 SRAM의 내용을 유지할 수 있을 정도까지 레귤레이터 전압을 최대한 낮춘다.
CPU가 대기 모드 (Standby mode)에 있을 때는 이 레귤레이터의 출력이 차단되어 백업 회로를 제외한 내부 레지스터나 SRAM 내용이 소실된다.
배터리 백업 영역
전원 단자 VDD에 전원이 공급되지 않더라고 VBAT 단자를 통하여 별도로 1.65~3.6V 범위의 전원을 공급받는 회로를 배터리 백업 영역 (battery backup domain) 이라고 한다. VDD 단자의 전원이 차단되면 리셋 제어기의 전원검출 회로에서 이를 인식하여 배터리 백업 영역의 전원 공급을 VDD 단자에서 VBAT 단자로 스위칭한다.
배터리 백업 영역에 포함되는 회로는 RTC, LSE 오실레이터, GPIO의 PC13~PC15 단자 등이다. 만약 배터리 백업 기능을 사용하지 않는다면 VBAT 단자를 VDD 단자에 연결하고 0.1pF 커패시터로 바이패스 해주는 것이 바람직하다. 배터리 백업 영역이 VDD 단자를 통해 전원을 공급받는 경우에는 PC13~PC15 단자가 GPIO 또는 그밖의 기능으로 모두 사용할 수 있다. 그러나 배터리 백업 영역이 VBAT 단자로 전원을 공급받을 경우에는 PC13~PC15 단자가 GPIO로 사용될 수 없고 LSE 오실레이터와 관련된 기능으로만 사용되어야 한다.
키트의 경우를 보면,
위 그림처럼 VBAT 이 VDD에 연결되어 있다. 그렇다면 PC13 ~ PC15 단자를 GPIO로 쓸 수 있다는 말인데, 키트에서는 ?
위 그림처럼 GPIO로 사용한 것을 알 수 있다.
그렇다면 보드의 LCD 옆에 보이는 망간 배터리는 다른 용도인가보다.
회로도에 보면 RTC 칩도 따로 썼던데, 그거 용도로 추정됨.
A/D 컨버터 및 D/A 컨버터 회로의 전원
ADC 및 DAC 에는 디지털 회로 전원인 VDD에 비하여 좀 더 안정적인 전원을 공급해야만 정밀한 동작이 가능하므로 VDDA 와 VSSA 단자를 통하여 별도로 전원이 공급된다.
보통 VDDA 단자에는 VDD 전원을 1uF 및 0.01uF 커패시터로 필터링하여 공급하며, 이때 VSSA 단자는 디지털 전원의 접지 단자에 함께 접속한다. 그러나 와전히 분리된 다른 전원을 VDDA 단자에 공급하는 경우에는 이것의 전위가 VDD 단자보다 높거나 같아야 하며, 이를 위해 쇼트키 다이오드를 VDDA 단자에서 VDD 단자 쪽으로 연결하여 사용하기도 한다.
키트의 경우를 보면,
일단, 그냥 디지털 전원인 VDD 소스인 +3.3V에 연결하였다.
그렇지만 10uH 짜리 비드를 통해 분리하였으며,
커패시터로 1uF 과 C12(104) 로 필터링함을 알 수 있다.
즉, 완전 분리된 전원을 쓰고 있지는 않지만 최대한 걸러서 공급함을 알 수 있다.
VSSA는 그냥 접지 시켰다.
C12를 보면 104라고 되어 있는데, 이것을 읽는 방법은
오른쪽 두 자리가 10이고 마지막 한자리는 4 단위는 pF 이다.
10 x 10^4 pF 이 되는데, uF 단위로 쓰면 (피코->나노->마이크로) 10 x 10^-2 uF 즉 0.1uF 이 된다. 엥?!!!
자료에는 0.01uF 이라고 했는데, 필터 상수가 조금 다르겠네... 패스.
완전히 분리된 아날로그 전원이 아니고, 쇼트키 다이오드는 보이지 않음.
전원 감시기
전원 투입 리셋이나 전원전압 인터럽트 등을 검출하기 위한 전원 감시기 (power supply supervisor)를 가지고 있다.
전원 감시기의 전원 투입/전원 제거 리셋 회로에서는 전원이 투입되거나 제거될 때 전원전압을 감시하여 각각 지정된 값 이하일 경우에는 리셋 신호를 발생한다. 리셋 지연시간은 2.5ms 이다.
전원 감시기는 VDD 와 VDDA를 모두 관찰하는데, 항상 VDDA가 먼저 투입되어 VDD보다 전압이 높거나 같아야 한다. 그러나, 전원전압 VDDA의 감시기능을 해제하면 MCU 소자의 소비전력을 감소시킬 수 있다.
또한 전원감시기에는 현재의 전원 전압을 검출하기 위한 PVD (Programmable Voltage Detector) 기능을 가지고 있다. PWR_CR 레지스터에서 PVDE 비트를 1로 설정하면 PVD 기능을 사용할 수 있으며, PLS[2:0] 비트를 사용하여 임계치 레벨을 8단계로 설정할 수 있다.
저전력 모드
전원이 투입되고 전원 투입 리셋이 종료되면 정상 모드 (Run mode) 로 동작하여 HCLK을 공급받으면서 명령을 실행한다. 정상 모드에서는 시스템 클록 SYSCLK, HCLK, PCLK 등의 주파수를 낮추어 공급하거나, RCC_AHBENR, RCC_APB1ENR, RCC_APB2ENR 등의 레지스터를 사용하여 사용하지 않는 주변장치의 클록을 차단하면 소비전력을 낮출 수 있다.
소비전력에 관하여 세 가지 저전력 모드를 가지고 있다.
슬립모드 (코어만 정지시킴, 인터럽트 발생하면 살아남)
슬립 모드(Sleep mode)는 Cortex-M0 코어를 정지시켜 프로그램의 실행을 중단하고 NVIC, SysTick을 비롯한 기본 시스템 주변장치를 포함하는 모든 주변장치는 정상적으로 동작시킴으로써 소비전력을 절약하는 모드이다.
슬립모드에 진입하기 위해서는 WFI(Wait for Interrupt) 또는 WFE(Wait For Event) 명령을 실행하면 되는데, 시스템 제어 블록의 SBC_SCR(System Control Register) 레지스터에서 SLEEPONEXIT 비트를 0으로 설정하여 두면 CPU는 WFI 또는 WFE 명령을 실행하자마자 곧바로 슬립 모드로 들어가고, SLEEPONEXIT 비트를 1로 설정하였을 경우에는 CPU는 WFI 명령을 실행한 이후에 가장 우선순위가 낮은 인터럽트의 서비스 루틴이 종료될 때 슬립 모드로 진입한다.
WFI 명령으로 슬립 모드에 들어갔을 경우에는 주변장치에서 인터럽트가 발생하고 이것이 허용상태이면 슬립 모드가 해제(wakeup) 된다. 마찬가지로 WFE 명령으로 슬립 모드에 들어갔을 경우에는 어떤 이벤트가 발생하면 슬립 모드가 해제된다.
정지모드 (코어 + 주변장치 중지, 와치독 등으로 이벤트가 발생하면 살아나는 모드)
정지모드(Stop mode)는 소자 내부의 모든 클록이 정지되어 프로그램의 실행을 중단하고 주변장치의 동작도 정지시킴으로써 소비전력을 절약하는 모드이다. 이때는 1.8V 영역이나 클록도 차단하고 PLL, HSI, HSE 오실레이터의 동작도 금지되며, 내부 SRAM이나 레지스터의 값은 유지된다. 만약 PWR_CR 레지스터에서 LPDS 비트를 1로 설정하면 정지모드에서 전약 레귤레이터가 저전력 모드로 들어간다.
정지모드에 진입하기 위해서는 SCB_SCR 레지스터에서 SLEEPDEEP 비트를 1로 설정하고 PWR_CR 레지스터에서 PDDS 비트를 0으로 설정한 상태에서 WFI 또는 WFE 명령을 실행하면 된다. 정지모드에서는 IWDG, RTC, LSI RC 오실레이터, LSE 오실레이터 등을 사용할 수 있다.
WFI 명령으로 정지 모드에 들어갔을 경우에는 주변장치에서 인터럽트가 발생하고 이것이 허용된 상태이면 정지 모드가 해제된다. 마찬가지로 WFE 명령으로 정지모드에 들어갔을 경우에는 어떤 이벤트가 발생하면 정지 모드가 해제된다. 정지 모드에서 해제될 때는 무조건 시스템 클록을 HSI로 사용한다.
대기모드
대기모드(Standby mode)는 1.8V 영역의 전원을 차단하여 동작을 멈추게 함으로써 소비전력을 최대로 절약하는 모드이다. 이때는 PLL, HSI, HSE 오실레이터의 동작도 금지되며, 백업 영역을 제외한 내부 SRAM이나 레지스터의 값은 소실된다.
대기모드에 진입하기 위해서는 SCB_SCR 레지스터의 SLEEPDEEP 비트를 1로 설정하고 PWR_CR 레지스터에서 PDDS 비트를 1로 설정한 상태에서 WFI 또는 WFE 명령을 실행하면 된다. 대기 모드에서는 IWDG, RTC, LSI RC 오실레이터, LSE 오실레이터 등을 사용할 수 있다.
대기 모드는 외부 리셋 단자 NRST 리셋, IWDG 리셋, WKUPx 단자의 상승에지 신호, RTC 알람의 상승에지 신호 등에 의해서 해제된다. 대기 모드에서 해제되면 리셋의 경우와 동일한 내용으로 시스템 동작이 시작되지만 PWR_SCR 레지스터의 SBF 비트에 대기 모드에서 부팅하였다는 사실이 표시된다.
정리해보면, 저전력모드에는 "슬립모드", "정지모드", "대기모드" 세 가지가 있고,
전력절감 정도는 슬립모드 > 정지모드 > 대기모드 순서이다.
슬립모드는 그냥 잠을 재우는 것이고
정지모드는 동면에 들어가는 것이고
대기모드는 가사 상태라고 볼 수있다.
저전력 모드에서 깨어나기
RTC는 저전력 모드인 정지모드와 대기모드에서 깨어나도록 하는 auto-wakeup 기능을 가지고 있다. 이를 위해 RTC에서는 일정한 주기로 wake up 신호를 발생하는데, 이렇게 하려면 RTC의 클록 소스로는 LSE, LSI, HSE 중에서 앞의 2가지만을 사용해야 한다. (저전력 모드에서 HSE가 금지되기 때문인것 같다)
또한 RTC의 알람(alarm) 이벤트를 이용하여 정지 모드에서 깨어나도록 (wakeup) 하려면 EXTI 17번 인터럽트를 사용한다.그러나 대기 모드에서는 이 방법을 사용할 수 없다.
전력관리 제어기의 I/O 제어 레지스터
PWR 전력 제어 레지스터 PWR_CR (0x0000 0000)
DBP : Disable Backup Domain Write Protection
0 = 리셋 상태에서 RTC와 백업 레지스터를 액세스하는 것이 금지됨.
1 = 리셋 상태에서 RTC와 백업 레지스터를 액세스하는 것이 허용됨.
PLS[2:0] : PVD(Power Voltage Detector) Level Selection
PVDE : Power Voltage Detector Enable
(SYSCFG_CFGR2 레지스터에서 PVD_LOCK=1로 설정하면 이 설정을 변경할 수 없음.)
CSBF : Clear Standby Flag (이 비트는 항상 0으로 읽혀짐)
0 = 믜미 없음.
1 = SBF Standby flag을 클리어함
CWUF : Clear Wakeup Flag (항상 0으로 읽힘)
0 = 의미없음.
1 = WUF Wakeup flag을 클리어함.
PDDS : Power Down Deep Sleep
0 = CPU가 deepsleep 상태로 들어갈 때 정지 모드로 설정됨.
1 = CPU가 deepsleep 상태로 들어갈 때 대기 모드로 설정됨.
LPDS : Low-Power Deep Sleep
0 = CPU가 정지 모드에 있을 때 전압 레귤레이터가 정상 동작함.
1 = CPU가 정지 모드에 있을 때 전압 레귤레이터가 저전력 모드로 됨.
PWR 전력 제어/상태 레지스터 PWR_CSR (0x0000 0000)
EWUP2 : Enable WKUP2 Pin
0 = PC13/WKUP2 단자를 GPIO 기능을 사용함
1 = PC13/WKUP2 단자를 WKUP2 핀으로 상요함 (상승 에지에서 대기 모드 해제됨)
EWUP1 : Enable WKUP1 Pin
0 = PA0/WKUP1 단자를 GPIO 기능을 사용함
1 = PA0/WKUP1 단자를 WKUP1 핀으로 사용함 (상승 에지에서 대기모드 해제)
VREFINTRDYF : Internal Voltage Reference Ready Flag
0 = 1.2V 출력의 VREFINT 가 OFF 되어 있음.
1 = 1.2V 출력의 VREFINT 가 ready 상태임.
PVDO : PVD Output(PVDE 비트가 1일 때만 유효함)
0 = 임계치보다 낮음.
1 = 임계치보다 높음.
SBF : Standby Flag
0 = CPU가 대기 모드에 있지 않음.
1 = CPU가 대기 모드에 있다가 해제되었음.
WUF : Wakeup Flag
0 = 어떤 웨이크업 이벤트로 발생하지 않았음.
1 = WKUPx 핀이나 RTC 알람, RTC 웨이크업 등에 의해 웨이크업 이벤트가 발생하였음.
|