找回密码
 立即注册
查看: 70|回复: 7

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

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

积分
1541
发表于 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寄存器的值还是掉电之前的吗?退出掉电状态,如何延续之前的工作,需要注意些什么,谢谢。

无标题.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:667
  • 最近打卡:2026-04-30 09:07:31

33

主题

2963

回帖

6704

积分

论坛元老

积分
6704
发表于 2026-4-17 15:46:00 | 显示全部楼层
我这里常用的STC8H8K64U,,根据我们的测试,唤醒之后程序从睡觉的地方开始执行,xdata的数值不变。我们一般的应用是使用RTC秒中断1s 唤醒一次,作为系统的时基。任务按照这个时基来执行,执行完成后睡觉。所以睡觉前后的单片机的状态是一致的。内存中的值,和单片机寄存器的值不变。。。

点评

不好意思,犯了了一个低级错误,端口的工作模式中,数字输入默认是开的,之前的程序没有配置,在掉电后,端口模式中,关了数字输入,外部电源来后,再次执行端口模式的配置时,应加上打开数字输入。   发表于 2026-4-17 16:54
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

积分
1541
发表于 2026-4-17 15:53:54 | 显示全部楼层
_奶*** 发表于 2026-4-17 15:46
我这里常用的STC8H8K64U,,根据我们的测试,唤醒之后程序从睡觉的地方开始执行,xdata的数值不变。我们一 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:667
  • 最近打卡:2026-04-30 09:07:31

33

主题

2963

回帖

6704

积分

论坛元老

积分
6704
发表于 2026-4-17 17:12:38 | 显示全部楼层
哈哈哈 我也犯过一样的错,,睡觉前关了数字输入,然后给忘了,引脚还被用来读取外部电平,怎么都不对。。。已经快怀疑到硬件错误上了。然后后面又顺了一边程序发现了。。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:234
  • 最近打卡:2026-04-30 01:26:24
已绑定手机

22

主题

401

回帖

1816

积分

金牌会员

DIY玩家

积分
1816
发表于 2026-4-17 18:16:59 | 显示全部楼层
低功耗应用
关闭外设节约电能
执行唤醒操作后没有取消关闭外设
可以提前预留并标记用于启用外设的程序位置(在唤醒程序后加入)
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

积分
1541
发表于 2026-4-18 08:17:47 | 显示全部楼层
_奶*** 发表于 2026-4-17 17:12
哈哈哈 我也犯过一样的错,,睡觉前关了数字输入,然后给忘了,引脚还被用来读取外部电平,怎么都不对。。 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

积分
1541
发表于 2026-4-18 08:22:23 | 显示全部楼层
狂热*** 发表于 2026-4-17 18:16
低功耗应用
关闭外设节约电能
执行唤醒操作后没有取消关闭外设

是的,端口模式的设定,是许久之前写的,还是我写的,忘记了,这次拿来就用了
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 10:30 , Processed in 0.127213 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表