miaoyahan 发表于 2024-4-22 16:09:12

关于STC8H休眠后,RTC闹钟唤醒因外部中断而失败的问题 | 已解决

单片机型号: STC8H4K64TL

固件版本号: 7.4.3U

硬件电路:触摸按键 + 外部32.768晶振驱动RTC + 低功耗深度休眠+ IO口P51中断;


休眠进入条件:按键连续30秒空闲;

休眠唤醒条件:触摸按键唤醒、RTC闹钟唤醒、P51中断唤醒;






休眠前的动作:
1、设置IO状态使其保持最小电流;
2、设置闹钟唤醒时间;
3、检查P51中断标志是否为0;
4、打开P51中断:P5INTE|=(1<<1);

5、_nop_();_nop_();_nop_();_nop_();_nop_();PCON=0x02;
6、退出低功耗;

奇怪的是在4、5中间,如果PCON=0x02前P51发生了中断,此时RTC的中断唤醒就是失效了,只有P51中断和触摸按键可以唤醒,是配置流程那里不对,还是说芯片本上就是这么设计的?即休眠前发生IO中断和RTC闹钟中断时,RTC唤醒会失效?



晓飛飛 发表于 2024-4-22 16:40:37

如果有用到IO中断将单片机从掉电模式唤醒的应用,考虑使用专用的IO中断唤醒使能寄存器P51WKUE。

miaoyahan 发表于 2024-4-22 17:10:07

晓飛飛 发表于 2024-4-22 16:40
如果有用到IO中断将单片机从掉电模式唤醒的应用,考虑使用专用的IO中断唤醒使能寄存器P51WKUE。 ...

P5INTE|=(1<<1);
P5WKUE|=(1<<1);
_nop_();
_nop_();
_nop_();
_nop_();
PCON = 0x02;

把代码修改成上面的内容,预想的流程是:

1、只要打开了P51WKUE中断唤醒,哪怕是真的休眠前触发了IO中断,

2、那么也会被立刻唤醒,然后再次进入休眠流程,

3、而实际是只要休眠前有IO中断那么RTC闹钟唤醒就会失效。

4、(在P5INT_VECTOR中断函数中添加一个自增变量,进入休眠前清零,退出休眠打印,实测当RTC唤醒失败后变量有增加)

晓飛飛 发表于 2024-4-22 20:06:52

miaoyahan 发表于 2024-4-22 17:10
P5INTE|=(1

如果遇到IO中断没有达成预想的功能,除了检查代码逻辑正确性以外,可以尝试使用INT0~INT4这些专用的外部中断代替普通IO中断。

梁工 发表于 2024-4-24 10:37:39

各个唤醒源都独立的。睡眠前,要允许闹钟中断。

miaoyahan 发表于 2024-4-24 20:02:28

梁工 发表于 2024-4-24 10:37
各个唤醒源都独立的。睡眠前,要允许闹钟中断。

梁工,您好,附件中的截图是进入休眠前的闹钟设置情况:

1、在19:47:08时,设置了闹钟时间为19:48:00;

2、在进入休眠前,再次打印了RTCIE、ALAHOUR、ALAMIN、ALASEC寄存器,内容分别是
      RTCIE = 0xc0(闹钟中断 + 天中断)
      ALAHOUR = 0x13(19时)
      ALAMIN = 0x30(48分)
      ALASEC = 0x00(00秒)
      (PS:通过打印信息,确认闹钟设置正确)

3、在19:48:00时,闹钟没有唤醒,持续等待到19:48:50依然没有唤醒;

梁工 发表于 2024-4-24 23:22:00

miaoyahan 发表于 2024-4-24 20:02
梁工,您好,附件中的截图是进入休眠前的闹钟设置情况:

1、在19:47:08时,设置了闹钟时间为19:48:00;


PCON=0x02;
_nop_();//至少3个NOP
_nop_();
_nop_();

miaoyahan 发表于 2024-4-24 23:55:02

梁工 发表于 2024-4-24 23:22
PCON=0x02;
_nop_();//至少3个NOP
_nop_();


PCON = 0x02;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

刚试了下,在下面添加了6个nop,还是只要P51的中断打开,就会出现RTC闹钟偶尔唤不醒的情况。

难道卡死在了P51的中断函数里面了?可是已经做了只要进入中断函数就立刻清中断标志,按说也不应该卡死的

梁工 发表于 2024-4-25 11:02:45

miaoyahan 发表于 2024-4-24 23:55
PCON = 0x02;
_nop_();
_nop_();

专门改了个程序测试你的应用,没有问题的。各个中断都是相互独立的。请直接下载HEX文件测试,主频11.0592MHz,串口115200,8,n,1。

程序上电默认时间11:59:55",闹铃12:00:30"。
上电后串口提示“STC8H RTC Test Prgramme!”,然后睡眠。
5秒后分唤醒,串口返回“24-04-25 12:00:00”。
再30秒后闹铃唤醒,串口返回:“滴滴滴! 闹铃!24-04-25 12:00:30”。
MCU睡眠时,随时可以按下P5.1唤醒,串口返回:“P5.1下降沿中断”。







miaoyahan 发表于 2024-4-25 12:24:03

梁工 发表于 2024-4-25 11:02
专门改了个程序测试你的应用,没有问题的。各个中断都是相互独立的。请直接下载HEX文件测试,主频11.0592M ...

收到,谢谢梁工,这就试下
页: [1] 2
查看完整版本: 关于STC8H休眠后,RTC闹钟唤醒因外部中断而失败的问题 | 已解决