sun65886566 发表于 2023-8-21 14:15:31

定时唤醒和中断唤醒不能共用?

本帖最后由 sun65886566 于 2023-8-22 11:04 编辑

请教各位大佬:我在开启定时唤醒后无法触发外部中断是什么原因?以下是配置和代码。
ISP配置:STC8G1K08A-6PIN,6MHz,上电短复位,禁止低压复位,无看门狗


sbit LED = P3^4;
sbit IN0 = P3^2;
sbit IN1 = P3^3;

void INT0_Isr() interrupt 0
{
    LED = 1;
}
void INT1_Isr() interrupt 2
{
    LED = 1;
}
void main()
{
      //初始化GPIO
      P0M0 = 0xff;      P0M1 = 0x0;                P0 = 0x0;                //推挽拉低
      P1M0 = 0xff;      P1M1 = 0x0;                P1 = 0x0;
      P2M0 = 0xff;      P2M1 = 0x0;                P2 = 0x0;
      P3M0 = 0xff;      P3M1 = 0x0;                P3 = 0x0;
      P4M0 = 0xff;      P4M1 = 0x0;                P4 = 0x0;
      P5M0 = 0xff;      P5M1 = 0x0;                P5 = 0x0;
      P3M0 &= 0xef;      P3M1 &= 0xef;                                                      //P3.4 LED 双向IO
      P3M0 &= 0xfb;      P3M1 |= 0x04;                                                      //P3.2 INT0 双向IO
      P3M0 &= 0xf7;      P3M1 &= 0xf7;                                                      //P3.3 INT1 双向IO
      LED = 0;
      //中断设置
      IT0 = 0;            //INT0上升沿中断
      EX0 = 1;
      IT1 = 1;            //使能INT1下降沿中断
      EX1 = 1;
      //关闭比较器\ADC\LVD
      CMPCR1 = 0x0;
      ADC_CONTR = 0x0;
      RSTCFG = 0x0;
      //时钟、电源设置
      P_SW2 = 0x80;
      IRC32KCR = 0x80;            //启动内部32K IRC
      while(!(IRC32KCR&1));      //等待时钟稳定
      CLKDIV = 0x00;      //时钟不分频
      CLKSEL = 0x03;                              //内部IRC 32KHz
      HIRCCR = 0;
      XOSCCR = 0;
      P_SW2 = 0x0;
      //定时唤醒约10s,内部32KHz
      WKTCH = 0x58;
      WKTCH |= 0x80;      //使能唤醒定时器,※※该语句执行后外部中断无效,注释后外部中断正常??
      WKTCL = 0xed;
      EA = 1;
      for(;;)
      {
                PCON |= 0x02;
                _nop_();      _nop_();      _nop_();      _nop_();
                _nop_();      _nop_();      _nop_();      _nop_();
      }
}





国学芯用 发表于 2023-8-21 16:03:02


深圳国芯人工智能有限公司-实验箱https://www.stcai.com/syx





乘风飞扬 发表于 2023-8-21 16:31:05

两者是可以共存的,休眠指令后面加7,8个:_nop_();
这是不能省的。
外部中断如果设置为下降沿中断的话,在休眠前要确保外部中断脚是高电平。这种情况下进休眠后拉低外部中断脚才能唤醒MCU。

sun65886566 发表于 2023-8-22 10:16:33

国学芯用 发表于 2023-8-21 16:03
深圳国芯人工智能有限公司-实验箱https://www.stcai.com/syx

谢谢,例程7和8我都试过可以单独运行,但两个同时使用就不行了。我不知道是我漏掉了什么

sun65886566 发表于 2023-8-22 10:21:23

本帖最后由 sun65886566 于 2023-8-22 11:31 编辑

乘风飞扬 发表于 2023-8-21 16:31
两者是可以共存的,休眠指令后面加7,8个:_nop_();
这是不能省的。
外部中断如果设置为下降沿中断的话,在 ...
我发现问题出在时钟上,我为了降低功耗使用了32K时钟,导致了两种唤醒方式的冲突,但是我还是不太理解为什么会这样

乘风飞扬 发表于 2023-8-22 11:57:46

sun65886566 发表于 2023-8-22 10:21
我发现问题出在时钟上,我为了降低功耗使用了32K时钟,导致了两种唤醒方式的冲突,但是我还是不太理解为什 ...

烧录附件例子到你的板子上试试。
例程是低电平亮灯,亮灯表示MCU处于唤醒状态,灭灯表示MCU处于休眠状态。

页: [1]
查看完整版本: 定时唤醒和中断唤醒不能共用?