配置GPIO
工程配置这里不赘述了
STM32HAL库配置
我们用右边图像化配置GPIO

灰色的就是没有配置的GPIO
假设我们要配置PC13GPIO_Input:是配置输入GPIO_Output:是配置输出
配置GPIO输出
我们点击GPIO_Output

然后选择你要的GPIO
会发现红色框那边有几个参数可以进行配置
| 配置大类 | 可选选项 |
|---|---|
| GPIO output level(初始输出电平) | Low High |
| GPIO mode(GPIO 输出模式,核心选型) | Output Push Pull(推挽输出) Output Open Drain(开漏输出) |
| GPIO Pull-up/Pull-down(上下拉电阻配置) | No pull-up and no pull-down(无上下拉) Pull-up(上拉) Pull-down(下拉) |
| Maximum output speed(最大输出速度) | Low(低速,通常 2MHz/10MHz) Medium(中速,通常 10MHz/50MHz) High(高速,通常 50MHz/100MHz) Very High(超高速,通常 100MHz/200MHz+) |
| User Label(用户标签) | 自定义英文 / 下划线文本 |
配置GPIO输入
假如我们拿GPIO PB14作为按键输入
我们选择GPIO_Input

然后选择配置的引脚,我们这边选择PB14
| 配置项 | 可选值 |
|---|---|
| GPIO mode (GPIO工作模式) |
Input mode (输入模式) |
| GPIO Pull-up/Pull-down (上下拉电阻配置) |
No pull-up and no pull-down (无上下拉) Pull-up (上拉) Pull-down (下拉) |
| User Label (用户标签) |
自定义英文/下划线文本 |
工程里面如何使用
然后我们打开输入完的工程
我们在main.c里面可以找到初始化GPIO的函数

我们在MX_GPIO_Init()里面可以看到GPIO的配置信息
初始化时钟
1 | __HAL_RCC_GPIO-x_CLK_ENABLE() |
-x是用来选择初始化哪组GPIO
初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0} // 定义GPIO初始化结构体,全部初始化为0,避免随机值导致配置异常
| 配置大类 | 可选值 | 说明 |
|---|---|---|
| Pin(引脚选择) | GPIO_PIN_0 ~ GPIO_PIN_15 GPIO_PIN_ALL GPIO_PIN_0 | GPIO_PIN_1 |
单个引脚选择(对应 Pin0 ~ Pin15) 选中端口的所有引脚 多个引脚组合选择(使用或运算 | 连接) |
| Mode(工作模式) | GPIO_MODE_INPUT GPIO_MODE_OUTPUT_PP GPIO_MODE_OUTPUT_OD GPIO_MODE_AF_PP GPIO_MODE_AF_OD GPIO_MODE_ANALOG |
输入模式(用于检测外部电平,如按键) 推挽输出(用于输出高低电平,如LED) 开漏输出(需外接上拉电阻,可用于电平转换等) 复用推挽输出(用于外设复用,如UART_TX、SPI_MOSI) 复用开漏输出(用于外设复用,如I2C_SCL、I2C_SDA) 模拟模式(用于ADC采集、DAC输出等模拟信号场景) |
| Pull(上下拉配置) | GPIO_NOPULL GPIO_PULLUP GPIO_PULLDOWN |
无上下拉(浮空状态,输入模式下需外部接上下拉电阻避免干扰) 上拉(引脚默认拉至高电平) 下拉(引脚默认拉至低电平) |
| Speed(输出速度) | GPIO_SPEED_FREQ_LOW GPIO_SPEED_FREQ_MEDIUM GPIO_SPEED_FREQ_HIGH GPIO_SPEED_FREQ_VERY_HIGH |
低速(最大约2MHz,适合LED、普通按键等低速场景) 中速(最大约10MHz,适合一般数字信号、普通外设通信) 高速(最大约50MHz,适合高速外设复用、PWM输出等) 超高速(最大约100MHz,仅高端型号如F4/F7/H7系列支持,用于高速并口等极限场景) |
1 | HAL_GPIO_Init(GPIO-X, &GPIO_InitStruct); //初始化所设置的引脚 |
-X是初始化引脚组为ABCD等组
GPIO_InitStruct 是结构体
用于初始化
使用的函数
设置电平
1 | void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); |
| 参数 | 含义 | 可选值 |
|---|---|---|
| GPIOx | 引脚所属端口 | GPIOA、GPIOB、GPIOC 等 |
| GPIO_Pin | 引脚编号 | GPIO_PIN_0 ~ GPIO_PIN_15 |
| PinState | 输出电平 | GPIO_PIN_SET = 高电平GPIO_PIN_RESET = 低电平 |
电平翻转
1 | void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); |
| 参数 | 含义 | 可选值 |
|---|---|---|
| GPIOx | 引脚所属端口 | GPIOA、GPIOB、GPIOC 等 |
| GPIO_Pin | 引脚编号 | GPIO_PIN_0 ~ GPIO_PIN_15 |
读取电平
1 | GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); |
| 项目 | 说明 | 可选值 |
|---|---|---|
| 参数 1:GPIOx | 引脚所属端口 | GPIOA、GPIOB、GPIOC、GPIOD 等(对应芯片实际端口) |
| 参数 2:GPIO_Pin | 引脚编号 | GPIO_PIN_0 ~ GPIO_PIN_15 |
| 返回值:GPIO_PinState | 读取到的引脚电平 | GPIO_PIN_SET = 高电平GPIO_PIN_RESET = 低电平 |
延迟
HAL里面他自带了延迟函数
1 | __weak void HAL_Delay(__IO uint32_t Delay) |
可以看到,HAL_Delay()是一个虚函数,这表明用户可以在其它的位置重定义,如果这样,新的函数将会取代它,编译过程中也不会出现重定义的错误。该函数只有一个32位的参数,明显的,这个形参指定了延时的时间,它的单位是毫秒(ms)。
HAL_Delay依赖SysTick系统滴答定时器实现不能在中断里面使用
| 项目 | 说明 | 可选值 |
|---|---|---|
| __IO uint32_t Delay | 输入要延迟的ms | 延时的毫秒数 |