STM32:GPIO使用总结
2025-11-05 来源:bilibili
1、GPIO一图概述:

(1)各种接口的措施
1.1 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
1.2 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。
1.3 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。
1.4 GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。
1.5 在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。
1.6 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
1.7 GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。
1.8 所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。
1.9 大电流驱动能力:GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收20mA电流。
1.10 具有独立的唤醒I/O口。
1.11 很多I/O口的复用功能可以重新映射。
1.12 GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。
2、GPIO的8种模式
(1)GPIO_Mode_AIN 模拟输入 (应用ADC模拟输入,或者低功耗下省电)
(2)GPIO_Mode_IN_FLOATING 浮空输入 (浮空就是浮在半空,可以被其他物体拉上或者拉下,可以用于按键输入)
(3)GPIO_Mode_IPD 下拉输入 (IO内部下拉电阻输入)
(4)GPIO_Mode_IPU 上拉输入 (IO内部上拉电阻输入)
(5)GPIO_Mode_Out_OD 开漏输出(开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行)
(6)GPIO_Mode_Out_PP 推挽输出 (推挽就是有推有拉电平都是确定的,不需要上拉和下拉,IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的 )
(7)GPIO_Mode_AF_OD 复用开漏输出(片内外设功能(I2C的SCL,SDA))
(8)GPIO_Mode_AF_PP 复用推挽输出 (片内外设功能(TX1,MOSI,MISO.SCK.SS))
模式7和模式8需根据具体的复用功能决定。
2、专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。
3、每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。
4、I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。
2.1 I/O初始化配置
GPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);
//使能GPIOB ,GPIOC 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 |GPIO_Pin_6; //设置对应引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //工作速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //PB5 PB6设置生效
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //设置对应引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOC, &GPIO_InitStructure); //PC8设置生效
}
2.2 I/O使用
2.2.1 设置
GPIO_SetBits(GPIOB, GPIO_Pin_5); //PB5置1
GPIO_ResetBits(GPIOB, GPIO_Pin_6); //PB6置0
2.2.2 输入引脚读取
GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//读取PC8 返回0 1
2.3 I/O模式
GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14,//开漏输出
GPIO_Mode_Out_PP = 0x10, //推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出
GPIO_Mode_AF_PP = 0x18 //复用推挽输出
3、GPIO使用步骤
3.1. 使能GPIO对应的外设时钟
例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC , ENABLE);
3.2 声明一个GPIO_InitStructure结构体
GPIO_InitTypeDef GPIO_InitStructure;
3.3 选择待设置的GPIO管脚
例如://选择待设置的GPIO第7、8、9管脚位 ,中间加“|”符号
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9;
3.4 设置选中GPIO管脚的速率
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//最高速率2MHz
3.5 设置选中GPIO管脚的模式
例如://设置选中GPIO管脚的模式为开漏输出模式
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_OD;
3.6 根据GPIO_InitStructure中指定的参数初始化外设GPIOX
GPIO_Init(GPIOC,&GPIO_InitStructure);
3.7 其他应用
例: 将端口GPIOA的第10、15脚置1(高电平)
GPIO_SetBits(GPIOA,GPIO_Pin_10| GPIO_Pin_15);
例:将端口GPIOA的第10、15脚置0(低电平)
GPIO_ResetBits(GPIOA,GPIO_Pin_10| GPIO_Pin_15);
4、GPIO操作说明
4.1 库函数: 函数GPIO_DeInit
功能描述:将外设GPIOx寄存器重设为缺省值
GPIO_DeInit(GPIOA);
4.2 函数GPIO_AFIODeInit
功能描述:将复用功能(重映射事件控制和EXTI设置)重设为缺省值
例:
GPIO_AFIODeInit();
4.3 函数GPIO_Init
功能描述:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器
例:
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
4.3.1 GPIO_InitTypeDefstructure
GPIO_InitTypeDef定义于文件“stm32f10x_gpio.h”:
typedef struct
{
u16GPIO_Pin;
GPIOSpeed_TypeDefGPIO_Speed;
GPIOMode_TypeDefGPIO_Mode;
}GPIO_InitTypeDef;
4.3.2 GPIO_Pin
该参数选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚。可以使用下表中的任意组合。
GPIO_Pin_None: 无管脚被选中
GPIO_Pin_x: 选中管脚x(0--15)
GPIO_Pin_All: 选中全部管脚
4.3.3 GPIO_Speed
用以设置选中管脚的速率。
GPIO_Speed_10MHz: 最高输出速率10MHz
GPIO_Speed_2MHz: 最高输出速率2MHz
GPIO_Speed_50MHz: 最高输出速率50MHz
4.3.4 GPIO_Mode
用以设置选中管脚的工作状态。
GPIO_Mode_AIN: 模拟输入
GPIO_Mode_IN_FLOATING: 浮空输入
GPIO_Mode_IPD: 下拉输入
GPIO_Mode_IPU: 上 拉输入
GPIO_Mode_Out_OD: 开漏输出
GPIO_Mode_Out_PP: 推挽输出
GPIO_Mode_AF_OD: 复用开漏输出
GPIO_Mode_AF_PP: 复用推挽输出
4.4 函数GPIO_StructInit
功能描述:把GPIO_InitStruct中的每一个参数按缺省值填入 例:
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStruct:
GPIO_Pin:GPIO_Pin_All
GPIO_Speed:GPIO_Speed_2MHz
GPIO_Mode:GPIO_Mode_IN_FLOATING
4.5 函数GPIO_ReadInputDataBit
功能描述:读取指定端口管脚的输入
例:
u8 ReadValue;
ReadValue= GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
函数原型:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
4.6 函数GPIO_ReadInputData
功能描述:读取指定的GPIO端口输入
例:
u16 ReadValue;
ReadValue= GPIO_ReadInputData(GPIOC);
函数原型:
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
4.7 函数GPIO_ReadOutputDataBit
功能描述:读取指定端口管脚的输出
例:
u8 ReadValue;
ReadValue= GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7);
函数原型:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
4.8 函数GPIO_ReadOutputData
功能描述:读取指定的GPIO端口输出
例:
u16 ReadValue;
ReadValue= GPIO_ReadOutputData(GPIOC);
函数原型:
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
4.9 函数GPIO_SetBits
功能描述:置位指定的数据端口位
例: 将端口GPIOA的第10、15脚置1(高电平)
GPIO_SetBits(GPIOA,GPIO_Pin_10 | GPIO_Pin_15);
函数原型:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
4.10 函数GPIO_ResetBits
功能描述:清除指定的数据端口位
例:将端口GPIOA的第10、15脚置0(低电平)
GPIO_ResetBits(GPIOA,GPIO_Pin_10 | GPIO_Pin_15);
函数原型:
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
4.11 函数GPIO_WriteBit
功能描述:设置或者清除指定的数据端口位
例:
GPIO_WriteBit(GPIOA,GPIO_Pin_15, Bit_SET);
函数原型:
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
4.12 函数GPIO_Write
功能描述:向指定GPIO数据端口写入数据
例:
GPIO_Write(GPIOA,0x1101);//0x1101:十六进制端口数据寄存器值
函数原型:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
4.13 函数GPIO_PinLockConfig
功能描述:锁定GPIO管脚设置寄存器
例:
GPIO_PinLockConfig(GPIOA,GPIO_Pin_0|GPIO_Pin_1);
4.14 函数GPIO_EventOutputConfig
功能描述:选择GPIO管脚用作事件输出
例:
GPIO_EventOutputConfig(GPIO_PortSourceGPIOE,GPIO_PinSource5);
GPIO_PortSource
GPIO_PortSource用以选择用作事件输出的GPIO端口。
4.15 函数GPIO_EventOutputCmd
功能描述:使能或者失能事件输出
例:
GPIO_EventOutputConfig(GPIO_PortSourceGPIOC,GPIO_PinSource6);
GPIO_EventOutputCmd(ENABLE);
4.16 函数GPIO_PinRemapConfig
功能描述:改变指定管脚的映射
例:
GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE);
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




