本帖最后由 caolina1013 于 2025-5-16 13:45 编辑
问题终于解决了。
先说原因:静态电流异常是因为休眠之前对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才有用。
罗里吧嗦的写了这么多,文笔有限,不知道有没有把问题描述清楚,希望某一天遇到同样问题的老铁能搜到这个帖子,看完我的描述,能对您有所帮助。
|