GPIO的寄存器
GPIO分类
GPIO(general purpose input and output)的寄存器分为两大类:
- 控制寄存器:
- 功能选择控制寄存器
GPxMUX
- 方向控制寄存器
GPxDIR
- 输入限定控制寄存器
GPxQUAL
- 数据寄存器:
- 数据寄存器
GPxDAT
- 置位寄存器
GPxSET
- 清除寄存器
GPxClear
- 取反寄存器
GPxTOGGLE
说明:
x
代表A、B、D、E、F、GMUX
代表功能切换的意思- 对于
GPxMUX
和GPxDIR
,A,B,D,E,F,G都有;而GPxQUAL
,只有A,B,D,E才有- 多路复用
举例说明
以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:
- 高阻控制:高阻状态不是0也不是1,就是这条线没有用了,若不是高阻状态则为1
- 内部上拉或下拉:简单说就是将输出的电平变的精确,要么为0,要么为1,就不会存在一个模糊的值(如0.5这样)