使用OUTPUTCHANNEL时IO可能出现短暂电平跳变
一、OUTPUTCHANNEL介绍
首先先简单介绍下OUTPUTCHANNEL的使用。WL82有4个OUTPUTCHANNEL,可以通过寄存器配置,将普通IO口映射到其原本不具备的功能,比如PA0映射出UART1_TX来作为log打印口。
OUTPUTCHANNEL配置方法:
1.设置IO口对应PORT的
DIR
、PU
、PD
寄存器相应的BIT来开启该引脚的OUTPUTCHANNEL功能(DIR
置0,PU
和PD
置1)。2.配置IO口对应PORT的OUT和DIE寄存器相应的BIT来选择使用哪一个通道。
3.配置IOMC寄存器来选择通道接入什么外设。
{OUT,DIE}=00: 输出通道0,控制寄存器IOMC1[11:8]
{OUT,DIE}=01: 输出通道1,控制寄存器IOMC3[23:20]
{OUT,DIE}=10: 输出通道2,控制寄存器IOMC3[27:24]
{OUT,DIE}=11: 输出通道3,控制寄存器IOMC3[31:28]
图1 OUTPUTCHANNEL配置
二、问题分析
由于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时没有出现短暂电平变低的情况。
图2 SDK OUTPUTCHANNEL配置的部分代码(详见spec_uart.c的485行左右位置)
图3 异常现象
还是以 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。
表1 UART不同配置下的现象
三、处理办法
该问题无法从根本上解决,但可以根据实际情况配置来避免。避免办法:按DIE、OUT、 DIR
、 PU
、 PD
的顺序配置寄存器,再根据IO的初始IO电平状态来选择使用CH0/CH1还是CH2/CH3。因为{OUT,DIE}这两个寄存器决定了使用哪个通道,而配置OUTPUTCHANNEL过程中,OUT寄存器又会短暂影响IO电平,根据IO电平来选用合适的通道便可以规避上述问题。
初始IO电平为高,选用CH2或CH3来作为OUTPUTCHANNEL。
初始IO电平为低,选用CH0或CH1来作为OUTPUTCHANNEL。