找回密码
 立即注册
查看: 68|回复: 3

请教:Ai8051U进入休眠,只用I/O口P36中断和闹钟中断唤醒,不要其它唤醒

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:789
  • 最近打卡:2026-04-02 11:24:28

17

主题

76

回帖

3676

积分

论坛元老

积分
3676
发表于 2026-3-16 00:27:27 | 显示全部楼层 |阅读模式
现在能正常运行,任何中断都可以唤醒休眠断电。怎样设置才能关闭掉那些不需要的唤醒?
这样笨办法不起作用:
    ......

         EX0=0;EX1=0;ET0=0;ET0=0;ES=0;(......挨个关)
            //-----进入休眠--------------------
        S_sleep();
          //----被唤醒(按键或闹钟)
        EX0=1;EX1=1;ET0=1;ET0=0;ES=1; (......挨个开)
  ......
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:653
  • 最近打卡:2026-04-02 10:07:54
已绑定手机

52

主题

2542

回帖

8922

积分

论坛元老

积分
8922
发表于 2026-3-16 11:01:57 | 显示全部楼层
除了掉电唤醒定时器没有中断外,其它唤醒源关闭中断后就没有唤醒功能了。
在每个中断里加个标志,唤醒后查询标志看看是哪个中断唤醒的,判断是不是这个中断漏关了。
像这样
  1. /********************* INT0中断函数 *************************/
  2. void INT0_int (void) interrupt 0      //进中断时已经清除标志
  3. {
  4.     Source = 0;
  5. }
  6. /********************* INT1中断函数 *************************/
  7. void INT1_int (void) interrupt 2      //进中断时已经清除标志
  8. {
  9.     Source = 1;
  10. }
  11. /********************* INT2中断函数 *************************/
  12. void INT2_int (void) interrupt 10     //进中断时已经清除标志
  13. {
  14.     Source = 2;
  15. }
  16. /********************* INT3中断函数 *************************/
  17. void INT3_int (void) interrupt 11     //进中断时已经清除标志
  18. {
  19.     Source = 3;
  20. }
  21. /********************* INT4中断函数 *************************/
  22. void INT4_int (void) interrupt 16     //进中断时已经清除标志
  23. {
  24.     Source = 4;
  25. }
  26.                     PCON |= 0x02;   //Sleep
  27.                     _nop_();
  28.                     _nop_();
  29.                     _nop_();
  30.                     _nop_();
  31.                     _nop_();
  32.                     _nop_();
  33.                     _nop_();
  34.                     switch(Source)
  35.                     {
  36.                         case 0:
  37.                             printf("INT0 Wakeup!\r\n");
  38.                         break;
  39.                         case 1:
  40.                             printf("INT1 Wakeup!\r\n");
  41.                         break;
  42.                         case 2:
  43.                             printf("INT2 Wakeup!\r\n");
  44.                         break;
  45.                         case 3:
  46.                             printf("INT3 Wakeup!\r\n");
  47.                         break;
  48.                         case 4:
  49.                             printf("INT4 Wakeup!\r\n");
  50.                         break;
  51.                         default:
  52.                             printf("Other Wakeup!\r\n");
  53.                         break;
  54.                     }
复制代码
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:789
  • 最近打卡:2026-04-02 11:24:28

17

主题

76

回帖

3676

积分

论坛元老

积分
3676
发表于 2026-3-16 12:21:12 | 显示全部楼层
可能我没有说清楚,不是寻找某一个,是某个已经关闭了的中断却还在唤醒。程序运行,INT0、INT1、ES、ET0......都正常工作。进入休眠后,只允许P36 I/O口中断和闹钟中断唤醒。在休眠前关闭除过这两个以外的其它唤醒中断(源),这两个中断都能唤醒程序继续运行,然后再启用 INT0、INT1、ES......中断继续工作。现在关闭INT0...... ,却仍然能INT0唤醒。应该怎样设置才能不让INT0唤醒?
     请老手熟手们指教。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:651
  • 最近打卡:2026-04-02 13:22:49

33

主题

2927

回帖

6597

积分

论坛元老

积分
6597
发表于 2026-3-16 14:31:55 | 显示全部楼层
关注一下,,感觉关闭中断之后不应该唤醒。。

我们的做法是只判断是否是RTC唤醒或者是IO中断唤醒。。。不关闭其他的中断,如串口中断等等。。总而言之,其他中断唤醒就唤醒了,唤醒了不会运行其他的代码,然后就接着睡觉了。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-3 05:05 , Processed in 0.118439 second(s), 52 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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