定时唤醒和中断唤醒不能共用?
本帖最后由 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_();
}
}
深圳国芯人工智能有限公司-实验箱https://www.stcai.com/syx
两者是可以共存的,休眠指令后面加7,8个:_nop_();
这是不能省的。
外部中断如果设置为下降沿中断的话,在休眠前要确保外部中断脚是高电平。这种情况下进休眠后拉低外部中断脚才能唤醒MCU。 国学芯用 发表于 2023-8-21 16:03
深圳国芯人工智能有限公司-实验箱https://www.stcai.com/syx
谢谢,例程7和8我都试过可以单独运行,但两个同时使用就不行了。我不知道是我漏掉了什么 本帖最后由 sun65886566 于 2023-8-22 11:31 编辑
乘风飞扬 发表于 2023-8-21 16:31
两者是可以共存的,休眠指令后面加7,8个:_nop_();
这是不能省的。
外部中断如果设置为下降沿中断的话,在 ...
我发现问题出在时钟上,我为了降低功耗使用了32K时钟,导致了两种唤醒方式的冲突,但是我还是不太理解为什么会这样 sun65886566 发表于 2023-8-22 10:21
我发现问题出在时钟上,我为了降低功耗使用了32K时钟,导致了两种唤醒方式的冲突,但是我还是不太理解为什 ...
烧录附件例子到你的板子上试试。
例程是低电平亮灯,亮灯表示MCU处于唤醒状态,灭灯表示MCU处于休眠状态。
页:
[1]