关于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唤醒会失效?
如果有用到IO中断将单片机从掉电模式唤醒的应用,考虑使用专用的IO中断唤醒使能寄存器P51WKUE。 晓飛飛 发表于 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唤醒失败后变量有增加)
miaoyahan 发表于 2024-4-22 17:10
P5INTE|=(1
如果遇到IO中断没有达成预想的功能,除了检查代码逻辑正确性以外,可以尝试使用INT0~INT4这些专用的外部中断代替普通IO中断。 各个唤醒源都独立的。睡眠前,要允许闹钟中断。 梁工 发表于 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依然没有唤醒;
miaoyahan 发表于 2024-4-24 20:02
梁工,您好,附件中的截图是进入休眠前的闹钟设置情况:
1、在19:47:08时,设置了闹钟时间为19:48:00;
PCON=0x02;
_nop_();//至少3个NOP
_nop_();
_nop_(); 梁工 发表于 2024-4-24 23:22
PCON=0x02;
_nop_();//至少3个NOP
_nop_();
PCON = 0x02;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
刚试了下,在下面添加了6个nop,还是只要P51的中断打开,就会出现RTC闹钟偶尔唤不醒的情况。
难道卡死在了P51的中断函数里面了?可是已经做了只要进入中断函数就立刻清中断标志,按说也不应该卡死的 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下降沿中断”。
梁工 发表于 2024-4-25 11:02
专门改了个程序测试你的应用,没有问题的。各个中断都是相互独立的。请直接下载HEX文件测试,主频11.0592M ...
收到,谢谢梁工,这就试下
页:
[1]
2