stm32的GPIO端口设置基本介绍
一、GPIO端口设置:
一. HAL_GPIO_Init 函数GPIO初始化,
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
⚫ 函数描述:
用于配置 GPIO 功能模式,还可以设置 EXTI 功能
1、GPIOx是配置是端口号,可以配置以下几种
GPIOA 到GPIOG、
- 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);
- 在对应.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)
- 在对应.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 */
- 在.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)设置开始状态为高电平亮
}
- 在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