STM32的GPIO详解(HAL库)
STM32的GPIO详解(HAL库)
基础部分
GPIO全名为General Purpose Input Output,即通用输入输出。有时候简称为“IO口”。通用,说明它是常见的。输入输出,就是说既能当输入口使用,又能当输出口使用。端口,就是元器件上的一个引脚。输入模式和输出模式是GPIO的基本特性,当然GPIO还有其它模式可选。例如:选择它的IIC模式,等等。
- GPIO的工作模式
- GPIO_Mode_IN_FLOATING 浮空输入
- GPIO_Mode_IPU 上拉输入
- GPIO_Mode_IPD 下拉输入
- GPIO_Mode_AIN 模拟输入
- GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
- GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
- GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
- GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉
如上所示,GPIO具有8钟模式,不同的模式在不同场景下使用。同时对于这些模式,有多种速度可选(低速,中速,快速,高速)。同时这些定义在GPIO的结构体里面有具体体现。
上图是GPIO的框图,下文将从这里入手,逐步分析GPIO的8种模式
简单介绍
- 保护二极管(VDD_FF,VSS):当不正常的电压进入时,这两个的二极管导通,避免芯片烧毁。
- 上拉、下拉电阻:控制默认的引脚电压。
- P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式
- TTL施密特触发器:电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;同时具备将模拟信号转换为数字信号的功能,同时也是TTL协议。
- 扩展部分
这是施密特触发器的原理图
这是对应的电压转换图
由此可以知道,使用施密特触发器的根本原因是,它可以有效地避免杂波干扰,因为这个电路如果想让输出电压改变,需要付出的代价更大,例如有高电平变为低电平,则需要电压比VTL更小,否则无法改变。
- 扩展部分
GPIO的八种工作模式剖析
-
浮空输入模式
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。MCU直接读取I/O口电平。浮空最大的特点就是电压的不确定性,它可能是0V,页可能是VCC,还可能是介于两者之间的某个值(最有可能) 浮空一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响。 -
上拉输入模式
IO内部接上拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平 如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平。- 扩展部分
在不学习院里的情况下,我们第一次接触上拉电阻是在学习IIC通信协议的时候,由于IIC通信协议的问题,我们通常采用上拉电阻加上软件IIC的模式来实现IIC通信协议,那个外部接入的上拉电阻一般是4.7KΩ,但是在这里接触到的上拉电阻是30~50kΩ,同时STM32的内部上拉是“弱上拉”,上拉电流很弱,外加上拉电阻就是为了分担电流。因为MCU的输入电流最大为150mA,所以用外部上拉电阻进行分担。
- 扩展部分
-
下拉输入模式
IO内部接下拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平 如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平 -
模拟输入模式
当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态。当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式, -
开漏输出模式(带上拉或者下拉)
在开漏输出模式时,只有N-MOS管工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定 如果没有上拉或者下拉 IO口就处于悬空状态并且此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。,I/O口的电平不一定是输出的电平 -
推挽输出模式(带上拉或者下拉)
在推挽输出模式时,N-MOS管和P-MOS管都工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平, 外部上拉和下拉的作用是控制在没有输出时IO口电平此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。I/O口的电平一定是输出的电平 -
复用开漏输出(带上拉或者下拉)
GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同 -
复用推挽输出(带上拉或者下拉)
GPIO复用为其他外设(如 I2C),输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同
开漏输出和推挽输出的区别
-
推挽输出
可以输出强高低电平,连接数字器件。推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. -
开漏输出
可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平
F4和F1的区别
本质上的区别是F4系列采用了Cortex-M4内核 而F1系列采用Cortex-M3内核
-
F1系列(M3)IO口基本结构:
-
F4系列(M4)IO口基本结构:
F4系列设计的更加高级与人性化,他将外部上下拉电阻转移到了输出/输入驱动器外部,使得输出模式下也可以实现内部上拉与下拉,方便了用户的使用,增加了灵活性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具