CH592 的低功耗函数 与 CH585 区别 ...... 矜辰所致
前言
上一篇文章,我们以 CH585 为例说明一下 TMOS 模式下的休眠流程以及 TMOS 下外部中断的使用,本来想着去写一下常见应用,串口收发唤醒啊之类的,但是研究了一下发现 CH592 的休眠函数设计与 CH585 不同,觉得有必要研究一下,因为休眠唤醒的流程的不同可能会关系到应用层的设计。
本文我们就来看看 CH592 上的 TMOS 管理的休眠流程与 CH585 上的区别 。
相关博文:
TMOS 自动管理休眠流程说明及外部中断使用.
我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!
目录
- 前言
- [一、 CH585 休眠流程](#一、 CH585 休眠流程)
- [二、 CH592 休眠流程说明](#二、 CH592 休眠流程说明)
- [三、 对实际应用的影响](#三、 对实际应用的影响)
- 结语
一、 CH585 休眠流程
在上一篇文章 TMOS 自动管理休眠流程说明及外部中断使用 中,我们分析过 CH585 中的 CH58x_LowPower 函数,我们需要知道的几个点有:
- CH585 TMOS 中使用的是 WFE 睡眠,通过事件唤醒;
- 进入睡眠后屏蔽了中断使能,唤醒后是不能立即进入中断函数的,要延时一定时间等到晶振稳定后才恢复中断,才能进入中断函数;
所以在 CH585 上,唤醒后的这个等待事件是应用层需要考虑到的,无法实现唤醒瞬间就执行中断代码。
我们分析过休眠后程序停止的位置在下面这条语句处:
c
LowPower_Sleep_WFE(RB_PWR_RAM32K | RB_PWR_RAM96K | RB_PWR_EXTEND);
我们可以跳转看一看这个函数,可以更加准确的说明程序休眠停下的位置,如下图:

因为 CH585 示例中屏蔽了中断,唤醒以后从 __nop(); 开始顺序执行,要等到打开中断才会进入中断函数。这个在上一篇文章也有验证过程。
大家可自行跳转查看详细说明:TMOS 自动管理休眠流程说明及外部中断使用
二、 CH592 休眠流程说明
对于 CH592 而言,TMOS 自动管理的休眠进入流程逻辑,代码框架和 CH585 是一致的,我们直接去看启动休眠的函数 CH59x_LowPower :

我们继续进入 CH592 这个 LowPower_Sleep 函数里面查看:

我们也可以和测试 CH585 的顺序一样,做个简单的测试验证一下唤醒后是不是先进入中断,再执行 __WFI(); 下面的语句 ,如下图:

通过测试可以很明显的知道,与 CH585 处理方式不同导致的唤醒程序流程不同:
- CH592 TMOS 中使用的是 WFI 睡眠,通过中断唤醒;
- 唤醒后立即进入唤醒的中断函数执行;
三、 对实际应用的影响
经过分析,我们知道了 CH585 上 WFE 休眠 和 CH592 上额 WFI 休眠唤醒后的程序执行顺序有略微的区别。 对于一般应用来说,基本没有影响,使用 GPIO 唤醒的思路依旧和上一篇文章推荐的方法一致, 特别情况如下说明。
比如串口唤醒这种情况,第一个数据来了,唤醒后的的处理要考虑到 CH585 休眠唤醒进入中断函数会有一定的延时。所以想要唤醒后,正常的接收串口数据,需要应用上做一定的处理,比如自己增加一个标志位,在有第一次中断发生后,就不让程序启动休眠流程 。
结语
本文简单复习了一下 CH585 TMOS 下的休眠流程,然后对比了一下 CH592 TMOS 下的休眠流程,本文的分析只是让大家对休眠唤醒的流程有一个清楚的认知,让大家在处理某些特殊情况的时候能够合理的代码设计。
好了,本文就到这里。谢谢大家!