gpio及通用输入输出端口;负责输入输出功能。按组分配,每组16个。stm32f103zet6 有A~G七组gpio口。注意:有FT标志,标识可容忍5v;
GPIO功能,结构
- 基本结构
①保护二极管
当引脚输入电压高于VDD时,上面导通;当引脚输入低于Vss时,下面导通。
②上拉下拉电阻
VDD上拉,Vss下拉,如果都不开,为浮空;这种上拉下拉为弱拉,不会影响输入;
③施密特触发器
有一个高阈值和低阈值,高于高阈值时,输出1,低于低阈值时,输出0,高低阈值之间,不变化。
④P-MOS管和N-MOS管
p-mos为积极管,栅极输入1,不导通;输入0导通;
n-mos为消极管,栅极输入0,不导通;输入1导通。 - gpio八种工作模式
输入浮空模式
上拉/下拉电阻为断开状态,施密特触发器打开,输出被禁止。
输入上拉模式
上拉电阻导通,施密特触发器打开,输出被禁止。
输入下拉模式
下拉电阻导通,施密特触发器打开,输出被禁止。
模拟功能
上下拉电阻断开,施密特触发器关闭,双 MOS 管也关闭。
开漏输出模式
PMOS管栅极始终连接VDD,所以PMOS一直处于阻断状态;NMOS管栅极受输出寄存器控制,当输出1,通过输出控制后为0,则NMOS管不导通,IO口处于高阻态状态(PMOS和NMOS都截断状态);当输出0,通过输出控制后为1,则NMOS管导通,使得IO口连接到Vss,即输出低电平。
在开漏输出模式下,施密特触发器是工作的,所以 IO 口引脚的电平状态会被采集到输入数据寄存器中
推挽输出模式
当输出0,通过输出控制取反为1,则PMOS截断,NMOS导通,IO口接到Vss,则输出0;当输出1,通过输出控制取反为0,则PMOS导通,NMOS截断,IO口连接到VDD,则输出1;
在推挽输出模式下,施密特触发器也是打开的,我们可以读取 IO 口的电平状态。
开漏式复用功能
一个io口可以是通用io口功能,也可以是其它外设的特殊功能引脚;当选择复用功能时,引脚状态由对应外设控制。
开漏式复用功能模式下,施密特触发器也是打开的,我们可以读取 IO 口的电平状
态
推挽式复用功能
和开漏式复用功能类似
GPIO 寄存器
2 个 32 位端口配置寄存器(CRL 和 CRH)
2 个 32 位端口数据寄存器(IDR 和 ODR)
1 个 32 位端口置位/复位寄存器(BSRR)
1 个 16 位端口复位寄存器(BRR)
1 个 32 位端口锁定寄存器 (LCKR)
- 端口配置寄存器(GPIOx_CRL 和 GPIOx_CRH)
- 端口输出数据寄存器(GPIOx_ODR)
该寄存器用于控制 GPIOx 的输出高电平或者低电平;
- 端口置位/复位寄存器(GPIOx_BSRR)
该寄存器也用于控制 GPIOx 的输出高电平或者低电平;
BSRR寄存器改变引脚状态时,不会被中断打断,而ODR有被打断的风险。
- 端口输入数据寄存器(GPIOx_IDR)
GPIO的HAL库函数
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); //外设 GPIO 的初始化函数
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //GPIO 口的写引脚函数,通过 BSRR 寄存器复位或者置位操作
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); //GPIO 口的电平翻转函数,通过 BSRR 寄存器复位或者置位操作
//等等