前后台系统的低功耗编程思想——STM8平台
1.前言 工作之后接触了“低功耗”,开始搜索各种各样的低功耗MCU。网络是一个非常自由的地方,你总可以看到各种关于哪个MCU功耗更低的论战,在这些论战中我查阅了几乎所有低功耗MCU的特性,例如MSP430、EFM32还有STM32L等,网络论战的核心便是哪款MCU的休眠电流更低。看多了资料我便发现,这些低功耗的MCU如何使用,低功耗MCU的程序编写和普通MCU编程有什么区别。
带着这些疑问我继续品味关于低功耗MCU的”论战“,直到我购买了《MSP430系列单片机系统工程设计与实践》。在该书中提到了低功耗MCU编程的基本思想,大致可以总结为:
1.善用节拍
2.消除阻塞 下面就结合STM8谈谈如何实践以上两点。(虽然STM8并不是严格意义上的低功耗MCU,但是只要有低功耗指令的MCU都可以使用以上两点,发挥它的低功耗特性)
2.善用节拍 定时休眠是低功耗MCU常用的手段,定时休眠便是让MCU先休眠再工作,在休眠和工作之间不停转换。STM8有多种低功耗方式,例如等待模式便是其中的一种,等待模式时仅MCU停止工作,其他外设可正常工作。使用等待模式可以保证定时器或UART等可以正常的进入中断。当然也可以使用停止模式进一步降低功耗,在这里则使用等待模式做一个“方法性质”的说明。
图1 前后台系统中的低功耗节拍
可以这样理解,定时进入低功耗模式也可以理解为一个任务,这个“任务”会阻塞CPU使得其他任务无法得到运行,但这并不是真正意义的阻塞CPU,而是使得CPU停止只能通过定时器中断才可以退出该”任务“。实现部分的代码如下:
void LED_Process(void){ static uint16_t LEDCounter = 0; if( LEDCounter++ > 500 ) { LEDCounter = 0; /* Toggles LEDs */ GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS); }}