工作中做了本方案,本文描述方案的重点以及遇到的问题:
1.NXP lpc17xx的休眠方式选择。
控制器一共有四种睡眠模式:
- 睡眠模式
- 深度睡眠模式
- 掉电模式
- 深度掉电模式
这个方式的选择最后看了两个指标,一个是休眠电流要低,一个是唤醒速度要快,另外我们要记住程序运行中的变量值,综合这几点我们选择深度睡眠模式。
because:
睡眠模式的睡眠电流过高。
掉电模式控制器的flash关闭了,貌似变量值也保证不了不变。
深度睡眠模式,电流在1ma一下,并且flash没有关掉,变量值也保持不变,多美的。
so 义无反顾
选择了深度睡眠模式。
2.休眠唤醒方式的选择。
这个我们进行了讨论,讨论供选方案:
- 定时器中断唤醒。
- 看门狗唤醒。
- rtc唤醒。
定时器中断风险最小,定时器专心中断就ok了。
看门狗的超时终端其次,他不借助外部晶振,但还要兼任看门狗自己的职责,比定时器终端略逊一筹。
RTC唤醒是三个中最差的一个,他要基于外边的32.768K晶振工作,然后通过报警中断来唤醒MCU.
BUT,我们最后选的是啥呢:答案竟然是RTC,这是为什么呢?????
because:
这些睡眠模式唤醒都不支持定时器终端唤醒,看来我们想多了,人家不支持。
那看门狗为啥不行,因为定时器的报警中断标志只能通过硬件复位来清空,所以只能唤醒一次,循环休眠唤醒就不行了,是在坑爹。。。。。。。
RTC报警中断唤醒是ok的,就能他了。。。。
3.休眠前的保护现场工作。
所谓的保护现场,当然是在休眠前,把后事儿处理好,把相关外设,相关的中断该干死的干死【断电】,该关中断的关中断,别嘚瑟的整个中断过来把设备给整醒了。
4.进入休眠前对任务的操作。【当时问题困扰了我一小天】。
我系统中一共开了7个任务,在休眠模式下,只有一个任务在把控休眠模式的唤醒,唤醒检测工作,这个时候,其他几个任务都是在os_dly_wait,并不占用系统资源。
这里有个重要的问题,就是在进入休眠前,保证其他几个任务把当前循环的事情都忙完,否则休眠中途,其他任务运行会造成意想不到的后果,比如我这次,开始开发的时候没有注意到这一点,设备运行20-40分钟的时间不等就卡死了,就是其他任务还在操作外设,这边都休眠了,他还在那里冷怂胡乱操作,怎么得了,所以后来我加入了退出标志,休眠前判定其他几个任务都退出ok了在进入休眠,然后就嗨嗨皮皮的跑了12个小时【9点多开跑,然后和我的同事看个电影,两个小时后发现还在冷怂跑着,不错,老老实实回去睡觉,第二天造成来看,依旧ok,超过12小时,哈】。
5.休眠唤醒过程。
通过RTC唤醒,这里通过rtc的报警中断操作,5秒唤醒一次,每次把报警的秒数加5,记得%60哦,嘿,这个唤醒其实就是比对,我设置的秒报警,他就比对秒寄存器,秒寄存器的值当然是0-59,因此我们报警秒数,每次重回休眠前(+5)%60.
具体流程代码不写了,下午团建西冲了,so 撤退!