You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AVR64DD32休眠后无法通过PD4按键中断唤醒的问题

AVR64DD32休眠唤醒故障排查与修复

问题描述

尝试让AVR64DD32进入休眠模式,通过PD4按键的下降沿中断唤醒。按下休眠触发按键后,仅打印一次entering sleep,按下PD4按键无法唤醒,始终不输出I'm awake。

使用的代码如下:

volatile uint8_t buttonInterrupt = 0;

void ButtonWakeUpInt(void){
    buttonInterrupt = 1;
}
int main(void)
{
    SYSTEM_Initialize();
    PD4_SetInterruptHandler(ButtonWakeUpInt);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sei();
    while (1){
    if(SleepButton)
    {
        while (1)
        {
             printf("entering sleep\r\n")
             sleep_mode(); 
             ATOMIC_BLOCK(ATOMIC_FORCEON)
             {
                  delay(10);
             }
             if(buttonInterrupt)
             {
                  sleep_disable(); 
                  buttonInterrupt = 0;
                  printf("I'm awake\r\n");
                  break;
             }
          }
   }
}

故障排查与修复要点

  • 修复语法错误
    代码中printf("entering sleep\r\n")缺少分号,会导致编译失败,必须补充:

    printf("entering sleep\r\n");
    
  • 添加休眠使能操作
    AVR单片机进入休眠前必须调用sleep_enable()函数,允许控制器进入休眠状态。原代码仅设置了休眠模式但未使能休眠,这是唤醒失败的核心原因之一。修改如下:

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable(); // 添加这一行
    sei();
    
  • 确认休眠模式的唤醒源支持
    SLEEP_MODE_PWR_DOWN是深度休眠模式,仅部分中断源能唤醒该模式。查阅AVR64DD32数据手册,确认PD4对应的外部中断(如INT4)是否支持唤醒PWR_DOWN模式。若不支持,需更换为SLEEP_MODE_IDLE等浅度休眠模式,或调整按键到支持唤醒深度休眠的引脚。

  • 清除中断硬件标志位
    中断触发后,硬件会设置对应的中断标志位(如EIFR寄存器中的对应位),若未清除该标志位,后续中断可能无法触发。建议在中断服务函数中添加标志位清除操作:

    void ButtonWakeUpInt(void){
        buttonInterrupt = 1;
        // 清除PD4对应的中断标志位,需根据实际寄存器调整
        EIFR |= (1 << INTF4); 
    }
    
  • 优化休眠唤醒后的逻辑

    • ATOMIC_BLOCK内的delay(10)无意义,原子操作块应尽量短小,且休眠后定时器已停止,delay函数无法正常工作,建议移除该段代码。
    • sleep_disable()应放在退出内层循环后,或重新进入休眠前再调用sleep_enable(),避免影响后续休眠操作。
  • 检查SleepButton的采样逻辑
    外层循环中if(SleepButton)的判断若为电平触发,需确保按键释放后不会重复进入内层休眠循环。建议添加按键消抖逻辑,或改为边沿触发检测。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:43:13