最近一直在处理SAM4S的低功耗问题。之前在开发板上测试过,知道了三种模式的用法,但是进入低功耗后唤醒都是用的按键,也就是外部中断来唤醒。而我实际使用的板子上没有按键,只能使用定时中断来进行,在解决了系统时钟重设的问题后,我开始了各种乱七八糟的唤醒尝试。由于backup模式不能保持IO口状态,那就只有两种选择了,sleep和wait模式。
1,首先是sleep模式。
这个比较简单,由于sleep模式时钟都在工作,普通的SysTick定时中断就可以唤醒系统,但是这个唤醒太早了,我需要的是三分钟以上的休眠状态,而SysTick的中断普遍被定义在毫秒级,毕竟这个相当于系统主定时时钟,其余的定时都是在这个时钟的基础上倍乘上去的,当然基准时间越精确越好了。比我我现在是8ms一个中断,也就是8ms就要唤醒一次,这样子看,还不如不进入休眠省事。在没路子之前,我可不想把基准时钟改成1s一次中断,那样时间就有点儿乱套了。
2,然后测试wait模式。
这个是悲剧的源泉。刚开始我想试试能不能进入休眠状态,就没做唤醒设置,结果,系统啪进去了,然后出不来了!甚至用JTAG都找不回来芯片!!!但是芯片确实在工作,因为每次上电,串口都会打印输出”Enter into wait Mode!“这是我设置的提醒,但是一旦进入休眠,芯片就像死掉了一样,即使指示LED也亮着。
前面说没有做唤醒设置也不太准确,因为我的SysTick中断还是开着的,但是因为在wait模式下,主时钟会停止,这个定时也没有什么意义了。然后我想到了RTT中断,因为在wait模式下,RTT计时器依然运行。但是现实又是残酷的,程序一运行,又是进入了休眠状态,RTT中断也没有唤醒。具体原因我也不确定,不知道是时钟没有运行还是中断优先级不够,没能从休眠状态进入中断。
由于串口工具出了问题,准备下午再进行测试。我想了两个方法,一个是在wait模式下打开RTT中断。既然文档上说了RTT计时不会在休眠模式下停止,那就应该能进入中断唤醒系统,这个最大定时可以是1s,大不了每次一唤醒就再次进入中断,同时统计计数,这样就可以大概得到一个长时间的休眠状态了,这是上策。下策是使用sleep模式,然后把SysTick中断时间改为1s或者0.5s,虽然这看起来比较傻,但是没有别的办法了。同样,一唤醒就再次进入休眠,同时计数。