1.什么是GPIO
General Purpose Input Output,即通用输入输出端口,简称GPIO,作用是负责采集外部器件的信息或者控制外部器件工作,即输入输出。
2.STM32 GPIO简介
2.1.GPIO特点
- 不同型号,IO口数量可能不一样,可通过选型手册快速查询
- 快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)
- 每个IO口都可以做中断
- 支持8种工作模式
2.2.GPIO电气特性
-
STM32工作电压范围——2 V ≤ VDD ≤ 3.6 V
-
GPIO识别电压范围——COMS端口-0.3V ≤ VIL ≤ 1.164V,1.833V ≤ VIH ≤ 3.6V,部分兼容TTL
-
GPIO输出电流——单个IO,最大25mA
详情参考STM32的数据手册
2.3.GPIO引脚分布
STM32引脚类型:电源引脚、晶振引脚、复位引脚、下载引脚、BOOT引脚、GPIO引脚
IO引脚分布特点:按组存在、组数视芯片而定、每组最多16个IO引脚
3.IO端口基本结构介绍
-
F1系列IO端口基本结构
① 保护二极管
② 内部上拉、下拉电阻
③ 施密特触发器
④ P-MOS & N-MOS管
-
F4/F7/H7系列IO端口基本结构
-
施密特触发器:施密特触发器就是一种整形电路,可以将非标准方波,整形成方波
-
P-MOS & N-MOS管:MOS管是压控型元件,通过控制栅源电压( Vgs )来实现导通或关闭
4.GPIO的八种模式分析
模式 | 特点及应用 |
---|---|
浮空输入 | 输入用,完全浮空,状态不定 |
上拉输入 | 输入用,用内部上拉,默认是高电平 |
下拉输入 | 输入用,用内部下拉,默认是低电平 |
模拟功能 | ADC、DAC |
开漏输出 | 软件IIC的SDA、SCL等 |
推挽输出 | 驱动能力强,25mA(max),通用输出 |
开漏复用 | 片上外设功能(硬件IIC 的SDA、SCL引脚等) |
推挽复用 | 片上外设功能(SPI 的SCK、MISO、MOSI引脚等 |
4.1.浮空输入
4.2.上拉输入
4.3.下拉输入
4.4.模拟功能
4.5.开漏输出
4.6.推挽输出
4.7.开漏复用
4.8.推挽复用
4.9.F4/F7/H7系列和F1系列的GPIO差异点
- F1在输出模式,禁止使用内部上下拉,F4/F7/H7在输出模式,可以使用内部上下拉
- 不同系列IO翻转速度可能不同
【STM32能输出5V的电平吗?——可以,兼容5V的引脚可以】
5.GPIO寄存器介绍
在F1系列和F4/F7/F7系列的GPIO中,选择GPIO模式的寄存器不同,控制输入输出的寄存器相同
5.1.F1/F4/F7/H7相同GPIO寄存器
- 端口输入数据寄存器IDR——用于判断IO引脚的电平
- 端口输出数据寄存器ODR——用于设置IO引脚输出的电平
- 端口位设置/清除寄存器BSRR——用于设置ODR寄存器
5.2.F1系列特有GPIO寄存器
- 端口配置低/高寄存器CRL/CRH——设置工作模式、输出速度
5.3.F4/F7/H7系列特有GPIO寄存器
- GPIO 端口模式寄存器MODER——用于设置模式
- GPIO 端口输出类型寄存器OTYPER——用于设置输出类型
- GPIO 端口输出速度寄存器OSPEEDR——用于设置IO的输出速度
- GPIO 端口上拉/下拉寄存器(PUPDR)用于设置上拉/下拉电阻
5.4.F1系列与F4/F7/H7系列工作模式配置
- F1系列
输入上拉/下拉电阻通过ODR寄存器来设置
- F4/F7/H7系列
5.5.ODR和BSRR寄存器控制输出的区别
ST官方给的答案:使用ODR,在读和修改访问之间产生中断时,可能会发生风险;BSRR无风险。建议使用BSRR控制输出
ODR修改:读->改->写
GPIOB->ODR |= 1 << 3; /* PB3 = 1 */
BSRR修改:写
GPIOB->BSRR = 0x00000008; /* PB3 = 1 */
6.通用外设驱动模型(四步法)
7.GPIO配置步骤
-
使能时钟 __HAL_RCC_GPIOx_CLK_ENABLE()
-
设置工作模式 HAL_GPIO_Init()
-
设置输出状态(可选) HAL_GPIO_WritePin() 、HAL_GPIO_TogglePin()
-
读取输入状态(可选) HAL_GPIO_ReadPin()
-
关键结构体
// F1
typedef struct
{ uint32_t Pin; /* 引脚号 */ uint32_t Mode; /* 模式设置 */ uint32_t Pull; /* 上拉下拉设置 */ uint32_t Speed; /* 速度设置 */
} GPIO_InitTypeDef;
// F4/F7/H7
typedef struct
{ uint32_t Pin; /* 引脚号 */ uint32_t Mode; /* 模式设置 */ uint32_t Pull; /* 上拉下拉设置 */ uint32_t Speed; /* 速度设置 */uint32_t Alternate; /* 复用功能 */
} GPIO_InitTypeDef;
8.编程实战:点亮一个LED灯/跑马灯
分析IO输出模式——推挽输出
9.编程实战:通过一个按键控制一个LED灯亮灭
【编程实战代码暂不贴出】