STM32F4 HAL库 GPIO相关操作API介绍
本文绝大部分翻译自ST的官方用户手册 Description of STM32F4 HAL and LL drivers
使用前注意开启GPIO时钟
__HAL_RCC_GPIOx_CLK_ENABLE()
目录
- 使用方法
- GPIO相关结构体变量
- 相关函数
- 初始化与取消初始化
- GPIO操作
- GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
- void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
- void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
- HAL_StatusTypeDef HAL_GPIO_LockPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
- void HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin)
- __weak void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
- 相关宏定义
使用方法
- 使用
__HAL_RCC_GPIOx_CLK_ENABLE()
开启GPIO总线时钟 - 使用
HAL_GPIO_Init()
配置GPIO引脚 - 如果要配置外部中断功能,请先使用
HAL_NVIC_SetPriority()
配置 NVIC IRQ 优先级,再使用HAL_NVIC_EnableIRQ()
开启 IRQ - 使用
HAL_GPIO_ReadPin()
获取引脚的电平值 - 使用
HAL_GPIO_WritePin()/HAL_GPIO_TogglePin()
这两个函数来设置引脚的电平值 - 使用
HAL_GPIO_LockPin()
来锁定引脚的配置 - 当正在重置单片机或刚重置完单片机后,除了 JTAG 引脚以外,其余所有的引脚都被配置为浮空输入模式并且原本的复用功能将被取消
- LSE 晶振引脚接口( LSE oscillator pins) OSC32_IN(PC14) 与 OSC32_OUT(PC15) 只有在 LSE 时钟关闭后才能被用作GPIO引脚。
- OSC_IN/OSC_OUT(PH0)引脚的使用同 8
GPIO相关结构体变量
typedef struct
{
uint32_t Pin;//所要初始化的引脚序列 GPIO_PIN_x 参见GPIO_pins_define
uint32_t Mode;//输入输出模式 GPIO_MODE_xxx 参见GPIO_pins_define
uint32_t Speed;//输入输出速度 GPIO_XXXX_Speed 参见 GPIO_speed——define
uint32_t Alternate//要连接到该引脚的外设,即复用功能 参见GPIO_Alternate_function_selection
}GPIO_InitTypeDef;
相关函数
初始化与取消初始化
-
void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init)
用于初始化某个GPIO外设
参数说明:
GPIOx
所要初始化的GPIO分组,x可选范围(A…K)(STM32F429)GPIO_Init
GPIO初始化结构体的指针,该结构体定义了一些GPIO引脚的参数
-
void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin)
用于注销某个GPIO外设,参数同上
GPIO操作
-
GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
读取某个GPIO引脚的值
参数说明:
GPIO_Pin
指定要读取的引脚序号,参数取值包括:GPIO_PIN_x
,x可选范围(0…15),具体参考相关宏定义
-
void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
设定某个GPIO引脚的值
参数说明:
PinState
引脚状态:GPIO_PIN_RESET
:低电平GPIO_PIN_SET
:高电平
-
void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
切换某个GPIO引脚的状态,高电平->低电平 或 低电平->高电平
-
HAL_StatusTypeDef HAL_GPIO_LockPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
锁定某个GPIO引脚的一些配置寄存器,包括:
GPIOx_MODER
GPIOx_OTYPER
GPIOx_OSPEEDR
GPIOx_PUPDR
GPIOx_AFRL
GPIOx_AFRH
。上述寄存器将无法被更改直到下次单片机reset
HAL Status:HAL库函数执行的状态,包括4种状态:
typedef enum { HAL_OK = 0x00, HAL_ERROR = 0x01, HAL_BUSY = 0x02, HAL_TIMEOUT = 0x03 }HAL_StatusTyperDef;
-
void HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin)
GPIO引脚外部中断处理的公共入口函数,该函数需要在中断服务函数
EXTIx_IRQHandler()
中被调用该函数已经在HAL库中声明并定义好,详细参见文件
stm32f4xx_hal_gpio.c
//stm32f4xx_hal_gpio.c void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); HAL_GPIO_EXTI_Callback(GPIO_Pin); } }
-
__weak void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
__weak
函数GPIO引脚外部中断的回调函数,该函数将在
HAL_GPIO_EXTI_IRQHandler()
函数中被调用用户通过重构该函数来实现中断触发后的逻辑,并且无需考虑重置中断标识符。
参数说明:
GPIO_Pin
触发外部中断的引脚序号(等同与中断线的序号)
相关宏定义
GPIO Alternate Function Selection 复用功能列表
GPIO_AF0_RTC_50Hz
GPIO_AF0_MCO
GPIO_AF0_TAMPER
GPIO_AF0_SWJ
GPIO_AF0_TRACE
GPIO_AF1_TIM1
GPIO_AF1_TIM2
GPIO_AF2_TIM3
GPIO_AF2_TIM4
GPIO_AF2_TIM5
GPIO_AF3_TIM8
GPIO_AF3_TIM9
GPIO_AF3_TIM10
GPIO_AF3_TIM11
GPIO_AF4_I2C1
GPIO_AF4_I2C2
GPIO_AF4_I2C3
GPIO_AF5_SPI1
GPIO_AF5_SPI2
GPIO_AF5_SPI3
GPIO_AF5_SPI4
GPIO_AF5_SPI5
GPIO_AF5_SPI6
GPIO_AF5_I2S3ext
GPIO_AF6_SPI3
GPIO_AF6_I2S2ext
GPIO_AF6_SAI1
GPIO_AF7_USART1
GPIO_AF7_USART2
GPIO_AF7_USART3
GPIO_AF7_I2S3ext
GPIO_AF8_UART4
GPIO_AF8_UART5
GPIO_AF8_USART6
GPIO_AF8_UART7
GPIO_AF8_UART8
GPIO_AF9_CAN1
GPIO_AF9_CAN2
GPIO_AF9_TIM12
GPIO_AF9_TIM13
GPIO_AF9_TIM14
GPIO_AF9_LTDC
GPIO_AF9_QSPI
GPIO_AF10_OTG_FS
GPIO_AF10_OTG_HS
GPIO_AF10_QSPI
GPIO_AF11_ETH
GPIO_AF12_FMC
GPIO_AF12_OTG_HS_FS
GPIO_AF12_SDIO
GPIO_AF13_DCMI
GPIO_AF13_DSI
GPIO_AF14_LTDC
GPIO_AF15_EVENTOUT
宏定义函数(外部中断相关)
__HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) //检查指定的中断线的标志位
__HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) //检查指定的中断线的标志位
__HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) //清除 中断标志
__HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) //清除 中断标志
__HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) //生成软件中断
GPIO mode define GPIO模式宏定义列表
宏定义 | 解释 |
---|---|
GPIO_MODE_INPUT |
浮空输入 |
GPIO_MODE_OUTPUT_PP |
推挽输出 |
GPIO_MODE_OUTPUT_OD |
开漏输出 |
GPIO_MODE_AF_PP |
推挽复用输出 |
GPIO_MODE_AF_OD |
开漏复用输出 |
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 pins define GPIO引脚序列定义列表
GPIO_PIN_0
GPIO_PIN_1
GPIO_PIN_2
GPIO_PIN_3
GPIO_PIN_4
GPIO_PIN_5
GPIO_PIN_6
GPIO_PIN_7
GPIO_PIN_8
GPIO_PIN_9
GPIO_PIN_10
GPIO_PIN_11
GPIO_PIN_12
GPIO_PIN_13
GPIO_PIN_14
GPIO_PIN_15
GPIO_PIN_All
GPIO_PIN_MASK
GPIO pull define GPIO上下拉定义列表
宏定义 | 解释 |
---|---|
GPIO_NOPULL |
不激活上下拉 |
GPIO_PULLUP |
上拉激活 |
GPIO_PULLDOWN |
下拉激活 |
GPIO speed define GPIO速度定义列表
宏定义 | 解释 |
---|---|
GPIO_SPEED_FREQ_LOW |
工作速度 2MHz |
GPIO_SPEED_FREQ_MEDIUM |
工作速度 12.5MHz~50MHz |
GPIO_SPEED_FREQ_HIGH |
工作速度 50MHz~100MHz |
GPIO_SPEED_FREQ_VERY_HIGH |
工作速度 100MHz~200MHz |