STM32之GPIO相关函数解析(HAL库)

一.前言

最近复习了一下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); //调用外部中断回调函数
  }
}

用来响应外部中断的触发,函数实体里面有两个功能:

  1. 清除中断标记位;
  2. 调用下面要介绍的回调函数;
    注:一般是不会调用和修改外部中断服务函数,触发内容写在回调函数中。

    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声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。

三.同系列博客

  1. GPIO相关函数解析(HAL库)
  2. Stm32延时与计时方法(HAL库)
  3. 串口通讯知识梳理及在Stm32上的应用(HAL库)
  4. 串口DMA知识梳理以及在Stm32的应用(HAL库)
  5. CAN通信知识梳理及在Stm32上的应用(HAL库)
### STM32F4xx HALGPIO函数的使用方法 #### 文档与资源获取 对于正在学习STM32F4xx系列微控制器并计划利用GPIO外设开展项目的用户而言,官方提供的《STM32F4xx HALGPIO外设及函数)中文使用指南》是一个非常有价值的参考资料[^1]。该文档不仅适合初学者入门,同样能够帮助有经验的工程师深入理解HALGPIO相关功能的具体实现方式。 #### 初始化过程概述 当采用STM32CubeMX工具来简化开发流程时,会自动生成一些必要的初始化代码片段,其中包括`SystemClock_Config()`用于设置系统时钟频率;以及`MX_GPIO_Init()`负责配置通用输入/输出端口的工作模式等参数[^2]。这些预定义好的函数极大地方便了开发者快速启动项目而无需手动编写复杂的底层驱动程序。 #### 实际编程示范 下面给出一段简单的C语言源码作为实例展示如何通过调用上述提到过的API接口去控制LED的状态变化: ```c #include "stm32f4xx_hal.h" // 假定PB0连接了一个红色LED #define LED_PIN GPIO_PIN_0 #define LED_PORT GPIOB int main(void){ /* 初始化全局变量 */ HAL_Init(); // 调用由STM32CubeMX生成的GPIO初始化函数 MX_GPIO_Init(); while (1){ // 设置指定引脚为高电平点亮LED HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); // 等待一段时间保持亮起状态 HAL_Delay(500); // 将同一引脚拉低熄灭LED HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); // 再次延时准备下一轮循环 HAL_Delay(500); } } ``` 此段代码实现了让连接到MCU特定管脚上的发光二极管每隔半秒交替闪烁一次的效果。值得注意的是,在这里并没有涉及任何中断服务例程的设计,因此不需要额外处理回调机制就可以满足基本的应用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬瓜~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值