newlined 发表于 2026-4-17 15:25:46

请教各位,关于主时钟停振/省电模式后寄存器的值问题

大家好,最近做的一个东西,需要用到主时钟停振/省电模式(即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寄存器的值还是掉电之前的吗?退出掉电状态,如何延续之前的工作,需要注意些什么,谢谢。

_奶咖君_ 发表于 2026-4-17 15:46:00

我这里常用的STC8H8K64U,,根据我们的测试,唤醒之后程序从睡觉的地方开始执行,xdata的数值不变。我们一般的应用是使用RTC秒中断1s 唤醒一次,作为系统的时基。任务按照这个时基来执行,执行完成后睡觉。所以睡觉前后的单片机的状态是一致的。内存中的值,和单片机寄存器的值不变。。。

newlined 发表于 2026-4-17 15:53:54

_奶咖君_ 发表于 2026-4-17 15:46
我这里常用的STC8H8K64U,,根据我们的测试,唤醒之后程序从睡觉的地方开始执行,xdata的数值不变。我们一 ...

谢谢元老的回复,这个程序以前没有这个功能,跑的一切正常,加上这个功能以后,外部电源恢复后,检测到主程序在跑,定时中断也都正常,程序就是跑的不对{:shui:}。

_奶咖君_ 发表于 2026-4-17 17:12:38

哈哈哈 我也犯过一样的错,,睡觉前关了数字输入,然后给忘了,引脚还被用来读取外部电平,怎么都不对。。。已经快怀疑到硬件错误上了。然后后面又顺了一边程序发现了。。{:4_167:}

狂热主宰 发表于 2026-4-17 18:16:59

低功耗应用
关闭外设节约电能
执行唤醒操作后没有取消关闭外设
可以提前预留并标记用于启用外设的程序位置(在唤醒程序后加入)

newlined 发表于 2026-4-18 08:17:47

_奶咖君_ 发表于 2026-4-17 17:12
哈哈哈 我也犯过一样的错,,睡觉前关了数字输入,然后给忘了,引脚还被用来读取外部电平,怎么都不对。。 ...

函数Port_Mode是以前程序开始初始化就用的,程序以前也是这样跑的,看手册,进入掉电状态,关闭数字输入,所以也关闭了,退出后,没有多想,再执行Port_Mode,以为就可以恢复之前的状态{:ciya:}。               

newlined 发表于 2026-4-18 08:22:23

狂热主宰 发表于 2026-4-17 18:16
低功耗应用
关闭外设节约电能
执行唤醒操作后没有取消关闭外设


是的,端口模式的设定,是许久之前写的,还是我写的,忘记了,这次拿来就用了{:liulei:}。
页: [1]
查看完整版本: 请教各位,关于主时钟停振/省电模式后寄存器的值问题