1.什么是GPIO
GPIO(General-purpose input/output),通用输入输出接口,通俗的说,就是单片机的引脚,可以控制外部设备,实现单片机与外部硬件之间的连接和通讯。每个芯片上都有很多组GPIO。掌握了GPIO口差不多就掌握了操作硬件的能力。
例如图上的PA0-PA15,是一组GPIO引脚。
1.1 GPIO配置要认识哪些寄存器
每一组GPIO都有一组寄存器与之关联,我们是通过编程读写相关寄存器,来实现对GPIO引脚的控制。GPIO常用寄存器有四种,配置寄存器,数据寄存器,复位/置位寄存器,复用寄存器。
配置寄存器 | 端口模式寄存器 | 控制gpio的工作模式 |
端口输出类型寄存器 | 控制gpio的输出类型 | |
端口输出速度寄存器 | 控制gpio的输出速度 | |
端口上下拉寄存器 | 控制gpio的上拉/下拉 | |
数据寄存器 | 端口输入数据寄存器 | 读取gpio的输入数据 |
端口输出数据寄存器 | 控制gpio的输出电平 | |
复位/置位寄存器 | 端口复位寄存器 | 设置gpio端口的输出位是1还是0 |
复用寄存器 | 复用功能寄存器 | 设置io口的复用功能 |
暂时只用知道个大概,因为在实际编程中,库函数会封装好底层寄存器的操作细节,使得开发者可以更专注于应用逻辑的实现,而无需记住每一个寄存器的具体功能和配置方法。不过,了解关键寄存器和它们的作用仍然是非常重要的,这可以帮助你更好地理解硬件的工作原理,以及在遇到问题时进行调试和优化。
2.GPIO有哪些工作模式
GPIO的工作模式有四种输入模式,上拉输入,下拉输入,浮空输入,模拟输入。
四种输出模式,包括推挽输出,开漏输出,推挽复用输出,开漏复用输出。
3.工作模式这么多,从哪里开始理解?
我认为学习GPIO的工作模式,从内部电路开始理解比较好,理解了电路,才能更好的理解内部工作原理,方便设计外部电路,提高代码的可移植性,并且深化记忆。
3.1 GPIO原理图,周围电路讲解
每个GPIO内部都有这样一个电路结构,上面是输入电路,输入的是外部电路的电平信号,下面是输出电路,输出的是微控制器内部的控制信号。
保护二极管的作用是钳位引脚电压,防止过高或过低的电压,造成芯片内部电路损坏
4.结合电路讲解GPIO各个模式
4.1 模拟输入
这里的施密特触发器,可以讲模拟信号转化为数字信号。当模拟输入模式时,外部的模拟信号不经过施密特触发器,直接进入片上的模拟外设,例如ADC模块
4.2 上拉输入与下拉输入,浮空输入
通过设置端口模式寄存器来选择使用上拉电阻或下拉电阻
上拉模式下,输入数据寄存器直接读取IO端口的电平,IO端口的电平为高电平,则读取高电平,IO端口为低电平,则读取低电平。IO端口悬空无信号输入时,则被上拉到高电平。
下拉模式下,输入数据寄存器直接读取IO端口的电平,IO端口的电平为高电平,则读取高电平,IO端口为低电平,则读取低电平。IO端口悬空无信号输入时,则被下拉到低电平。与下拉模式相反。
浮空输入模式下,IO端口悬空时,读取的端口电平是不确定的,这就是这三个输入模式最大的不同。
5.GPIO各个输入模式的使用场景与隐患
5.1.浮空输入模式(GPIO_Mode_IN_FLOATING)
使用场景:
按键检测:适用于需要检测外部按键的场景。按键未按下时,引脚呈高阻态,按下时引脚电平变化。
外部信号握手:适用于中断请求信号等外部信号的检测。
隐患:
电平不确定:在引脚悬空时,读取的电平状态是不确定的,容易受到外界干扰,导致误读取。需要外部上拉/下拉电阻:如果需要稳定的默认电平,通常需要外部添加上拉或下拉电阻。
5.2 上拉输入模式(GPIO_Mode_IPU)
使用场景:
默认高电平:适用于需要引脚在无外部驱动时保持高电平状态的场景,如某些通信协议的闲置状态保持。
低电平触发中断:适用于低电平有效的中断输入,如外部中断请求。
隐患:
外部低电平影响:当外部电路输出低电平时,引脚电平会被拉低,可能导致误触发。
上拉电阻值:内部上拉电阻值较大(通常为30K~50KΩ),可能不足以驱动某些外部设备。
5.3 下拉输入模式(GPIO_Mode_IPD)
使用场景:
默认低电平:适用于需要引脚在无外部驱动时保持低电平状态的场景,如某些通信协议的闲置状态。
高电平触发中断:适用于高电平有效的中断输入。
隐患:
外部高电平影响:当外部电路输出高电平时,引脚电平会被拉高,可能导致误触发。
下拉电阻值:内部下拉电阻值较大(通常为30K~50KΩ),可能不足以驱动某些外部设备。
5.4 模拟输入模式(GPIO_Mode_AIN)
使用场景:
ADC采集:适用于连接温度传感器、光照强度传感器、电压分压器等模拟信号源,通过ADC采集模拟信号并转化为数字值进行处理。
隐患:
信号范围限制:输入信号必须在0~3.3V之间,否则可能损坏内部电路。
无法读取数字电平:在模拟输入模式下,信号不经过施密特触发器,无法读取准确的数字电平状态。