请教各位,关于主时钟停振/省电模式后寄存器的值问题
大家好,最近做的一个东西,需要用到主时钟停振/省电模式(即PD=1),单片机是32G12K64,在外部电源没有后,进入此模式,由纽扣电池供电,维持RTC跑,没有RTC专门的外置晶振,所以不能用RTC定时唤醒,使用掉电唤醒定时器每隔一段时间唤醒单片机,比较器判断外部电源是否恢复,没有恢复则继续维持在主时钟停振/省电模式,恢复则退出主时钟停振/省电模式,电路图用的是32G手册中17.2:RTC 实战线路图:程序根据例程07-睡眠-唤醒定时器唤醒修改而成。
主要的比较器中断函数如下:
void CMP_Isr() interrupt 21
{ CMPIF = 0; //清中断标志
if(CMPRES) //有外部电源供电
{
Port_Mode(); //退出掉电状态后,正常工作的端口模式设置
}
else //无外部电源供电
{ CMPEN = 0; //关比较器模块
PD_Port_Mode(); //掉电状态后端口模式的设置
SetWakeUpTime(4095); //设置为2秒钟后唤醒
PD=1; //进掉电状态
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
P3M0 = 0x7f; P3M1 = 0xdf; //P3.7置为高阻,P3.5置为推挽,为比较器工作做准备
CMPEN = 1;CMPIF=1; //唤醒后人为触发一次比较器中断
}
}
实际工作时,可以进入掉电状态,纽扣电池维持RTC的电流在2微安左右,来外部电源后也可以退出掉电状态,可以检测到主程序跑,定时中断都恢复正常,但是程序跑的不对,请问,在掉电状态下,edata和xdata寄存器的值还是掉电之前的吗?退出掉电状态,如何延续之前的工作,需要注意些什么,谢谢。
我这里常用的STC8H8K64U,,根据我们的测试,唤醒之后程序从睡觉的地方开始执行,xdata的数值不变。我们一般的应用是使用RTC秒中断1s 唤醒一次,作为系统的时基。任务按照这个时基来执行,执行完成后睡觉。所以睡觉前后的单片机的状态是一致的。内存中的值,和单片机寄存器的值不变。。。
_奶咖君_ 发表于 2026-4-17 15:46
我这里常用的STC8H8K64U,,根据我们的测试,唤醒之后程序从睡觉的地方开始执行,xdata的数值不变。我们一 ...
谢谢元老的回复,这个程序以前没有这个功能,跑的一切正常,加上这个功能以后,外部电源恢复后,检测到主程序在跑,定时中断也都正常,程序就是跑的不对{:shui:}。 哈哈哈 我也犯过一样的错,,睡觉前关了数字输入,然后给忘了,引脚还被用来读取外部电平,怎么都不对。。。已经快怀疑到硬件错误上了。然后后面又顺了一边程序发现了。。{:4_167:} 低功耗应用
关闭外设节约电能
执行唤醒操作后没有取消关闭外设
可以提前预留并标记用于启用外设的程序位置(在唤醒程序后加入) _奶咖君_ 发表于 2026-4-17 17:12
哈哈哈 我也犯过一样的错,,睡觉前关了数字输入,然后给忘了,引脚还被用来读取外部电平,怎么都不对。。 ...
函数Port_Mode是以前程序开始初始化就用的,程序以前也是这样跑的,看手册,进入掉电状态,关闭数字输入,所以也关闭了,退出后,没有多想,再执行Port_Mode,以为就可以恢复之前的状态{:ciya:}。 狂热主宰 发表于 2026-4-17 18:16
低功耗应用
关闭外设节约电能
执行唤醒操作后没有取消关闭外设
是的,端口模式的设定,是许久之前写的,还是我写的,忘记了,这次拿来就用了{:liulei:}。
页:
[1]