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开发板,结合低功耗方法于是总结了该文章。

工程代码分享

若结合操作系统实现低功耗,请参考以下博文

未来的安排——尝试一下STM8和SI4432如何!
————————————————
版权声明:本文为CSDN博主「xukai871105」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xukai871105/article/details/12954741

https://blog.csdn.net/xukai871105/article/details/12954741

前后台系统的低功耗编程思想——STM8平台相关推荐

  1. 单片机开发-软件架构与系统设计(工程实现使用的也是轮询系统、前后台系统和多任务系统)

    目录 单片机开发1 轮询系统: 概述 详述 前后台系统 概述 详述 单片机开发1 单片机开发可以分为程序裸跑与多任务. 在单片机的工程使用中,可以分为裸机系统和多任务系统. 裸机系统一般被叫做裸跑,大 ...

  2. [Hadoop入门] - 1 Ubuntu系统 Hadoop介绍 MapReduce编程思想

    Ubuntu系统 (我用到版本号是140.4) ubuntu系统是一个以桌面应用为主的Linux操作系统,Ubuntu基于Debian发行版和GNOME桌面环境.Ubuntu的目标在于为一般用户提供一 ...

  3. Java 第一阶段建立编程思想 【房屋出租系统】

    Java 第一阶段建立编程思想 [房屋出租系统] 1. 项目需求说明 2. 项目界面 1. 主菜单 2. 新增房源 3. 查找房源 4. 删除房源 5. 修改房源 6. 房屋列表 7. 退出系统 3. ...

  4. c语言 开发交易系统,原创轻松编程(MT4平台智能交易系统图文教程)课件.pptx...

    原创轻松编程(MT4平台智能交易系统图文教程)课件 编程入门MT4平台智能交易系统图文教程本PPT采用Office2007编制开始之前请回答我的问题第一个问题 你真的下决心学习编程了吗?第二个问题 你 ...

  5. 个人编程思想理解的片段(主要是面向对象的,参考了许多人的观点,还不成熟,没形成系统,请大家多指点)...

    编程思想的发展     面向过程     面向对象     新的发展对面向对象的补充有 面向方面 面向对象的三种表现效果     封装     继承     多态 面向对象的实质     用类对现实世 ...

  6. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  7. python 清空所有对象_Python编程思想(7):列表的增删改操作

    李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法.读者可以在「极客起源」 公众号中输入 160 ...

  8. 状态机编程思想:删除代码注释(支持C/C++和Java)

    前言 有时为了信息保密或是单纯阅读代码,我们需要删除注释. 之前考虑过正则表达式,但是感觉实现起来相当麻烦.而状态机可以把多种情况归为一类状态再行分解,大大简化问题.本文就是基于状态机实现的. 删除C ...

  9. 嵌入式牛人 | 这些单片机编程思想超硬核

    来源:面包板社区,整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 01 裸编程是什么? 先声明一个概念,裸编程,指的是在裸机上编写程序,裸机,在单片机领域就是指带着硬件的单片机控制系 ...

最新文章

  1. java 格式匹配,java匹配电话格式的正则表达式
  2. php.exe php-cgi.exe php-win.exe的区别
  3. 资本冬天已至,开发者却可以着眼未来
  4. Flutter搜索框SearchBar
  5. python数据类型—字符串
  6. C# 给窗体添加皮肤 - SkinEngine的应用
  7. [IOS]NSUserDefaults读取和写入
  8. ofd阅读器qt_OFD编辑器实例
  9. 数据结构——计算节点个数和二叉树高度(C语言版)
  10. [Golang软件推荐] RSA公私钥加解密(解决Golang私钥加密公钥解密问题)
  11. 统计学的Python实现-014:几何平均数
  12. dumprep 0 -k引起的重启问题
  13. cf为什么一直连接服务器失败,为什么cf连接服务器失败的解决方法
  14. 趋势性、季节性、周期性
  15. 【新闻】李晓翾先生荣获北美产险精算学会2022年度卓越成就奖
  16. 为何概述(翻译)CS229这个系列
  17. 可执行文件结构:PE文件结构讲解
  18. ORA-02019:未找到远程数据库的连接说明(数据库链接创建)
  19. 《超算竞赛导引》笔记
  20. 两年前华为手机型号_两年前

热门文章

  1. Redhat安装nginx
  2. Python图像识别实战(四):搭建卷积神经网络进行图像二分类(附源码和实现效果)
  3. deepdive教程总结
  4. UG塑胶模具设计:曲面手柄造型处理方法讲解
  5. aspose-pdf 去除水印以及处理的页数限制
  6. 接口自动化测试工具:Apifox和Postman 对比
  7. 对于‘’此转储文件的格式无效‘’的一种猜测
  8. 在动作捕捉系统中使用加速度和倾角传感器
  9. python使用日常备忘录
  10. 视频mkv格式怎么转换成mp4,简单实用的步骤