STM32_GPIO_HAL库操作

📅 发布时间:2026/7/16 6:32:01 👁️ 浏览次数:
STM32_GPIO_HAL库操作
文章目录一、使用HAL库配置GPIO思路1、初始化配置2、输入输出操作3、复用 / 中断二、HAL库GPIO相关函数0、时钟使能1、初始化2、IO操作3、宏定义4、模式定义三、示例代码一、使用HAL库配置GPIO思路1、初始化配置通过GPIO_InitTypeDef结构体定义引脚模式、速度、上下拉等参数再调用HAL_GPIO_Init()完成初始化。2、输入输出操作输出用HAL_GPIO_WritePin()/HAL_GPIO_TogglePin()输入用HAL_GPIO_ReadPin()。3、复用 / 中断GPIO 作为外设复用如串口、SPI或外部中断时需额外配置复用映射 / 中断优先级。二、HAL库GPIO相关函数0、时钟使能// 使能GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 使能GPIOB时钟__HAL_RCC_GPIOB_CLK_ENABLE();// 关闭GPIOA时钟极少用__HAL_RCC_GPIOA_CLK_DISABLE();1、初始化//初始化一个 / 多个 GPIO 引脚配置模式、上下拉、速度HAL_GPIO_Init();//恢复 GPIO 引脚为默认状态模拟输入无时钟HAL_GPIO_DeInit()示例代码GPIO_InitTypeDef GPIO_InitStruct{0};// 配置PA0为推挽输出无上下拉低速GPIO_InitStruct.PinGPIO_PIN_0;// 指定引脚可组合GPIO_PIN_0|GPIO_PIN_1GPIO_InitStruct.ModeGPIO_MODE_OUTPUT_PP;// 模式推挽输出GPIO_InitStruct.PullGPIO_NOPULL;// 无上下拉GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_LOW;// 速度低速HAL_GPIO_Init(GPIOA,GPIO_InitStruct);// 执行初始化HAL_GPIO_DeInit(GPIOA,GPIO_PIN_0);// 恢复为默认引脚2、IO操作//读取单个引脚电平返回GPIO_PinState类型HAL_GPIO_ReadPin();//设置单个引脚电平高 / 低HAL_GPIO_WritePin();//翻转引脚电平LED 闪烁常用HAL_GPIO_TogglePin();//锁定GPIO引脚配置寄存器。HAL_GPIO_LockPin();//中断服务函数中调用清除中断标志并触发回调HAL_GPIO_EXTI_IRQHandler();//中断回调函数需重写自定义中断逻辑HAL_GPIO_EXTI_Callback();//配置中断优先级HAL_NVIC_SetPriority();//使能中断通道HAL_NVIC_EnableIRQ();3、宏定义__HAL_GPIO_EXTI_GET_FLAG 检查指定的EXTI行标志是否设置。__HAL_GPIO_EXTI_CLEAR_FLAG 清除EXTI的行挂起标志。__HAL_GPIO_EXTI_GET_IT 检查指定的EXTI行是否被断言。__HAL_GPIO_EXTI_CLEAR_IT 清除EXTI的行挂起位。__HAL_GPIO_EXTI_GENERATE_SWIT 在选定的情况下生成软件中断。4、模式定义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 具有下降沿触发检测的外部中断模式GPIO_MODE_IT_RISING_FALLING 具有上升下降沿触发检测的外部中断模式GPIO_MODE_EVT_RISING 具有上升沿触发检测的外部事件模式GPIO_MODE_EVT_FALLING 具有下降沿触发检测的外部事件模式GPIO_MODE_EVT_RISING_FALLING 具有上升下降沿触发检测的外部事件模式三、示例代码//GPIO 输出控制 LEDGPIO 输入读取按键#includestm32f1xx_hal.h// 宏定义简化代码方便移植#defineLED_PINGPIO_PIN_0#defineLED_PORTGPIOA#defineKEY_PINGPIO_PIN_1#defineKEY_PORTGPIOA// GPIO初始化函数voidGPIO_Config(void){GPIO_InitTypeDef GPIO_InitStruct{0};// 1. 使能GPIO时钟必须否则引脚无响应__HAL_RCC_GPIOA_CLK_ENABLE();// 2. 配置LED引脚PA0推挽输出GPIO_InitStruct.PinLED_PIN;GPIO_InitStruct.ModeGPIO_MODE_OUTPUT_PP;// 推挽输出GPIO_InitStruct.PullGPIO_NOPULL;// 无上下拉GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_LOW;// 低速HAL_GPIO_Init(LED_PORT,GPIO_InitStruct);// 3. 配置按键引脚PA1上拉输入GPIO_InitStruct.PinKEY_PIN;GPIO_InitStruct.ModeGPIO_MODE_INPUT;// 输入模式GPIO_InitStruct.PullGPIO_PULLUP;// 上拉按键默认高电平按下接地为低HAL_GPIO_Init(KEY_PORT,GPIO_InitStruct);}intmain(void){// 1. HAL库初始化必须初始化系统时钟、SysTick等HAL_Init();// 2. 配置系统时钟根据自己的板子配置如72MHzSystemClock_Config();// 3. 初始化GPIOGPIO_Config();while(1){// 4. 读取按键状态低电平表示按下if(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN)GPIO_PIN_RESET){HAL_Delay(20);// 消抖if(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN)GPIO_PIN_RESET){// 5. 翻转LED电平亮/灭切换HAL_GPIO_TogglePin(LED_PORT,LED_PIN);// 等待按键释放避免重复触发while(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN)GPIO_PIN_RESET);}}}}// 系统时钟配置函数STM32F103标准配置可直接用voidSystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct{0};RCC_ClkInitTypeDef RCC_ClkInitStruct{0};// 配置外部晶振8MHz作为PLL源PLL倍频到72MHzRCC_OscInitStruct.OscillatorTypeRCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEStateRCC_HSE_ON;RCC_OscInitStruct.HSEPredivValueRCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.PLL.PLLStateRCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSourceRCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMULRCC_PLL_MUL9;if(HAL_RCC_OscConfig(RCC_OscInitStruct)!HAL_OK){Error_Handler();}// 配置系统时钟、AHB、APB总线时钟RCC_ClkInitStruct.ClockTypeRCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSourceRCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDividerRCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDividerRCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDividerRCC_HCLK_DIV1;if(HAL_RCC_ClockConfig(RCC_ClkInitStruct,FLASH_LATENCY_2)!HAL_OK){Error_Handler();}}// 错误处理函数可自定义如LED常亮voidError_Handler(void){__disable_irq();while(1){}}