一、STM32的GPIO简介

1、GPIO简介

        GPIO,即General Purpose Input Output。是一种通用的数字输入/输出端口。在嵌入式系统中,GPIO被设计为灵活的引脚,可以被配置为输入或输出,以满足不同的应用需求。

2、STM32的GPIO

        对于不同的信号STM32芯片,有不同的GPIO数量:

        作者使用的是正点原子的探索者V2开发板,使用的芯片是STM32F407ZGT6。后续都以F4为例。

   根据STM32的I/O端口特性可通过软件将端口配置为多种模式:

  1. 输入浮空
  2. 输入上拉
  3.  输入下拉
  4. 模拟功能
  5. 具有上拉或下拉功能的开漏输出
  6. 具有上拉或下拉功能的推挽输出
  7. 具有上拉或下拉功能的复用功能推挽
  8. 具有上拉或下拉功能的复用功能开漏

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;    //标记按键释放
            }
        }
    
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐