Sleep Modes
Application을 사용하지 않을 때는 그냥 꺼 버리면 되는 거 아닌가!?
Master 모듈이 따로 있거나, 스위치를 내렸다 올리는 그런 걸... End-user보고... 하라고?
Sleep Mode는 Application을 Enable 상태로 유지하면서 MCU의 사용하지 않는 모듈들을 꺼 버릴 수 있다.
전력을 아끼기 위해!
장치에 여러 Clock Source가 공존하므로, 필요에 따라 다른 Sleep Mode를 선택해야 한다.

6 모드가 있는데, 위 표에 표시된 X는 해당 기능이 Enable 상태라는 얘기다.
본인은 처음에 헷갈렸다...ㅎㅎ Disable인 줄 알고...
Active Clock Domain
'해당 Clock Source는 해당 모드에서 살아 있다.'
Oscillators
본 모듈을 작동시키는 Oscillator가 살아 있을 것인지?
Timer용 Oscillator가 살아 있을 것인지?
Wake-up Sources
Wake-up, 즉 Power Save 모드에서 빠져 나오는 조건을 의미한다.
해당하는 곳에 인터럽트를 주어서 Wake-up 시킬 수 있다.
Start-up time으로 4 Clock Cycle만큼의 시간을 먹는다.
Sleep Mode 중에 Reset이 발생하면, MCU는 Wake-up해서 Reset Vector를 돌린다.
Sleep Mode 진입 방법 - MCUCR, MCU Control Register
이 레지스터를 설정함으로써 MCU의 어떤 기능을 켜고, 끄고 등. 제어할 수 있다.
'MCU 제어 레지스터' 정도로 번역하는 것 같다.
Sleep Mode 설명을 보면 000, 001, 010... 이런 비트를 SM2:0에 Set 하라고 되어 있다.
아... 이래서 C 배울 때 비트 연산을 임베디드에서 쓴다고 그랬던 거구나...
한 바이트의 일부를 마스킹해야 해서...??
SE? SM?
SE : Sleep mode Enable
SM : Sleep Mode
Idle - SM2:0 = 000
확실히 죽는 것
CPU
일부 클럭
CPU Clock
FLASH Clock
확실히 해당 모드에서 살아남는 것
SPI
UART
Analog Comparator
ADC
Two-wire Serial Interface
Timer/Counters
Watchdog
Interrupt System
설명
Analog Comparator Interrupt로 깨울 예정이 없는 경우...
ACSR(Analog Comparator control and Status Register)의 ACD 비트를 설정해 Analog Comparator를 꺼 둘 수 있다.
전원 아끼려고!
그닥 많은 장치를 죽이는 것 같지 않지만, 가장 전기 많이 먹는 놈은 CPU니까... 확실히 유효할 것.
ADC Noise Reduction - SM2:0 = 001
설명
확실히 죽는 것
CPU
일부 클럭
I/O Clock
CPU Clock
FLASH Clock
확실히 해당 모드에서 살아 남는 것
ADC
External Interrupts
Two-wire Serial Interface address watch
T/C0
Watchdog
위 장치들을 죽이고 살림으로써 ADC에 들어갈 수 있는 Noise를 줄이는 것이 목적이다.
고해상도 Measurements 위해!
Wake-up하는 경우들
External Reset
Watchdog Reset
Brown-out Reset
아래 Interrupts
ADC Conversion Complete Interrupt
Two-wire Serial Interface Address match Interrupt
TC0 Interrupt
SPM/EEPROM Ready Interrupt
External Level Interrupt
INT7:4 혹은 INT3:0
INT: 외부 인터럽트 핀
Power-Down - SM2:0 = 010
설명
살아 있을 거라고 써진 것 말고는 다 죽임.
External Interrupt
Two-wire Serial Interface Address Watch
Watchdog
이게 Enable 상태라면 말이지...
기본적으로 모든 클럭을 죽이고, Asynchronous 모듈만 살려 둔다.
많은 것들을 죽여 둔 만큼 Wake-up에 시간이 좀 더 걸린다.
CLK 재시작, 안정화...
Wake-up하는 경우들
External Reset
Watchdog Reset
아래 Interrupts
TWI Address Match Interrupt
External Level Interrupt
INT7:4 or INT3:0
Power-Save - SM2:0 = 011
설명
Power-Down이랑 비슷한데, 하나가 다르다.
만약 TC0이 Asyncronous 상태면, TC0은 Sleep 중에도 돌아간다.
= ASY Clock은 살려 준다.
그래서 TC0에서 Timer Overflow나 Output Compare Event가 발생하면...
그리고 TC0 Interrupt, Global Interrupt가 Enable이면 Wake up!
비동기 타이머를 비동기 Clocked 할 거 아니면, Power-down 쓰는 것을 권장.
Wake-up시 비동기 타이머 레지스터의 내용물이 Undefined로 간주되기 때문.
AS0 = 0인 경우에 대해.
Standby - SM2:0 = 110 & Crystal/Resonator Clock Opt Selected
설명
요건 Power Down 모드랑 비슷한데, Oscillator 계속 돌려두는 거.
그래서 다시 깨우는 데 6 Clock이면 됨.
Extended Standby - SM2:0 = 111 & Crystal/Resonator Clock Opt Selected
설명
요건 Power Save 모드랑 비슷한데, Oscillator 계속 돌려두는 거.
요것도 다시 깨우는 데 6 Clock.
정리
Oscillators를 죽이지 않는 모드인 경우
깨우는 데 4-6 Clock 보장됨.
반대로 죽이는 경우,
Clock이 재시작, 안정화된 후 다시 동작을 시작함.
당연하지!
Minimizing Power Consumption
Sleep mode를 최대한 활용하라.
사용하는 기능을 최소화하고, 꼭 들어맞는 Sleep Mode를 써라.
당연한 얘기들이 써 있는 Section.