GPIO的寄存器

GPIO分类

GPIO(general purpose input and output)的寄存器分为两大类:

  • 控制寄存器:
    • 功能选择控制寄存器 GPxMUX
    • 方向控制寄存器 GPxDIR
    • 输入限定控制寄存器 GPxQUAL
  • 数据寄存器:
    • 数据寄存器 GPxDAT
    • 置位寄存器 GPxSET
    • 清除寄存器 GPxClear
    • 取反寄存器 GPxTOGGLE

说明:

  1. x代表A、B、D、E、F、G
  2. MUX 代表功能切换的意思
  3. 对于GPxMUXGPxDIRA,B,D,E,F,G都有;而GPxQUAL,只有A,B,D,E才有
  4. 多路复用

举例说明

以PWM1引脚作为例子来理解以下概念

功能选择控制寄存器(GPxMUX)

因为GPIO的引脚是复用的,所以在使用GPIO的引脚之前,就需要选择这个引脚是作为功能引脚还是通用的数字I/O口
所以想让PWM1引脚作为PWM波形的输出引脚,这将GPIOA的D0位置1;反之,若想让PWM1引脚作为通用的数字I/O口,这将GPIOA的D0位置0。
GPIO的控制寄存器都是受EALLOW保护。所以对其操作前后需要加上EALLOW;EDIS;

EALLOW;
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOAO=1; //PWM波形的输出引脚
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOAO=0; //通用的数字I/O口
EDIS;

方向控制寄存器(GPxDIR)

假设将引脚PWM1设为通用的数字I/O口,这时需要判断是否是做输入引脚还是输出引脚,用如下设置进行设置 (0入1出

EALLOW;
GpioMuxRegs.GPADIR.bit.GPIOAO = 0; //输入引脚
GpioMuxRegs.GPADIR.bit.GPIOAO = 1; //输出引脚
EDIS;

数据寄存器(GPxDAT)

当我们选择完功能和方向之后,我们就可以进行读该引脚的电平信息,如下所示

if(GpioDataRegs.GPADAT.bit.GPIOAO == 1) //高电平
{...} 
if(GpioDataRegs.GPADAT.bit.GPIOAO == 0) //低电平
{...}

若是赋值,就使用一个等号既可

输入限定控制寄存器(GPxQUAL)

作用:防止输入干扰信号
举例说明

假设采样窗口为6个信号宽度,只有连续6个被采样的信号都是一样才变化,否则认为是干扰信号,不改变原来的状态

电路图解析

符号解释

  • 1代表数据输入方向
  • 2代表数据输出方向
  • 3代表多功能切换,横向的那个指向箭头为控制引脚,若控制引脚为0,则选择0那条路作为输出,反之则为1
  • 8为单向选择驱动,只有当横向那个箭头输入进来为1,才导通
  • 9为或门,○为取非
  • 10为引脚,代表芯片伸出的焊接点

通用IO输入功能分析

首先从PIN口输入信号,到达输入量化,这个由系统时钟输入限定控制寄存器共同决定当前电平,然后再往上走,到达单向选择驱动,这里控制线(水平那个)需要为0时,取非为1才能导通,而这个是由方向控制寄存器控制,当方向控制寄存器为0时,则导通,那么输入信号就可以保存到数据寄存器

通用IO输出功能分析


当要将数据寄存器数据输出时,首先进过①,当GPxDIR寄存器为1(输出)时,①导通,数据来到了MUX,当GPxMUX寄存器选择0(通用的数字I/O口)时,数据就可以流到②的位置,此时若置位端没有按下(为1),也没有越界(为1),加上GPxDIR寄存器为1,通过或非门,则输出0,所以②导通,数据成功到达引脚(PIN)

功能引脚分析


首先GPxMUX为1,则将外设I/O口的输出引脚接到PIN端口,具体如图所示

tip:

  1. 高阻控制:高阻状态不是0也不是1,就是这条线没有用了,若不是高阻状态则为1
  2. 内部上拉或下拉:简单说就是将输出的电平变的精确,要么为0,要么为1,就不会存在一个模糊的值(如0.5这样)