由于IO PORT的5个寄存器即用来作为IO口的输入输出、上下拉、高低电平配置,又作为OUTPUTCHANNEL的配置寄存器,需要依次配置多个寄存器才能实现功能的切换,因此可能出现短暂电平跳变的情况。以SDK的spec_uart.c的代码为例,程序配置流程是,先配置IOMC后,再配置IO PORT的5个寄存器,其中配置IO PORT寄存器相关代码如图2。由于 DIR、 PU 、 PD 三个寄存器肯定无法同时配置,当程序使用CH0或CH1时,SDK程序先配置OUT为0输出低,并设置 DIR 未0(输出模式),这时由于 PU 和 PD 还没有置1,因此OUTPUTCHANNEL功能未开启,IO便会处于输出低电平的状态,所以会出现IO短暂将电平拉低的现象,如图3。实测程序使用CH2或CH3时没有出现短暂电平变低的情况。
还是以 spec_uart.c 的代码为例,考虑先将OUT寄存器置1,再依次配置 DIR 、 PU 、 PD 开启OUTPUTCHANNEL,使得配置完 DIR 寄存器为输出后仍然为高,是否可以避免上述问题?答,不行,OUT寄存器的值参与决定OUTPUTCHANNEL的通道口,按OUT-> DIR -> PU -> PD 顺序配置,到 PD 后,可能会出现短暂的使用错通道口的情况,这时该通道口映射的外设会影响该引脚的电平(也可能反向影响那个通道的外设),比如打算使用CH0(OUT=0,DIE=0),按上述配置顺序,会出现短暂错误使用CH2(OUT=1,DIE=0)的情况。而且不是所有IO初始电平都为高。
实测UART外设在不同配置下的现象,见表1。
该问题无法从根本上解决,但可以根据实际情况配置来避免。避免办法:按DIE、OUT、 DIR 、 PU 、 PD 的顺序配置寄存器,再根据IO的初始IO电平状态来选择使用CH0/CH1还是CH2/CH3。因为{OUT,DIE}这两个寄存器决定了使用哪个通道,而配置OUTPUTCHANNEL过程中,OUT寄存器又会短暂影响IO电平,根据IO电平来选用合适的通道便可以规避上述问题。