电子产品开发细节之 MCU I/O 端口处理

I/O 端口,是单片机学习者首先接触的基本外围功能,用于输出控制信号、或者输入外部状态信号。尽管功能简单、易用,在实际的电子产品开发中,仍有值得注意的细节,甚至这些细节的处理关乎产品的质量。作为示例,本文介绍2点需要关注的内容。

1、端口的方向设置
对于双向I/O端口,具体应用中根据实际需要,设置为输入端口或者输出端口,这个功能的实现,通常是在初始化程序中,通过设置I/O端口的方向寄存器来完成的。
如下例所示:
电子产品开发细节之 MCU I/O 端口处理
以上的程序,从逻辑上看,没有任何问题。但是,在产品的实际工作过程中,方向寄存器中的设定值,存在被意外改写的风险。例如,强噪声环境中运行的电子产品。
那么,如何尽可能地降低这种风险带来的负面影响呢?
常用的方法,是每隔一段时间,重复设置方向寄存器,以减少方向寄存器被意外改写所带来运行故障。如下所示。
电子产品开发细节之 MCU I/O 端口处理
2、位操作指令的使用
有的单片机提供了位操作指令(例如:SEB命令,CLB命令),用于对某一输出端口执行置位(端口输出高电平)或复位(端口输出低电平)操作。但是,使用位操作时如果不慎,也可能会给产品的运行带来意外的故障。为什么呢?
通常,单片机的CPU访问内置RAM(含SFR)时,是以字节为单位访问的。对于某一端口的位操作,实际执行的操作是:读入字节 => 修改目标位 => 以字节写回寄存器。
例:
8bit 的端口P1,其中P10设置为输出端口,P11-P17设置为输入端口。执行 SEB P10 命令使P10输出高电平。其执行过程,如下图所示。
电子产品开发细节之 MCU I/O 端口处理
可以看到,执行位操作指令(SEB P10)后,目标端口P10的输出高电平,符合预期。但是,P10-P17的输出缓冲器(output latch)也发生了变化,而这个变化并非是执行该位操作指令的初衷。如果实际的产品方案中,端口P10-P17 由于工作需要,存在方向切换的可能(某一条件下,用作输入,另外条件下,用作输出),那么,预想外的输出缓器(output latch)数据,会产生意外的结果、甚至损坏系统硬件。
实际的产品开发中,如何避免端口从输入切换为输出时,由于输出缓冲器中的意外数据带来的负面影响呢?
推荐方法:
通过方向寄存器将输入端口切换为输出端口之前,根据需要,首先设置输出缓冲的初始值。
方法非常简单,但在开发实践中,经常被忽略。因此,细节关乎品质。## 标题