搜索
bottom↓
回复: 28

[YJGQDD]分享一个关于低功耗应用时单片机IO配置心得

  [复制链接]

出70入145汤圆

发表于 2017-8-2 09:32:19 | 显示全部楼层 |阅读模式
        经过了多年的低功耗硬件设计(公司硬件设计和软件设计是分开的,我一直是做硬件,在面对低功耗生产事故中做硬件的往往很苦逼),其中容易出的一个问题是单片机进睡眠模式前IO没配好,产品上主要出的问题是这些出问题的IO比较隐蔽,当时经过多次测试也没测试出来。后来在生产或现场才发现的概率性功耗偏大的问题。站在硬件的角度,最近才意识到原来软件上一直容易犯的一个毛病是进睡眠前没有把所有IO重新配置一遍,这样容易导致IO低功耗的BUG出现
           这个心得总结起来是:要求在进睡眠模式前把所用的单片机的所有的IO从代码上1个IO接1个IO的配置一遍。不要偷懒,不要多个IO一起配置。
        分析:
1:外设的时钟没关,单片机内部模块没关等,部分单片机进睡眠后自动会关闭,不会自动关闭的,没关的话当场测试功耗就偏高,会马上发现的。所以这些在实际生产中都没出过问题。
2:1个IO接1个IO配置,不要多个IO用类似BIT1|BIT2……,|=0xxx这类一起配置。因为代码上越是直观,出现笔误的概率越低。而且我们核对IO的时候都是1个IO,1个IO的去核对配置对不对。所以代码上依次写一下其实花了不了多少时间和代码空间的。花个5到30分钟撑死,但是后续节省的时间和金钱就不好说了。人的总是有惰性的,我自己写代码的时候之前进低功耗前也只是配置了一部分,现在慢慢开始习惯全部配置,很多配置可以复制之前的IO初始化(这个已经养成了1个IO,1个IO的配置,改起来其实很舒服的)
3:实际出现的最麻烦,最隐蔽的情况往往跟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区域分的更多,更大。ARM在单片机上最低功耗的设计怎么这么麻烦?而且还是比不上8位机?

出0入0汤圆

发表于 2017-8-2 09:43:30 | 显示全部楼层
很多不错的经验。关于IO空Pin默认状态,有什么具体的说法吗?还是仅仅根据个人爱好即可?

出0入4汤圆

发表于 2017-8-2 09:48:07 | 显示全部楼层
li.wen 发表于 2017-8-2 09:43
很多不错的经验。关于IO空Pin默认状态,有什么具体的说法吗?还是仅仅根据个人爱好即可? ...

上拉或者下拉输入

出90入0汤圆

发表于 2017-8-2 09:50:39 | 显示全部楼层
hailing
海林?

出70入145汤圆

 楼主| 发表于 2017-8-2 12:28:37 | 显示全部楼层

不是,很久前注册的,使用我和我老婆的名字中的一个合起来

出70入145汤圆

 楼主| 发表于 2017-8-2 12:32:58 | 显示全部楼层
li.wen 发表于 2017-8-2 09:43
很多不错的经验。关于IO空Pin默认状态,有什么具体的说法吗?还是仅仅根据个人爱好即可? ...

原则是不能增加功耗。实际操作真的跟个人喜好和MCU有关。430没上下拉电阻就只能输出,输出低比输出高好。51的默认51模式就可以了,输出0的话需要配置为推挽输出后再输出0,普通51模式输出0会被上拉电阻消耗电流的。ST的输出0或下拉输入都可以。测试过功耗没明显不同,所以正确的几种模式前提下实际就是看个人喜好了。

出5入14汤圆

发表于 2017-8-2 12:52:39 | 显示全部楼层
本帖最后由 EMC菜鸟 于 2017-8-2 12:54 编辑

团队合作确实有这种问题;不过其实软件人员和硬件人员互相推诿这种事,还是看性格、而不是看硬件或软件,有些人就一副不配合的样子,跟做什么无关!
低功耗的板子,生产起来确实头疼,除了软件要周全外,生产调试也很重要!

不过你说的要一个一个的配置,也是教条了 ——要在进入睡眠之前重新配置一遍,如果软件人员这个都想不到,只能说你们公司的软件人员根本就是混日子的!

出0入0汤圆

发表于 2017-8-2 13:22:03 | 显示全部楼层
以前也总是遇到做硬件的人跟做软件的人吵架当然只是纯粹的技术讨论。做硬件的人比较吃亏

出0入0汤圆

发表于 2017-8-6 17:13:50 来自手机 | 显示全部楼层
最高硬件的控制部分都有默认硬件电平,这样出问题直接去掉mcu,软硬分离

出0入0汤圆

发表于 2017-8-6 17:38:47 | 显示全部楼层
STM8L 一般应用够了.....我现在还有很多PIC,430片,都扔了。

出0入0汤圆

发表于 2017-8-24 16:21:03 | 显示全部楼层
STM32F103单片机关闭外部中断耗电30ua,打开外部中断耗电480ua,请问是什么情况呢,没有中断就唤醒不了,有了有太耗电。。。

出70入145汤圆

 楼主| 发表于 2017-8-25 11:52:06 | 显示全部楼层
th1993 发表于 2017-8-24 16:21
STM32F103单片机关闭外部中断耗电30ua,打开外部中断耗电480ua,请问是什么情况呢,没有中断就唤醒不了,有了 ...

我对具体STM32的代码没研究,你是用库函数操作的吗,看下是不是还有模块开外部中断后被打开了耗电?

出0入0汤圆

发表于 2017-8-25 12:01:14 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2017-8-25 12:39:45 | 显示全部楼层
还没怎么考虑功耗的问题,先学习了

出0入0汤圆

发表于 2017-11-8 23:32:16 | 显示全部楼层
不错啊,学习了

出0入0汤圆

发表于 2018-1-19 20:18:36 | 显示全部楼层
低功耗跟IO输入状态有关吧

出0入0汤圆

发表于 2018-4-2 15:22:30 | 显示全部楼层
hailing 发表于 2017-8-2 12:32
原则是不能增加功耗。实际操作真的跟个人喜好和MCU有关。430没上下拉电阻就只能输出,输出低比输出高好。 ...

楼主,我想问你一个问题啊。    我用的板子是引出来的IO只有7个   ,整个芯片的是28个。  (其它的引脚我没算进来)

我老大跟我说,哪些没有引出来的IO也要配置。

最后我也配置了。基本都是一个一个配置的。尝试了很多种搭配。  但是还是和理论差20uA左右(理论是几个uA,我现在是27uA)。

接下来还有什么思路吗?  我已经没思路了。看了几天的datasheet了。

出0入0汤圆

发表于 2018-4-2 17:35:03 | 显示全部楼层
hailing 发表于 2017-8-2 12:32
原则是不能增加功耗。实际操作真的跟个人喜好和MCU有关。430没上下拉电阻就只能输出,输出低比输出高好。 ...

我后面再次细看了一下。电路中还存在着稳压电路和充电电路。

我现在估计是这俩个消耗了电流。   该怎么样来验证呢?

出110入12汤圆

发表于 2018-4-2 18:12:53 | 显示全部楼层
秽土转生 发表于 2018-4-2 17:35
我后面再次细看了一下。电路中还存在着稳压电路和充电电路。

我现在估计是这俩个消耗了电流。   该怎么 ...

理论值只是MCU休眠电流,现在你整板电流是MCU+其他电路电流=27uA。所以你摘下MCU之后再测整机电流,如果接近27uA,那就是调到理论值了

出70入145汤圆

 楼主| 发表于 2018-4-3 09:29:09 | 显示全部楼层
秽土转生 发表于 2018-4-2 17:35
我后面再次细看了一下。电路中还存在着稳压电路和充电电路。

我现在估计是这俩个消耗了电流。   该怎么 ...

直接在PCB上把到单片机的供电线隔开,这样单独测量MCU的供电电流。使用割线后串万用表的方式把各个单元的电流都测试出来。稳压电路使用的是哪个LDO?这个要是接入电路的话也要消耗至少几个uA的电流,充电电路要具体看电路了,一般充电电流不会从电池侧取。

出5入14汤圆

发表于 2018-4-3 12:24:48 | 显示全部楼层
我怎么觉得读了楼主的经历后,最大的心得就是:特木的软件和硬件还是一个人搞最合适!!!

出0入112汤圆

发表于 2018-4-9 17:55:06 | 显示全部楼层
5点“STM8S看了下代码发现喜欢配置成上拉输入状态”,我觉得配置成输出更好点,输入可能引入干扰信号。

出70入145汤圆

 楼主| 发表于 2018-4-9 22:52:29 | 显示全部楼层
xunke 发表于 2018-4-9 17:55
5点“STM8S看了下代码发现喜欢配置成上拉输入状态”,我觉得配置成输出更好点,输入可能引入干扰信号。 ...

没用的IO,因为外部没有pcb走线,外部干扰能对他产生的干扰是很小很小的。设置成确定上拉或下拉电阻输入的话,不怕外部引脚相互之间短接,或者有锡渣,导线等掉到上面不会因为电流超大导致单片机复位。 还有就是我在调试阶段,经常要用示波器,万用表量io,输入的话不怕短接烧io。上下拉输入或者是输出对功耗的影响,我到现在也没有发现有明显区别,所以这两者都是可以的。

出0入112汤圆

发表于 2018-4-10 09:40:26 | 显示全部楼层
hailing 发表于 2018-4-9 22:52
没用的IO,因为外部没有pcb走线,外部干扰能对他产生的干扰是很小很小的。设置成确定上拉或下拉电阻输入的 ...

谢谢你用心的回复!

出0入0汤圆

发表于 2018-4-19 15:56:20 | 显示全部楼层
学习了,非常不错

出0入0汤圆

发表于 2018-4-19 23:13:48 | 显示全部楼层
一定要有确定的电平,不能浮空

出0入0汤圆

发表于 2018-4-20 08:13:36 | 显示全部楼层
楼主说得对,IO这一定要设置,否则容易出问题。

出0入0汤圆

发表于 2018-4-20 08:52:41 | 显示全部楼层
stm32还有丢数的问题啊,有人在这方面有经验么?

出70入145汤圆

 楼主| 发表于 2020-11-17 14:01:56 | 显示全部楼层
       昨天晚上调试了一个使用STM8L052R8单片机的测试工装。进入halt前已经把全部的IO都配置了一遍,但是功耗还是比较大。2块板子1个有20uA,另外1个是70uA。用手摸上面的器件引脚功耗电流没明显变化。重新检查代码反复测试功耗还是下不去。
      最后实在没办法,就在硬盘上翻出来STM8L-discovery开发板的代码,查找里面关于低功耗的配置,一条条的排除过去,最后发现我部分的IO推挽输出模式设为了10MHz的模式。而开发板里面进低功耗前IO都是设置为2MHz的模式。把输出模式改为2MHz后,进halt后功耗立马正常了。2块分别是0.5uA和0.7uA。想不到STM8L对于推挽输出的速度竟然影响到低功耗时的电流。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 02:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表