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 main(void)
{
/* Clock configuration —————————————–*/
CLK_Config();
/* GPIO configuration —————————————–*/
GPIO_Config();
/* TIM4 configuration —————————————–*/
TIM4_Config();
while (1)
{
// 进入等候形式,CPU中止作业,一切中止翻开
Enter_WaitMode();
// LED闪耀使命
LED_Process();
}
}
void Enter_WaitMode(void)
{
WaitFlag = 0;
// 1ms之后CPU被TIM4中止唤醒,WaitFlag在中止中被置位
while( WaitFlag == 0)
{
__wait_for_interrupt();
}
}
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
WaitFlag = 1;
/* Cleat Interrupt Pending bit */
TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
}
以上代码中呈现了WaitFlag标志位,该标志位呈现在Enter_WaitMode函数和TIM4_UPD_OVF_IRQHandler中止中,该标志位的作用是确保唤醒CPU持续作业的一定是守时器4溢出中止,其他中止例如UART接纳中止则不能使CPU从头运转。STM8的等候形式和守时器4溢出中止组成了低功耗节拍”使命“。
3.消除堵塞
从上文的剖析能够看出,在整个的运转周期中总是期望低功耗使命所占的比严重(从时刻视点切入),其他使命所占的比重小。那么其他使命应该尽量削减对CPU的占用,例如完成LED距离闪耀便可运用以下代码:
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);
}
}
因为LED_Process在低功耗使命之后运转,而低功耗使命所占用CPU的时刻为固守时刻——守时器4溢出周期,也就意味着LED使命的调用周期为1ms,使用该特性能够结合一个计数变量LEDCounter完成LED闪耀功用,当然更杂乱的时序能够经过有限状态机完成。
4.总结
节拍运转和消除堵塞算是低功耗MCU编程的基本思想,了解了低功耗MCU编程的基本思路那么不是低功耗的MCU也能够用来开宣布低功耗使用。前段时刻上TB检查MCU的价格,STM8的价格真的把我吓了一跳,自己也置办了STM8开发板,结合低功耗办法所以总结了该文章。