STM32低功耗实验总结
1、 首先回答一个问题,STM32能不能做低功耗?
回答是肯定的,这个是有数据支持的,我测试的STM32101CB,FLASH:128K,RAM:16K并且RTC工作的情况下,测试到的功耗为16uA应该说还是相当不错的。
2、 STM32低功耗有哪些需要注意的地方?
一开始我测试到STM32为16uA的时候,还是非常高兴的,以为真的可以做为我的应用,我的应用是让MCU定时醒来干活,干一会就睡觉,可能干活的时间就几十个毫秒。可是后来发现有些问题(工作在STOP模式):
1) 时钟问题:STM32被唤醒以后的时钟自动切换到内部HIS RC振荡器,大家都是知道的,RC振荡器的精度是不高的。而且,睡觉前对于时钟的设置都是恢复到复位状态,只是时钟这个地方复位,其他的没有。这也会带来一个问题,可能你睡觉前使用的是内部时钟,可是睡觉后,时钟却变了,带来的问题就是UART和定时器。或许你想不使用PLL,就是8M,这样醒来后的时钟HIS也是8M,这样虽然在时钟上没有差别了,但是时钟却不稳定了。UART波特率肯定不能太高,否则通信会有问题。
2) 醒来时间:这个问题也是个非常大的问题,datasheet上给出的醒来时间是7us,这个可能真的不假,但是醒来,不能马上干_你的活,为什么。初始化IO,你可能问,我不初始化不行吗,回答应该是否定的。因为,如果你想使用低功耗的话,睡觉前IO口都应该设置为模拟输入,这样才能达到datasheet上的14uA,但是这样也带来一个问题,那就是初始化IO,醒来必须要初始化IO。如果你还想把时钟切换到外部时钟,耗时会更加长,接近200ms,因为STM32会等待外部时钟稳定后才能工作,然后还要在重新初始化所有IO,这个非常的耗时。可能我只需要醒来10ms,但是这些活干完就需要100ms。
3) RTC唤醒:RTC这个也是个问题,为什么?大家需要注意的是RTC只能使用报警才能唤醒MCU,秒中断是不可以唤醒的。并且报警中断必须不停的设置,设置一次只生效一次,中断完了,还需要设置下次中断的时间。并且还有个问题,报警中断必须等待到秒中断到了之后才能设置,也就是正好秒寄存器更新了一次的时候设置,这就带来一个问题,等待秒中断。如果睡前还想再能被报警唤醒的话必须重新设置报警中断,而且设置报警中断的时候需要等到秒中断才能设置新的值。这个等待的时间是不定的。可能会几百个毫秒。说以要空空的耗费几百个毫秒等到秒中断标志来设置报警中断。可能我的MCU只需要执行10ms就需要睡觉了。还是要空空的耗费掉几百个毫秒
1、 首先回答一个问题,STM32能不能做低功耗?
回答是肯定的,这个是有数据支持的,我测试的STM32101CB,FLASH:128K,RAM:16K并且RTC工作的情况下,测试到的功耗为16uA应该说还是相当不错的。
2、 STM32低功耗有哪些需要注意的地方?
一开始我测试到STM32为16uA的时候,还是非常高兴的,以为真的可以做为我的应用,我的应用是让MCU定时醒来干活,干一会就睡觉,可能干活的时间就几十个毫秒。可是后来发现有些问题(工作在STOP模式):
1) 时钟问题:STM32被唤醒以后的时钟自动切换到内部HIS RC振荡器,大家都是知道的,RC振荡器的精度是不高的。而且,睡觉前对于时钟的设置都是恢复到复位状态,只是时钟这个地方复位,其他的没有。这也会带来一个问题,可能你睡觉前使用的是内部时钟,可是睡觉后,时钟却变了,带来的问题就是UART和定时器。或许你想不使用PLL,就是8M,这样醒来后的时钟HIS也是8M,这样虽然在时钟上没有差别了,但是时钟却不稳定了。UART波特率肯定不能太高,否则通信会有问题。
2) 醒来时间:这个问题也是个非常大的问题,datasheet上给出的醒来时间是7us,这个可能真的不假,但是醒来,不能马上干_你的活,为什么。初始化IO,你可能问,我不初始化不行吗,回答应该是否定的。因为,如果你想使用低功耗的话,睡觉前IO口都应该设置为模拟输入,这样才能达到datasheet上的14uA,但是这样也带来一个问题,那就是初始化IO,醒来必须要初始化IO。如果你还想把时钟切换到外部时钟,耗时会更加长,接近200ms,因为STM32会等待外部时钟稳定后才能工作,然后还要在重新初始化所有IO,这个非常的耗时。可能我只需要醒来10ms,但是这些活干完就需要100ms。
3) RTC唤醒:RTC这个也是个问题,为什么?大家需要注意的是RTC只能使用报警才能唤醒MCU,秒中断是不可以唤醒的。并且报警中断必须不停的设置,设置一次只生效一次,中断完了,还需要设置下次中断的时间。并且还有个问题,报警中断必须等待到秒中断到了之后才能设置,也就是正好秒寄存器更新了一次的时候设置,这就带来一个问题,等待秒中断。如果睡前还想再能被报警唤醒的话必须重新设置报警中断,而且设置报警中断的时候需要等到秒中断才能设置新的值。这个等待的时间是不定的。可能会几百个毫秒。说以要空空的耗费几百个毫秒等到秒中断标志来设置报警中断。可能我的MCU只需要执行10ms就需要睡觉了。还是要空空的耗费掉几百个毫秒
总结:在使用的过程中发现的问题,我都在上面说明了,我觉得STM32的低功耗太假,虽然在睡眠的时候性能不错,但是醒来,和进入睡眠的设置太麻烦,耗时太多,这是个弊端,我觉得MSP430估计是做的最好的了,即使是AVR也比他好点,没有那么麻烦。
http://www.ec66.com/article/list.asp?indexid=4622