[PIC®/AVR®/dsPIC®产品] MCU配置错误导致偶发的功耗异常Bug,值得一看!

[复制链接]
584|3
dffzh 发表于 2025-10-14 15:59 | 显示全部楼层 |阅读模式
BUG, MCU, , , ,

我记得5月份期间协助一位坛友解决了一个因MCU配置错误导致偶发的功耗异常Bug,个人认为还是比较经典的,值得大家参考的,今天就总结成文,希望对大家有所裨益。
问题描述主要如下:
用PIC24FJ512GA606-I/PT单片机,单片机平时是休眠状态,当有外部中断时,会唤醒单片机去做检测,然后把检测到的数据上传给上位机,然后又进入休眠。产品批量以后发现一个问题,大部分板子休眠模式下电流大约是30个微安,20%-30%比例的板子休眠模式下电流为100个微安。我可以确定的是:跟外围电路无关,A板子静态电流大,B板子静态正常,其他不变,我把A板子的单片机跟B板子的单片机交换焊上之后,A板子静态电流正常了,B板子静态电流变大了,也就是说是单片机造成的静态电流大。所有单片机程序都是一样的。
所有的单片机都是同一批次购买的,单片机的丝印完全一样。
从问题呈现的表象来看,貌似是MCU芯片存在一致性差问题,但这种可能性其实很小的,按我经验来看。
最开始给坛友提供的回复是:
1、正常运行时,正常板子和异常板子的功耗电流一样吗?还是也有差别?
2、板子与上位机是什么通讯方式?
3、以前做过电池供电的低功耗产品,个人经验吧,这种偶发性问题,建议还是先从程序上再排查一下;
看现象描述确实与软硬件无关,更多的是指向MCU功耗差异大,但是有时候偶发性Bug就是这样,迷惑性大。
坛友的回复:
1、正常运行时,电流差异没法准确得知,因为都是几十个毫安左右,而且是变化的,没法精确到微安。但是功能上没有差别,都满足我的功能需求。
2、板子与上位机用433M无线通讯方式。
3、我确实也怀疑是我程序上有BUG,我挂上仿真器,仿真两种板子,在休眠模式下暂停,仔细对照了所有SFR的值,除了个别定时器数值不一样(因为手动停的地方不一样)其他都完全一样
4、我把sleep模式,改成idle模式,整体电流增大了,这个是可以理解的,但是仍然存在板子之间有差异。也就是说我的板子无论是休眠模式,还是空闲模式都有这个问题。
我查看了芯片数据手册,单片机的休眠电流数据确实存在差异,但这个差异应该是在合理范围内,可以接受的:
后来也试过把RTC时钟电路关掉,把无线通讯功能关掉,但都还存在这个问题。
后面我咨询了PIC的FAE,得到的回复是:
应该是没有进休眠状态,没完全进休眠,cpu可能停了,但是别的外设,时钟可能还开着;
最好具体分析下有没有什么条件制约了进休眠;
同样的代码,但是操作流程不正确,有可能某些芯片顺利休眠了,有些没有,没看到代码不好说;
之前碰到过类似的案例,不是同款芯片,最终是客户自己代码问题(有个外设中断没关);

PIC有PMD,用好很重要:
后面反复与坛友来回沟通,坛友开始怀疑:
休眠模式下,我的单片机引脚没处理好,PIC单片机休眠模式下,GPIO口应该怎么处理,第一种是未用的引脚,第二种是已用但是外部电路未供电的引脚(比如UART的TX、RX连接了外部的485芯片,但是休眠模式下485芯片的电源是切断的)、我的处理方法是:第一种未用的引脚全部设成输出,输出位0,第二种引脚,我用PMD禁止了相关外设,比如关闭UART功能,然后又把引脚设成输出,输出为0,当单片机唤醒的时候,我打开PMD,然后重新初始化一下UART。
后来坛友所在区域的PIC的技术支持也协助帮忙分析了。
最后终于找到原因了:
先说原因:静态电流异常是因为休眠之前对IO口处理不当造成引脚悬空产生漏电流。
我详细说说进休眠之前应该怎么处理GPIO口。
第一种:没有接任何电路的GPIO口,这种引脚在程序初始化的时候,就把它们设置成数字输出,输出0。我一直也是这样做的,所以电流异常的现象跟这种情况无关。
第二种:接了外部电路但是休眠模式下外部电路不工作的IO口。以我的板子为例,UART5接了红外通信电路,但是休眠模式下,红外电路是断电的。这款片子本身就有UART5引脚不需要做映射,但TXD5跟D1口是复用的,RXD5跟D6口是复用的。我是这样处理的:休眠前,通过给外设模块禁止寄存器PMD写1禁止UART5,PMD8bits.U5MD=1;我之前理解的是禁止了UART5就是把复用管脚切成普通IO口了,所以我接着就把D1和D6设成数字输出,输出为0。万万没想到问题就出在这里。我先把datasheet里的相关描述贴出来。
为了降低功耗,这款单片机允许有选择的禁止外设模块,而且提供了两种方式,可以写XXXEN位,也可以写PMD,红框下面详细描述了这两种方式对功耗、寄存器读写的区别。当我看到这里的时候,我就试着把我的程序里禁止PMD后面又加了一条语句, U5MODEbits.UARTEN=0;  然后很神奇的,问题就解决了。问题解决了,我就分析原因,我认为资料这个地方只是说了这两种禁止外设的方法在功耗和寄存器方面的区别,但是没有说对复用管脚的影响,对于有复用管脚的外设,如果只是禁止PMD,其实并没有把管脚切换成普通IO口,还是TXD、RXD口,这时你对端口写0是没用的,必须用XXXEN位来禁止外设才能把复用管脚切换成普通IO口,对普通IO口写0才有用。
综上所述,开发低功耗产品很容易出现一致性问题,需要认真仔细分析才能找到根因。
有兴趣的可以去看一下原贴,链接如下:

https://bbs.21ic.com/icview-3453022-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| dffzh 发表于 2025-10-14 16:02 | 显示全部楼层
@21小跑堂 管理员,你好,求原创审核哦!
lcczg 发表于 2025-10-15 10:43 | 显示全部楼层
不用的管脚是要处理的。楼主的分享非常有参考意义。
 楼主| dffzh 发表于 2025-10-15 11:10 | 显示全部楼层
lcczg 发表于 2025-10-15 10:43
不用的管脚是要处理的。楼主的分享非常有参考意义。

低功耗产品,就很容易出现类似的异常现象,部分板子功耗正常,部分板子功耗异常,类似这种情况,需要仔细分析软件和硬件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

1486

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部