STM32_GPIO
1、STM32 GPIO简介
什么是GPIO?
General Purpose Input Output,即通用输入输出端口,简称GPIO
作用:负责采集为外部期间的信息(输入)或者控制外部器件工作(输出)
-
特点
- 按组存在,组数视芯片而定,每组最多16个IO引脚
- 快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以达到50MHz)
- 每个IO口都可以做中断
- 支持8种工作模式
-
电气特性
- STM32工作电压范围
2V <= VDD <= 3.6V,通常为3.3V
-
GPIO识别电压范围
CMOS端口
0:-0.3V <= VIL <= 1.164v
1:1.833V <= VIH <= 3.6v
通常为3.3V,带FT标志的可兼容5V
-
GPIO输出电流
单个IO,最大25mA
总和不能超过芯片总输入输出电流
1.1 IO端口基本结构介绍
-
保护二极管
-
钳位电路
-
输入电压 > VDD,上面的二极管导通
-
输入电压 < VSS,下面的二极管导通
-
-
上下拉电阻
- 阻值:30 ~ 50KΩ
-
施密特触发器
- 可将非标准方波(如:正弦波)整形成方波
- 输入电压 > 正向阈值电压,输出高电平
- 输入电压 < 负向阈值电压,输出低电平
- 负向阈值电压 < 输入电压 < 正向阈值电压,输出不变
-
P-MOS管和 N-MOS管
- MOS管通过控制栅极电压(Vgs)实现导通或关闭
- Vgs < 0,P导通
- Vgs > 0,N导通
1.2 GPIO的八种模式分析
GPIO八种工作模式 | 特点及应用 |
---|---|
输入浮空 | 输入用,完全浮空,状态不定 |
输入上拉 | 输入用,用内部上拉,默认是高电平 |
输入下拉 | 输入用,用内部下拉,默认是低电平 |
模拟功能 | ADC、DAC |
开漏输出 | 软件I2C的SDL、SCL等 |
推挽输出 | 驱动能力强,25mA(max),通用输出 |
开漏式复用功能 | 片上外设功能(硬件I2C的SDI、SCL引脚等) |
推挽式复用功能 | 片上外设功能(SPI的SCK、MISO、MOSI引脚等) |
-
输入浮空
- 上拉电阻关闭
- 下拉电阻关闭
- 施密特触发器打开
- MOS管均不导通
- IO口为高阻态时,电平由外部环境决定
-
输入上拉
- 上拉电阻打开
- 下拉电阻关闭
- 施密特触发器打开
- MOS管均不导通
- IO口为高阻态时,呈现高电平
-
输入下拉
- 上拉电阻关闭
- 下拉电阻打开
- 施密特触发器打开
- MOS管均不导通
- IO口为高阻态时,呈现低电平
-
模拟功能
- 上拉电阻关闭
- 下拉电阻关闭
- 施密特触发器关闭
- MOS管均不导通
- 专门用于模拟信号输入输出
-
开漏输出
- 上拉电阻关闭
- 下拉电阻关闭
- 施密特触发器打开
- P-MOS管**连接输出控制内的VDD**始终不导通
- 往ODR对应位写0,经输出控制内的非门取反,N-MOS管导通;写1,经输出控制内的非门取反,N-MOS管不导通
- 不能输出高电平,必须有外部(或内部)上拉才能输出高电平
-
开漏式复用功能
- 上拉电阻关闭
- 下拉电阻关闭
- 施密特触发器打开
- P-MOS管**连接输出控制内的VDD**始终不导通
- 不能输出高电平,必须有外部(或内部)上拉才能输出高电平
- 由其他外设控制输出
-
推挽输出
- 上拉电阻关闭
- 下拉电阻关闭
- 施密特触发器打开
- 往ODR对应位写0,经输出控制内的非门取反,N-MOS管导通;写1,经输出控制内的非门取反,P-MOS管导通
- 可输出高低电平,驱动能力强
-
推挽式复用功能
- 上拉电阻关闭
- 下拉电阻关闭
- 施密特触发器打开
- 可输出高低电平,驱动能力强
- 由其他外设控制输出
1.3 GPIO寄存器介绍
- GPIO通用寄存器GPIOx_yyy(F1系列)
名称 | 功能 |
---|---|
CRL | 配置工作模式,输出速度 |
CRH | 配置工作模式,输出速度 |
IDR | 输入数据 |
ODR | 输出数据 |
BSRR | 设置ODR寄存器值 |
BRR | F4之后没有这个寄存器,考虑代码兼容性则不建议使用 |
LCKR | 配置锁定,用的不多 |
- GPIO通用寄存器GPIOx_yyy(F4/F7/H7系列)
名称 | 功能 |
---|---|
MODER | 设置模式 |
OTYPER | 设置输出类型 |
OSPEEDR | 设置输出速度 |
PUPDR | 设置上下拉电阻 |
IDR | 输入数据 |
ODR | 输出数据 |
BSRR | 设置ODR寄存器值 |
LCKR | 配置锁定,用的不多 |
使用ODR控制输出,在读和修改访问之间产生中断时,可能会发生风险;BSRR则无风险
ODR修改:读 -> 改 -> 写
BSRR修改: 写
2、程序设计
2.1 通用外设驱动模型(四步法)
- 初始化
- 时钟设置、参数设置、【IO设置、中断设置(开中断、设NVIC)可选】
- 读函数(可选)
- 从外设读取数据(可选)
- 写函数(可选)
- 往外设写入数据(可选)
- 中断服务函数(可选)
- 根据中断标志,处理外设各种中断事务(可选)
GPIO需要实现前三步
2.2 GPIO配置步骤
- 使能时钟
- __HAL_RCC_GPIOx_CLK_ENABLE()
- 设置工作模式
- HAL_GPIO_Init()
- 设置输出状态(可选)
- HAL_GPIO_WritePin()
- HAL_GPIO_TogglePin()
- 读取输入状态(可选)
- HAL_GPIO_ReadPin()
HAL库驱动函数 | 主要寄存器 | 功能 |
---|---|---|
__HAL_RCC_GPIOx_CLK_ENABLE() | RCC_APB2ENR | 开启GPIO时钟 |
HAL_GPIO_Init() | CRL、CRH、ODR | 初始化GPIO |
HAL_GPIO_WritePin() | BSRR | 控制IO输出高/低电平 |
HAL_GPIO_TogglePin() | BSRR | 每次调用IO输出电平翻转一次 |
HAL_GPIO_Init() | CRL、CRH、ODR | 初始化GPIO |
HAL_GPIO_WritePin() | BSRR | 控制IO输出高/低电平 |
HAL_GPIO_TogglePin() | BSRR | 每次调用IO输出电平翻转一次 |
HAL_GPIO_ReadPin() | IDR | 读取IO电平 |