关于低功耗的一些开发流程与经验

来源:互联网 发布:代理设计模式 java 编辑:程序博客网 时间:2024/05/21 17:49

写这篇目的是自己这几天着手做省电模式的支持,需要将功耗降低到1mA一下来达到节能的目的。下面是对睡眠模式的一些经验与注意要点,简单的流程。供大家参考。

首先使用是ST公司的M4架构的芯片,stm32f4XX 。

首先明确自己的任务
1.需要在USB可以使用的情况下,打到休眠的目的。(功耗尽可能低)
2.需要在串口可以使用的情况下,达到休眠的目的(功耗在1mA以下)

在M4中,提供三种模式,sleep stop standby模式。具体区别在相应文档中有详细说明。

stop模式,也就是深度休眠,需要将功耗降低到1mA以下。通过按键和串口可以将设备唤醒,并继续工作。

进入休眠的前期操作
进入休眠模式前,需要配置好唤醒中断

库中有提供相应的进入stop模式的函数void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry),调用这个函数就可以进入到stop模式了。
在调试的过程中发现这个时候的电流并没有打到文档中说的0.6mA而是在2mA多,大大超出了我的规格。我想很多第一次着手省电的都有类似于此的经历

问题在于
1.在进入到stop模式或者其它的省电模式的时候需要手动关闭自己外设的时钟,有的cpu在汇编中会做好,但是更多的cpu没有做这一步所以这些动作都要我们来完成

2.原理图仔细分析判断,哪些元件会损耗电流(尤其关注电阻,还有芯片),如果相应芯片在stop模式中不需要工作,那么在设计上可以考虑用多余的管脚来控制这个芯片的VCC来达到stop模式下不工作

3.未使用的管脚按理来说,应该要配置成浮空输入,这样就不会产生压降差,也就不会有电流的损耗(有的cpu管脚默认就是浮空输入的状态)。这点尤其注意。我用的这款stm32f4XXcpu不知道为什么是需要配置成下拉输入才会不消耗电流。(没有去细究,已经牵扯到了架构了)
通过以上3步基本上可以完成stop模式的功耗要求了。

第二个,在sleep模式下需要打到省电的目的,但是这个时候USB要保持在工作状态。
如果同样使用stop模式的话会关闭所有的外设电源,这个时候唤醒了设备然后进行USB通信,由于USB通信是需要相对较长的交互过程,如果使用stop模式的话在唤醒的这几毫秒内USB与上位机还没有交互完成,会导致通讯数据丢失。
1.st库中没有给出相应进入sleep模式的函数,但是通过调用__WFI()就能进入到sleep模式,这时尤其需要注意对MPU中的(vu32 *)((u32)0xE000ED10) &= ~((u32)0x00000004);这个位的清除,否则进入的是stop模式。
2.在保持USB模式可用的状态下,我尝试进入sleep模式。但是呈现出来的现象是没有进入休眠,长时间的排查(困扰了我1天!)发现是USB通讯造成的。USB虚拟串口通讯是不断进行中断交互,所以导致进入到sleep模式,立马usb中断又产生,然后跳出sleep模式。
第二点的问题一直没有解决。不知道有没有大神可以私信告知,不胜感谢。
最终采用折中的方式。如果碰到相同问题的朋友,也与我一样苦于无法解决不妨往下看。

如果在这个时候需要USB可以使用,也就是说会接到类似于pc的机子上。那么这个时候是有接在电源上,所以这个时候对于功耗要求不太高
所以我们可以模拟stop模式下的操作:
关闭所有可以关闭而又不需要使用的电源时钟。
然后采用wile()循环来监控是否有唤醒事件。如果有就跳出。
采用这个方式最终也将sleep功耗降低了15mA左右。

退出休眠模式操作
退出休眠模式后的第一件事情是将之前配置的管脚全部还原成工作状态,开启被关掉的时钟等等。

以上是关于低功耗模式的一些流程与经验,希望可以帮到你们,说的不好的欢迎指出,有什么见解也可以私我讨论。

0 0