STM32 GPIO HAL库常用函数

GPIO是通用输入输出端口(General-purpose input/output)的英文简写,是所有的微控制器必不可少的外设之一,可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功能。引脚电平:0V~3.3V,部分引脚可容忍5V。

|--------|------|------------------------------------------------------------------------|
| 浮空输入 | 数字输入 | IO的电平状态是不确定的,完全由外部输入决定 |
| 上拉输入 | 数字输入 | IO口在无输入的情况下,保持高电平 |
| 下拉输入 | 数字输入 | IO口在无输入的情况下,保持低电平 |
| 模拟输入 | 模拟输入 | 输入信号不经施密特触发器直接接入,输入信号为模拟量,其余输入方式输入数字量 |
| 开漏输出 | 数字输出 | 只能输出低电平 |
| 推挽输出 | 数字输出 | 可以输出高、低电平 |
| 复用开漏输出 | 数字输出 | 输出低电平 |
| 复用推挽输出 | 数字输出 | 此时 IO 受内部外设控制,比如定时器的 PWM,比如 SPI 的 MOSI ,MISO 等。 而普通的推挽输出,则 IO 受 ODR 控制 |

GPIO常用HAL库函数

HAL_GPIO_Init

初始化GPIO引脚,配置模式、上下拉、速度等参数。

c 复制代码
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
 

内部通过结构体来配置

  • Pin : 指定需要初始化的 GPIO 引脚,可以是单个引脚或组合(如 GPIO_PIN_0 | GPIO_PIN_1)。
  • Mode : 设置引脚模式,包括输入、输出、复用功能或模拟模式(如 GPIO_MODE_OUTPUT_PP 推挽输出)。
  • Pull : 配置上拉/下拉电阻,可选无上拉下拉(GPIO_NOPULL)、上拉(GPIO_PULLUP)或下拉(GPIO_PULLDOWN)。
  • Speed : 定义引脚输出速度,如低速(GPIO_SPEED_FREQ_LOW)、中速或高速。
  • Alternate: 当引脚用于复用功能时,指定具体的复用功能编号(如 USART、SPI 等)。
c 复制代码
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;                // 选择引脚5
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;       // 推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL;               // 无上拉下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;     // 高速模式
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);           // 初始化GPIOA
 

HAL_GPIO_ReadPin

读取指定引脚的电平状态。

c 复制代码
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
 

返回值为GPIO_PIN_SET(高电平)GPIO_PIN_RESET(低电平)

HAL_GPIO_WritePin

设置指定引脚输出高电平或低电平。

c 复制代码
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
 
  • PinStateGPIO_PIN_SET(高电平)或GPIO_PIN_RESET(低电平)。

​​​HAL_GPIO_TogglePin

翻转指定引脚的电平状态(高变低或低变高)

c 复制代码
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
 

​​HAL_GPIO_EXTI_Callback

外部中断回调函数,用户需重写此函数实现中断处理逻辑。

c 复制代码
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
 

需在stm32xx_it.c中调用HAL_GPIO_EXTI_IRQHandler触发此回调。

HAL_GPIO_EXTI_IRQHandler

处理外部中断请求,清除中断标志并调用回调函数。

c 复制代码
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
 

配置示例

以下代码演示如何配置PA5为推挽输出并控制电平:

c 复制代码
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);  // 输出高电平
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);               // 翻转电平
 

注意事项

  1. 时钟使能 :使用GPIO前需通过__HAL_RCC_GPIOx_CLK_ENABLE()开启端口时钟。
  2. 中断优先级:若使用外部中断,需配置NVIC优先级。
  3. 弱函数HAL_GPIO_EXTI_Callback是弱定义函数,用户需在代码中重新实现。

串联示例使用

c 复制代码
#include "stm32f4xx_hal.h"

/* 函数声明 */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

  while (1)
  {
    // 使用WritePin点亮LED
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
    HAL_Delay(500);
    
    // 使用TogglePin切换LED状态
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    HAL_Delay(500);
  }
}

/* 外部中断处理函数 */
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_13)
  {
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  }
}

/* 外部中断回调函数 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_13)
  {
    // 按键按下时切换LED
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  }
}

/* GPIO初始化函数 */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();

  /* LED引脚配置 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* 按键引脚配置 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;  // 上升沿触发中断
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /* 中断优先级配置 */
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
 
复制代码
相关推荐
LCMICRO-133108477465 小时前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc
逐步前行13 小时前
STM32_TIM_寄存器操作
stm32·单片机·嵌入式硬件
0南城逆流013 小时前
【STM32】知识点介绍七:PWM功能
stm32·单片机·嵌入式硬件
智者知已应修善业14 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
dashizhi201514 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
我是一棵无人问荆的小草14 小时前
单片机通电后延迟启动策略
单片机·嵌入式硬件
日更嵌入式的打工仔15 小时前
UART RX为什么要上拉
单片机
三佛科技-1873661339718 小时前
FT32F030F6AP7高性能32位RISC内核MCU解析(兼容STM32F030K6TP7)
stm32·单片机·嵌入式硬件
LCMICRO-1331084774618 小时前
长芯微LDC90810完全P2P替代ADC128D818,是一款八通道系统监控器,专为监控复杂系统状态而设计。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换芯片adc
嵌入式老菜鸟qq12524277319 小时前
关于S2-LP休眠
单片机·嵌入式硬件·mcu·射频工程