使用OUTPUTCHANNEL时IO可能出现短暂电平跳变

一、OUTPUTCHANNEL介绍

首先先简单介绍下OUTPUTCHANNEL的使用。WL82有4个OUTPUTCHANNEL,可以通过寄存器配置,将普通IO口映射到其原本不具备的功能,比如PA0映射出UART1_TX来作为log打印口。

OUTPUTCHANNEL配置方法:

  • 1.设置IO口对应PORT的 DIRPUPD 寄存器相应的BIT来开启该引脚的OUTPUTCHANNEL功能( DIR 置0, PUPD 置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]

    ddddd

    图1 OUTPUTCHANNEL配置

二、问题分析

由于IO PORT的5个寄存器即用来作为IO口的输入输出、上下拉、高低电平配置,又作为OUTPUTCHANNEL的配置寄存器,需要依次配置多个寄存器才能实现功能的切换,因此可能出现短暂电平跳变的情况。以SDK的spec_uart.c的代码为例,程序配置流程是,先配置IOMC后,再配置IO PORT的5个寄存器,其中配置IO PORT寄存器相关代码如图2。由于 DIRPUPD 三个寄存器肯定无法同时配置,当程序使用CH0或CH1时,SDK程序先配置OUT为0输出低,并设置 DIR 未0(输出模式),这时由于 PUPD 还没有置1,因此OUTPUTCHANNEL功能未开启,IO便会处于输出低电平的状态,所以会出现IO短暂将电平拉低的现象,如图3。实测程序使用CH2或CH3时没有出现短暂电平变低的情况。

图2 SDK OUTPUTCHANNEL配置的部分代码(详见spec_uart.c的485行左右位置)

图3 异常现象

还是以 spec_uart.c 的代码为例,考虑先将OUT寄存器置1,再依次配置 DIRPUPD 开启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、 DIRPUPD 的顺序配置寄存器,再根据IO的初始IO电平状态来选择使用CH0/CH1还是CH2/CH3。因为{OUT,DIE}这两个寄存器决定了使用哪个通道,而配置OUTPUTCHANNEL过程中,OUT寄存器又会短暂影响IO电平,根据IO电平来选用合适的通道便可以规避上述问题。

  • 初始IO电平为高,选用CH2或CH3来作为OUTPUTCHANNEL。

  • 初始IO电平为低,选用CH0或CH1来作为OUTPUTCHANNEL。