作者:YJGQDD(阿莫:hailing),整理:晓宇

微信公众号:芯片之家(ID:chiphome-dy)

经过了多年的低功耗硬件设计(公司硬件设计和软件设计是分开的,我一直是做硬件,在面对低功耗生产事故中做硬件的往往很苦逼),其中容易出的一个问题是单片机进睡眠模式前IO没配好,产品上主要出的问题是这些出问题的IO比较隐蔽,当时经过多次测试也没测试出来,后来在生产或现场才发现的概率性功耗偏大的问题。

站在硬件的角度,最近才意识到原来软件上一直容易犯的一个毛病是睡眠前没有把所有IO重新配置一遍,这样容易导致IO低功耗的BUG出现。

这个心得总结起来是:要求在进睡眠模式前把所用的单片机的所有的IO从代码上1个IO接1个IO的配置一遍。不要偷懒,不要多个IO一起配置。

分析

  外设时钟

外设的时钟没关,单片机内部模块没关等,部分单片机进睡眠后自动会关闭,部分不会自动关闭的,没关的话当场测试功耗就偏高,会马上发现的。所以这些在实际生产中都没出过问题。

  IO配置

1个IO接1个IO配置,不要多个IO用类似BIT1|BIT2……,|=0xxx这类一起配置。因为代码上越是直观,出现笔误的概率越低。而且我们核对IO的时候都是一个IO一个IO的去核对配置对不对。所以代码上依次写一下其实花了不了多少时间和代码空间的。花个5到30分钟撑死,但是后续节省的时间和金钱就不好说了。人的总是有惰性的,我自己写代码的时候之前进低功耗前也只是配置了一部分,现在慢慢开始习惯全部配置,很多配置可以复制之前的IO初始化(这个已经养成了1个IO,1个IO的配置,改起来其实很舒服的)。

  案例分析

实际出现的最麻烦,最隐蔽的情况往往跟IO的配置有关,越简单的往往越容易出问题。

1、比如大多数情况下程序从A子程序进入睡眠后IO配置没问题,经过大量测试也没发现问题。但是当某次执行了B后再进睡眠,B中对IO进行了操作,再进睡眠没有把IO改回来,这时问题就可能出现了。而要是执行C,D……等程序再睡眠都不会出IO的隐患。

案例:产品在客户那里发现有50%左右放了一段时间后电池耗光。研发百思不得其姐,多次查看代码没发现问题,之前也没出现死机的问题(死机后会导致不能进低功耗,功耗超高)。派人去现场测试,进过大量测试后发现一个IO部分产品输出高。导致电流多了1mA左右。原因是客户上电做了秒脉冲输出,下电后产品就用电池供电了。户下电前没有配置关闭秒脉冲输出,程序下电后也没有把IO配置回来,导致有50%的概率IO输出高电平。

2、一个产品已经生产了几万台,一直没发现问题。后来换了一家PCB厂家后,生产发现功耗个别产品偏高个10uA左右,研发拿回来分析,发现换了芯片就好了。但是生产出现百分之几的功耗不好的情况,芯片不可能出现这么大概率的损坏。430芯片,走正规供应商的。再一个IO一个IO的查找,通过手摸IO最终发现一个连光耦输入端的IO配置的是输入模式。换了芯片好了是因为焊接过,板子变脏,电阻变小,IO有一个比较固定的偏向与GND的电压,因而没问题。之前没问题可能是板子的阻值比现在的这家小了点,或当时生产的时候湿度大点,或光耦的反向漏电流大些,也是各种可能了。软件发现这个IO本来是配置没问题的,中间不知道哪里配置过或配置别的IO时不小心连这个IO也配置了。总之当时没搜到这个IO的配置哪里改动了,只是在进低功耗前重新配置了下这个IO。

3、产品上使用的一个外购低功耗RF模块的IO问题。使用CC1101和430F2132。都算低功耗的芯片吧。前后找了2家开发模块,第一家2132一个IO没配置好,生产阶段发现部分产品功耗偏高。后来是因为领导的原因换了家做无线的厂家来做这个,还是CC1101+2132方案。照理来说之前犯过错误应该吸取经验教训了吧。并且软件人员也是老手了。结果生产是没问题,发货到客户那里还是发现了个别产品出问题,最后还是发现一个IO没配置好状态。

4、以上心得很简单,但是是付出多次时间+金钱得出的惨痛心得。而且这些都是软件的问题,但是功耗问题往往第一个找个是硬件:你设计的产品功耗偏高,电池没电,你查查看,哪里出问题了。做硬件的又开不到代码,软件人员往往开始还不承认IO配置上有问题,尤其是之前找外面厂家开发的模块,他们的意思是,我做软件xx年了。开发了这么多产品,这么简单的一个产品怎么会出问题,是你们自己的产品没做好才出的问题。苦逼的硬件工程师没办法,只能自己想各种办法找到出问题的那个IO。软件人员经过改代码对比测试才完成,但是软件最后还是不会说自己的代码有问题。

5、关于IO的问题。430单片机IO设置是最弱的,大部分没有上下拉电阻,默认是输入状态,没配置IO就容易出功耗问题,ST的相对好的多,51的IO默认的51状态有上拉电阻,没用到的脚不去配置也不会出问题。空的IO我之前喜欢配置成输出0状态,最近在用STM8S看了下代码发现喜欢配置成上拉输入状态,STM8S没下拉电阻,STM32有,配置成下拉输入状态更好些,不小心碰到不会对外输出电流。

题外话:关于单片机的低功耗模式之前没深入了解STM32,最近才发现进最低功耗的STANDBAY模式RAM中数据对丢失,这点不如8位机,之前用STC的51和STM8系列从不担心ram数据丢失的问题。看STM32L系列进最低功耗也有这个问题,只是可以掉电保的RAM区域分的更多,更大。

-END-

整理文章为传播相关技术,版权归原作者所有 |

| 如有侵权,请联系删除 |

往期好文合集

如何才能学好单片机?

呵,你会51单片机的精确延时吗?

只有6个引脚的单片机,居然可以玩游戏。

最 后

若觉得文章不错,转发分享,也是我们继续更新的动力。

5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等

在公众号内回复「更多资源」,即可免费获取,期待你的关注~

十年硬件老司机,结合实际案例,带你探索单片机低功耗设计!相关推荐

  1. 10年硬件老司机,带你探索单片机低功耗设计

    经过多年的低功耗硬件设计(公司硬件设计和软件设计是分开的,我一直是做硬件,在面对低功耗生产事故中做硬件的往往很苦逼),我发现其中容易出的一个问题就是单片机进睡眠模式前IO没配好,产品上主要出的问题是这 ...

  2. 2020年软件测试需要学什么技术?软件测试人员需要懂代码?软件测试工程师要经常加班吗?--华为十年测试老司机写给迷茫的你

    一:前言:谁的青春不迷茫 一直以来有很多初入测试职场或者想转行如软件测试的人,都会有很多的疑问,例如软件测试需要学什么技术?软件测试人员需要撸代码?软件测试工程师累吗?需要经常加班吗?软件测试一些工具 ...

  3. 一个老王开枪案例带你一步一步领略程序开发的魅力

    一.前言 我身边的很多同学都认为学计算机专业的人,代码写的好很正常,认为自己不是学计算机专业的,不会写代码很正常,或者这么说,觉得会写代码是一种天赋.其实不然,我们现在必须要清楚当代社会的局势,当代社 ...

  4. 狗蛋(驱动小白)和老王(硬件老司机)关于硬件那点事儿的一次密谈

    引子 "老王,有个bug啊,很紧急啊?" QA急忙反馈到. "什么问题? 老王心里咯噔了下,心想,NND,被QA缠住,看来今晚又得和我的躺椅相依为伴了." &q ...

  5. 炎热的夏天过去了,老司机用Python带你爬爬哪个城市最热

    九月的尾巴,感觉炎热的夏天终于过去啦,小编最怕夏天了,你和烤肉之间是不是只差一撮孜然?那么这里我们也来蹭一蹭热度,来写个小爬虫,看看全国哪个城市最热.东西虽然小,但是比起那些所谓"高大上&q ...

  6. 一位十年的老司机告诉你什么是编程思想

    什么是编程思想?答案可能很会复杂,但也可以很简单.一句话来讲就是,用计算机来解决人们实际问题的思维方式,即编程思想. 我们学习编程语言的最终目的,就是希望用计算机来解决我们的实际问题.那么学习计算机该 ...

  7. 十年软件测试老司机,感悟!!送给刚入测试行业的萌新!!

    软件测试10年感悟 软件测试人员应该居安思危 测试人员应该比开发人员更熟悉业务需求 学会如何跟开发人员相处 测试人员应该懂一些基本的编程 测试人员搭建开发环境 写文档是测试人员的核心能力 测试后期应该 ...

  8. 接口文档包含哪些内容?怎么才能写好接口文档?十年测试老司机来告诉你

    目录 接口文档结构 参数说明 示例 错误码说明 语言基调通俗易懂 及时更新与维护 总结 那么我们该如何写好一份优秀的接口文档呢? 接口文档结构 首先我们要知道文档结构是什么样子的.接口文档应该有清晰明 ...

  9. 十年测试老司机对软件测试前景的个人见解

    百度一下"软件测试前景",前几个点进去都是某某培训机构的广告,后面的点进去间接的介绍一下然后又是各种机构的广告.所以,对于很多测试人员,尤其是职场小白,完全不知道自己进入这个行业的 ...

最新文章

  1. mysql出现unblock with 'mysqladmin flush-hosts'
  2. Android程序员一年工作经验能重复用十年?高效学习很重要!
  3. svn 安装_Tortoise SVN 安装
  4. 破解密码高手王小云教授简介
  5. c# socket接收字符串_socket通信很难?这一文让你轻松搞定!
  6. 强行删除文件 windwos10_如何彻底删除 Windows 当中的顽固文件?
  7. react 哲学_细聊Concent amp; Recoil , 探索react数据流的新开发模式
  8. gcc和g++的区别
  9. python封装成可执行的小程序_Python打包小程序
  10. 存储器空间或者桌面堆_向爱因斯坦学习桌面管理之道
  11. docker选择安装路径_Docker安装
  12. 12022.ADS7138采集芯片
  13. word没有显示endnote_Word2007或2010未显示EndNote工具条的解决方法 | 科研动力
  14. 37. 反转一个3位整数 Java
  15. 路由器的四根指针怎么放?
  16. mysql 提高恢复速度_如何有效地提高 MySQL 的备份和恢复速度?
  17. 企业可视化大屏如何搭建
  18. 菜鸟学开店—电子称连接标签打印机
  19. Matplotlib简介和pyplot的简单使用——subplot
  20. Linux Bash脚本练习2

热门文章

  1. Spark平台上提交作业到集群生成的日志文件
  2. SAP CRM schedule line i
  3. 2015-03-18 current note update logic in my task
  4. PBS_HAS_CHANGED ~ GET_SAP_MENU_INFO
  5. How OPA addFrame is called
  6. how is group implemented for navigation list
  7. Fiori应用里如何给客户主数据维护图片
  8. why my CREATE_OW will not generate OSSET entry in OB buffer
  9. 使用 ADS 渲染 SAP Adobe Form 的性能分析
  10. SAP S/4HANA product search implementation debug in backend