stm32的GPIO端口设置基本介绍

一、GPIO端口设置:

一. HAL_GPIO_Init 函数GPIO初始化,

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

⚫ 函数描述:

用于配置 GPIO 功能模式,还可以设置 EXTI 功能

1、GPIOx是配置是端口号,可以配置以下几种

 GPIOA 到GPIOG、

  1. GPIO_InitTypeDef *GPIO_Init是 GPIO_InitTypeDef 类型的结构体变量,实现以下配置

typedef struct

{

 uint32_t Pin; /* 引脚号 */

 uint32_t Mode; /* 模式设置 */

 uint32_t Pull; /* 上拉下拉设置 */

 uint32_t Speed; /* 速度设置 */

uint32_t Alternate; /* 复用功能 */

} GPIO_InitTypeDef;

其中

(1)Pin; /* 引脚号 */,范围:GPIO_PIN_0 到 GPIO_PIN_15,另外还有 GPIO_PIN_All(选择该端口所有引脚) 和GPIO_PIN_MASK (检测引脚是否有效)可选

(2)Mode; /* 模式设置 */成员 Mode 是 GPIO 的模式选择,有以下选择项:

 GPIO_MODE_INPUT /* 输入模式 */

 GPIO_MODE_OUTPUT_PP /* 推挽输出 */

GPIO_MODE_OUTPUT_OD) /* 开漏输出 */

 GPIO_MODE_AF_PP  /* 推挽式复用 */

 GPIO_MODE_AF_OD  /* 开漏式复用 */

 GPIO_MODE_AF_INPUT 复用功能输入模式

 GPIO_MODE_ANALOG) /* 模拟模式 */

 GPIO_MODE_IT_RISING  /* 外部中断,上升沿触发检测 */

 GPIO_MODE_IT_FALLING /* 外部中断,下降沿触发检测 */

#define GPIO_MODE_IT_RISING_FALLING /* 外部中断,上升和下降双沿触发检测 */

#define GPIO_MODE_EVT_RISING /* 外部事件,上升沿触发检测 */

#define GPIO_MODE_EVT_FALLING  /* 外部事件,下降沿触发检测 */

GPIO_MODE_EVT_RISING_FALLING/* 外部事件,上升和下降双沿触发检测 */

(3)成员 Pull 用于配置上下拉电阻

 GPIO_NOPULL /* 无上下拉 */

 GPIO_PULLUP /* 上拉 */

 GPIO_PULLDOWN  /* 下拉 */

(4)成员 Speed 用于配置 GPIO 的速度

 GPIO_SPEED_FREQ_LOW/* 低速 */

GPIO_SPEED_FREQ_MEDIUM /* 中速 */

GPIO_SPEED_FREQ_HIGH /* 高速 */

二、读写,翻转函数(配合上面GPIO使用)

(1)写函数

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState);

形参 1 是端口号,形参 2 是引脚号,形参 3 是要设置输出的状态,是枚举型有两个选择:GPIO_PIN_SET 表示高电平,GPIO_PIN_RESET 表示低电平。

(2)写函数

void HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);

形参 1 是端口号,形参 2 是引脚号,

(2)电平翻转函数

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);

  • GPIO 输出配置步骤
    1. 在对应.h文件中设置宏定义:

    #define LED1_GPIO_PORT GPIOF

    #define LED1_GPIO_PIN GPIO_PIN_10

    #define LED1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOF_CLK_ENABLE(); }while(0)

    1. 在对应.h文件中设置端口操作(读写高低电平)宏定义:

    #define LED1(x) do{ x ? \

     HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) : \

     HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET);\

     }while(0) /*根据 LED1(X)的x置1或置0 选择不同高低电平 */

    读或翻转使用下面格式:

    #define LED0_TOGGLE() do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT,

    LED0_GPIO_PIN); }while(0) /* LED0 = !LED0 */

    1. 在.c文件中初始化对应端口

    {

     GPIO_InitTypeDef gpio_init_struct;

     LED0_GPIO_CLK_ENABLE(); /* LED0 时钟使能 */

     LED1_GPIO_CLK_ENABLE(); /* LED1 时钟使能 */

     gpio_init_struct.Pin = LED0_GPIO_PIN; /* LED0 引脚 */

     gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */

     gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */

     gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */

     HAL_GPIO_Init(LED0_GPIO_PORT, &gpio_init_struct); /* 初始化 LED0 引脚 */

    同一端口不同引脚若功能相同可以不用重新定义

     gpio_init_struct.Pin = LED1_GPIO_PIN; /* LED1 引脚 */

     HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct); /* 初始化 LED1 引脚 */

    LED(1)设置开始状态为高电平亮

    }

    1. 在main.c中

    int main(void)

    {

     HAL_Init(); /* 初始化 HAL 库 */

     sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */

     delay_init(168); /* 延时初始化 */

     led_init(); /* 初始化 LED */

     while(1)

     {设置端口需要的程序

     }

    }

    作者:2301_80900531

    物联沃分享整理
    物联沃-IOTWORD物联网 » stm32的GPIO端口设置基本介绍

    发表回复