wjhhhhh 发表于 2026-3-16 00:27:27

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

现在能正常运行,任何中断都可以唤醒休眠断电。怎样设置才能关闭掉那些不需要的唤醒?
这样笨办法不起作用:
    ......

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

乘风飞扬 发表于 2026-3-16 11:01:57

除了掉电唤醒定时器没有中断外,其它唤醒源关闭中断后就没有唤醒功能了。
在每个中断里加个标志,唤醒后查询标志看看是哪个中断唤醒的,判断是不是这个中断漏关了。
像这样
/********************* INT0中断函数 *************************/
void INT0_int (void) interrupt 0      //进中断时已经清除标志
{
    Source = 0;
}

/********************* INT1中断函数 *************************/
void INT1_int (void) interrupt 2      //进中断时已经清除标志
{
    Source = 1;
}

/********************* INT2中断函数 *************************/
void INT2_int (void) interrupt 10   //进中断时已经清除标志
{
    Source = 2;
}

/********************* INT3中断函数 *************************/
void INT3_int (void) interrupt 11   //进中断时已经清除标志
{
    Source = 3;
}

/********************* INT4中断函数 *************************/
void INT4_int (void) interrupt 16   //进中断时已经清除标志
{
    Source = 4;
}

                  PCON |= 0x02;   //Sleep
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();

                  switch(Source)
                  {
                        case 0:
                            printf("INT0 Wakeup!\r\n");
                        break;
                        case 1:
                            printf("INT1 Wakeup!\r\n");
                        break;
                        case 2:
                            printf("INT2 Wakeup!\r\n");
                        break;
                        case 3:
                            printf("INT3 Wakeup!\r\n");
                        break;
                        case 4:
                            printf("INT4 Wakeup!\r\n");
                        break;
                        default:
                            printf("Other Wakeup!\r\n");
                        break;
                  }

wjhhhhh 发表于 2026-3-16 12:21:12

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

_奶咖君_ 发表于 2026-3-16 14:31:55

关注一下,,感觉关闭中断之后不应该唤醒。。

我们的做法是只判断是否是RTC唤醒或者是IO中断唤醒。。。不关闭其他的中断,如串口中断等等。。总而言之,其他中断唤醒就唤醒了,唤醒了不会运行其他的代码,然后就接着睡觉了。

伏尔加加 发表于 2026-7-7 01:58:49

wjhhhhh 发表于 2026-3-16 12:21
可能我没有说清楚,不是寻找某一个,是某个已经关闭了的中断却还在唤醒。程序运行,INT0、INT1、ES、ET0... ...

配置上拉,或关闭ET0都可以阻止INT1唤醒,明确一点,例程里的2个开启INT1唤醒的指令,1个是设置上升沿或下降沿触发,一个是设置唤醒后是否进对应中断(不是是否开启唤醒)。想要它不唤醒,得上拉,不要触发边沿判断的阈值。至于ET0关掉,为何也能让INT1不唤醒,原因未知。另外,T0脚如果不要唤醒,也得关ET0。官方文档有一句:要省电,不用的功能要关闭,IO要设置确定的状态。实际有一个没说的点,相应功能未关(如不关定时器)会触发T0等IO跳变唤醒,INT脚未上拉,会触发外部中断唤醒。对于只想CPU不工作,用不着极致省电的情况下,不关闭相应模块就会引发此类问题。
页: [1]
查看完整版本: 请教:Ai8051U进入休眠,只用I/O口P36中断和闹钟中断唤醒,不要其它唤醒