前言
记录了GPIO外设的基本结构以及8种工作模式
GPIO(General Purpose Input Output)通用输入输出口
可配置为8种输入输出模式
引脚电平:0V~3.3V,部分引脚可容忍5V
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等,比如软件模拟IIC、SPI
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
提示:以下是本篇文章正文内容,下面案例可供参考
一、GPIO基本结构
基本结构如图所示,在图片最右边,两个保护二极管连接到了I/O引脚上
保护二极管的作用是:
输入时,IO引脚输入的电压如果大于3.3V,则连接VDD的二极管导通;IO引脚输入的电压如果小于0V,则连接VSS的二极管导通,只有当IO引脚输入的电压在0到3.3V之间的时候,才会进入内部电路,这样防止过大的电压进入单片机内部,造成损坏
二、GPIO的工作模式
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式(四种输入,四种输出)
模式名称 | 性质 | 特征 |
---|---|---|
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
在Keil中,用结构体定义了这八种模式
typedef enum
{ GPIO_Mode_AIN = 0x0, // 模拟输入
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
GPIO_Mode_IPD = 0x28, // 下拉输入
GPIO_Mode_IPU = 0x48, // 上拉输入
GPIO_Mode_Out_OD = 0x14, // 开漏输出
GPIO_Mode_Out_PP = 0x10, // 推挽输出
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
}GPIOMode_TypeDef;
typedef:用途是将一个比较长的变量类型名换个名字,便于使用
1.模拟输入
如图,外部信号经过I/O引脚直接输入到单片机的片上外设,比如ADC外设,用于采集输入的电压
2.浮空输入
浮空输入模式,是GPIO口最常用的一种模式,它的优点是输入阻抗高,MCU采集的状态是单纯的外部信号;缺点是没有IO信号时,读取的端口状态不确定
施密特触发器可以把输入的模拟信号转换成高低的电平信号,施密特触发器前是模拟量,后是数字量
3.上拉输入
当I/O输入的信号比较弱,容易受到干扰不稳定时,选泽上拉输入,通过读输入寄存器IDR的值,就可以知道I/O引脚是高电平还是低电平
4.下拉输入
下拉输入如图,其实开/关的上拉或者下拉电阻可以通过软件配置,上拉、下拉的作用是给输入提供一个默认的输入电平的,高电平或者低电平
5.推挽输出
推挽输出如图,推挽输出优点在于输出高低电平与电源电压基本没有压差,可以提供较强的高电平与低电平驱动能力,可以直接驱动小于20mA的小功率外设如发光二极管。
推挽输出时的内部控制简化图如下,与复用推挽输出的区别是,推挽输出是单片机自己拥有引脚的控制权,而复用推挽输出的控制权则转移给了片上外设,比如Timer、IIC、SPI等
6.开漏输出
开漏输出一般被用作通讯引脚,因为开漏模式下引脚具有线与的特点,比如我们配置IIC的时候,电路一般被配置成开漏输出+外部上拉的模式,我们要注意区分一下推挽和开漏两种模式,下面是一些总结
- 推挽模式下,高低电平都有驱动能力;
- 推挽模式,P-MOS、N-MOS都在工作,输出数据寄存器为1时,下管断开,也就是N-MOS断开,N-MOS接通,这时输出直接接到VDD,,输出高电平,输出数据寄存器为0时,下管导通,也就是N-MOS接通,这时输出直接接到VSS,也就是输出低电平,所以推挽模式单片机对GPIO有绝对控制权
- 开漏输出模式下,高电平没有驱动能力(开漏输出相当于高阻态),低电平有驱动能力,因为开漏输出模式下,P-MOS 是没用的,只有N-MOS在工作,输出数据寄存器为1时,下管断开,也就是N-MOS断开,这时输出相当于断开,也就是高阻模式,输出数据寄存器为0时,下管导通,也就是N-MOS接通,这时输出直接接到VSS,也就是输出低电平,这种模式下,只有低电平有驱动能力,
开漏模式可以作为通讯协议的驱动方式,比如IIC通讯的引脚,就是使用开漏模式;这个模式可以避免多个设备的干扰;此外,这个模式还可以用来输出5V,只要IO口外接上拉电阻到5V,然后输出数据寄存器为1时直接高阻接到VDD,输出就会被直接拉高到5V
7.推挽复用输出
引脚控制权转移到了片上外设,其它与推挽输出没有区别
8.开漏复用输出
引脚控制权转移到了片上外设,其它与开漏输出没有区别
开漏模式和推挽输出的区别