ArduinoUNO (ATmega328p)进入掉电休眠和唤醒
据说掉电模式电流只有3uA,没有实测过,请有实测的大佬指点,谢谢!掉电休眠在看门狗定时器溢出发生中断时唤醒MCU,看门狗溢出中断时间是4秒
以下是ArduinoUNO 的代码:
void setup() {
DDRB|=_BV(PB5); // 设置 Pin13 输出模式
PORTB |=_BV(PB5); // 设置 Pin13 高电平
PORTB &= ~_BV(PB5); // 设置 Pin13 低电平
PRR |= 0xff; //开启功耗抑制寄存器
SetWDT(); //看门狗初始化设置
SMCR = _BV(SM1) | _BV(SE); //掉电模式、休眠使能
asm("SLEEP"); //SLEEP 指令后进入休眠模式
}
void loop() {
unsigned long i;
asm("WDR"); //复位看门狗定时器(喂狗)
for(i = 0 ; i <= 2000000; i++) asm("NOP"); //开启功耗抑制,不能用延时函数delay
PORTB |=_BV(PB5); //Pin13 高电平
for(i = 0 ; i <= 2000000; i++) asm("NOP"); //关闭功耗抑制寄存器,可以使用delay
PORTB &= ~_BV(PB5); //Pin13 低电平
}
/* 看门狗寄存器设置, 修改 WDTCSR 寄存器 必须同时置位 WDCE 和 WDE */
void SetWDT(){
SREG &= 127; //禁止所有中断
asm("WDR"); //看门狗复位指令WDR用来复位看门狗定时器
WDTCSR |= (1<<WDCE) | (1<<WDE); //WDCE:修改使能, WDCE置位时WDE必须必须必须同时置位才有效, 4个时钟周期之后WDCE和WDE自动清零, 所以必须在4个时钟周期内修改看门狗设置
WDTCSR= (1<<WDP3) | (1<<WDE) | (1<<WDIE); // 看门狗定时4秒, 启动中断,并且复位MCU
SREG |= 128; //全局中断开启
}
/*看门狗中断函数*/
ISR(WDT_vect){
} 看不懂:(
页:
[1]