STM32教程--- GPIO的输入输出
GPIO,即General Purpose Input Output。是一种通用的数字输入/输出端口。在嵌入式系统中,GPIO被设计为灵活的引脚,可以被配置为输入或输出,以满足不同的应用需求。
·
一、STM32的GPIO简介
1、GPIO简介
GPIO,即General Purpose Input Output。是一种通用的数字输入/输出端口。在嵌入式系统中,GPIO被设计为灵活的引脚,可以被配置为输入或输出,以满足不同的应用需求。
2、STM32的GPIO
对于不同的信号STM32芯片,有不同的GPIO数量:

作者使用的是正点原子的探索者V2开发板,使用的芯片是STM32F407ZGT6。后续都以F4为例。
根据STM32的I/O端口特性可通过软件将端口配置为多种模式:
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟功能
- 具有上拉或下拉功能的开漏输出
- 具有上拉或下拉功能的推挽输出
- 具有上拉或下拉功能的复用功能推挽
- 具有上拉或下拉功能的复用功能开漏
3、8种模式对比
| GPIO八种模式 | 特点及应用 |
| 输入浮空 | 输入用,完全浮空,状态不定 |
| 输入上拉 | 输入用,用内部上拉,默认是高电平 |
| 输入下拉 | 输入用,用内部下拉,默认是低电平 |
| 模拟功能 | ADC、DAC |
| 开漏输出 | 软件IIC的SDA、SCL等 |
| 推挽输出 | 驱动能力强,25mA(max),通用输出 |
| 开漏式复用功能 | 片上外设功能(硬件IIC 的SDA、SCL引脚等) |
| 推挽式复用功能 | 片上外设功能(SPI的SCK、MISO、MOSI引脚等) |
4、STM32 5V容忍I/O端口结构图

二、GPIO配置流程
1、开启GPIO时钟
//其中GPIOx改为对应的GPIO PORT,例如__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOx_CLK_ENABLE();
2、初始化GPIO
/* 在stm32f4xx_hal_gpio.h中有如下结构体定义:用来初始化GPIO
typedef struct {
uint32_t Pin; //引脚号
uint32_t Mode; //模式设置
uint32_t Pull; //上下拉设置
uint32_t Speed; //输出速度
uint32_t Alternate; //复用功能
} GPIO_InitTypeDef;
*/
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_9; //GPIO引脚号,GPIO pins
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //模式
GPIO_InitStruct.Pull = GPIO_NOPULL; //上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //GPIO翻转速度
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); //初始化GPIO
3、读/写GPIO
//写GPIO引脚电平,
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin,
GPIO_PinState PinState) ;
//读取GPIO引脚电平值
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
//GPIO电平翻转
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
三、实战编程
1、GPIO输出
要求:实现LED每500ms闪烁一次。正点原子探索者开发板的LED0接PF9引脚。
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOF_CLK_ENABLE();
/*Configure GPIO pin : PF9*/
GPIO_InitStruct.Pin = GPIO_PIN_9; //PF9
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; //不上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //低速模式
HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET); //默认熄灭LED
while(1){
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9); //电平翻转
HAL_Delay(500);
}
2、GPIO输入
要求:按键按下,LED0状态改变,即PF9电平翻转
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOF_CLK_ENABLE();
/*Configure GPIO pin : PA0*/
GPIO_InitStruct.Pin = GPIO_PIN_0; //PA0
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStruct.Pull = GPIO_PULLDOWN; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //低速模式
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
u8 state = 0; //标记按键是否按下
while(1){
if(state == 0){
if(HAL_GPIO_ReaGPIO_PIN_SETdPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET){
HAL_Delay(50); //延时50ms消抖
if(HAL_GPIO_ReaGPIO_PIN_SETdPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET){
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9); //电平翻转
state = 1; //标记按键按下
}
}
}else {
if(HAL_GPIO_ReaGPIO_PIN_SETdPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){
HAL_Delay(50); //延时50ms消抖
if(HAL_GPIO_ReaGPIO_PIN_SETdPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){
state = 0; //标记按键释放
}
}
}
更多推荐



所有评论(0)