
一.前言
最近复习了一下Stm32关于GPIO的一些操作,也对其相关函数做了一下整理,以下的8条函数均在HAL库的 stm32l4xx_hal.c 中。
二.内容
1. HAL_GPIO_Init
/* @brief 根据 GPIO_Init中指定的参数初始化 GPIOx外设。
* @param GPIOx
* @param GPIO_Init
* @retval None
*/
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
这个函数主要用来初始化我们需要用到的引脚,设置其工作频率、工作模式、上下拉等参数。如果使用CubeMX配置工程,所有参数在Cube中调配,函数自动在工程中生成。
2. HAL_GPIO_DeInit
/* @brief 将 GPIO恢复至默认状态
* @param GPIOx
* @param GPIO_Pin
* @retval None
*/
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
HAL_GPIO_Init能够实现对GPIO的初始化,那么HAL_GPIO_DeInit就是与其相反的操作,能够将GPIO口恢复至默认状态,即各个寄存器复位时的值。
3. HAL_GPIO_ReadPin
/**
* @brief 读取指定的输入端口引脚的电平值
* @param GPIOx (如GPIOC)
* @param GPIO_Pin (如GPIO_PIN_13)
* @retval 返回引脚电平值(0或1)
*/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
这个函数主要功能是读取我们想要知道的引脚的电平状态、函数返回值为0或1。
4. HAL_GPIO_WritePin
/**
* @brief 设置或清除选定的数据端口位。
* @param GPIOx (如GPIOC)
* @param GPIO_PIN (如GPIO_PIN_13)
* @param PinState (GPIO_PIN_RESET 或 GPIO_PIN_SET)
* GPIO_PIN_RESET为 0 ; GPIO_PIN_SET为 1
* @retval None
*/
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
这个函数主要功能是给某个GPIO写0或1。
5. HAL_GPIO_TogglePin
/**
* @brief 翻转引脚电平
* @param GPIOx
* @param GPIO_Pin
* @retval None
*/
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
用于翻转某个GPIO引脚的电平状态。如果为0则变为1;如果为1则变为0。
6.HAL_GPIO_LockPin
/**
* @brief 锁住引脚的电平状态
* @param GPIOx
* @param GPIO_Pin
* @retval HAL_StatusTypeDef 即:HAL_OK、HAL_ERROR、HAL_BUSY、HAL_TIMEOUT
*/
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
顾名思义,就是锁住某个引脚的电平状态。比如说一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值。注意的是:一旦锁住后,就不能再修改,只有复位后才可以重新配置。
7.HAL_GPIO_EXTI_IRQHandler
/**
* @brief 外部中断服务函数
* @param GPIO_Pin
* @retval None
*/
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); //调用外部中断回调函数
}
}
用来响应外部中断的触发,函数实体里面有两个功能:
- 清除中断标记位;
- 调用下面要介绍的回调函数;
注:一般是不会调用和修改外部中断服务函数,触发内容写在回调函数中。
8.void HAL_GPIO_EXTI_Callback
/**
* @brief 外部中断回调函数
* @param GPIO_Pin
* @retval None
*/
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
外部中断回调函数,在函数中写入外部中断触发的内容。需要注意的是:回调函数定义为弱函数( __weak ),故不需要在stm32l4xx_hal.c中对其进行修改。HAL_GPIO_EXTI_Callback可以在用户文件中实现。
__weak的使用: 加上了__weak修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。