极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21930|回复: 1

ArduinoUNO (ATmega328p)进入掉电休眠和唤醒

[复制链接]
发表于 2020-2-25 12:16:32 | 显示全部楼层 |阅读模式
据说掉电模式电流只有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){
  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 02:44 , Processed in 0.043787 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表