1+X 传感网中级备考STM32:HAL库之GPIO函数功能介绍

- 函数存放路径
- 函数功能介绍
- 函数参数:结构体类型

1.函数存放路径

HAL库的GPIO函数,存放路径如图1所示:路径Driver/STM32F1xx_HAL_Driver/stm32f1xx_hal_gpio.c,其中一级文件夹STM32F1xx_HAL_Driver存放的是ST公司提供的HAL库头文件和源文件,也就是所有底层硬件抽象层API接口函数的声明和定义;之前大家学习51单片机都是直接对寄存器进行配置,而对于STM32数百个寄存器直接配置将非常繁琐;HAL库提供的这一整套API方便开发者直接调用函数,不需要去知道操作的哪个寄存器;
但这不是说寄存器相关原理就完全不用学习了,相反,在STM32的学习过程中,大家既要知道函数的功能,也要了解各个外设的硬件运行机制;这样HAL库的开发才会游刃有余;后面的函数功能介绍部分,我们也会同步介绍相关寄存器的操作;
文件夹中的每一个源文件stm32f1xx_hal-ppp.c都对应一个头文件stm32f1xx_hal-ppp.h,

图1,GPIO函数的存放路径

2.1 HAL_GPIO_Init( )

函数功能介绍:该函数主要用来初始化我们需要用到的GPIO端口引脚,设置其工作频率、工作模式、上下拉等参数,当使用CubeMX配置工程时,所有参数在CubeMX中调配,函数自动在工程中生成。
函数参数GPIOx: 是GPIO_TypeDef * 类型,参数可选范围是:.GPIOA~GPIOG;
函数参数GPIO_Init:是 GPIO_InitTypeDef *类型,该结构体指针包含的变量有:GPIO口的速度,GPIO口的模式,GPIO口的上拉或下拉状态,GPIO口的Pin位操作引脚;
返回值:无
应用场景:任何GPIO的端口都需要先进行初始化操作;

 * @brief  Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init.
 * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
 * @param  GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
 *        the configuration information for the specified GPIO peripheral.
 * @retval None

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)

2.2 HAL_GPIO_WritePin()

函数功能:主要功能是给某个GPIO写0或1;
注意事项:此函数使用GPIOx_BSRR寄存器来允许读取/修改访问。通过这种方式,在读取和修改访问之间没有发生IRQ的风险;
函数参数GPIOx: 是GPIO_TypeDef * 类型,是GPIO寄存器类型,参数可选范围是GPIOA~GPIOG
函数参数GPIO_Pin:是unit16_t类型,是GPIO寄存器的位端口;连接外设LED灯;参数可选范围是GPIO_PIN_0~GPIO_PIN_15
函数参数PinState,指定要写入选定位的值;参数可选范围是,GPIO_PIN_RESET,GPIO_PIN_SET两个值;
返回值:无;
应用场景:设置LED灯亮灭,与延时函数配合使用;
寄存器关联:通过调用该函数HAL_GPIO_WritePin(),可以设置ODR寄存器的值(该寄存器的16位可读可写),然后IO端口即可输出对应写入的值;


  * @brief  Sets or clears the selected data port bit.
  * @note   This function uses GPIOx_BSRR register to allow atomic read/modify
  *         accesses. In this way, there is no risk of an IRQ occurring between
  *         the read and the modify access.
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
  * @param  GPIO_Pin: specifies the port bit to be written.
  *          This parameter can be one of GPIO_PIN_x where x can be (0..15).
  * @param  PinState: specifies the value to be written to the selected bit.
  *          This parameter can be one of the GPIO_PinState enum values:
  *           @arg GPIO_PIN_RESET: to clear the port pin
  *           @arg GPIO_PIN_SET: to set the port pin
  * @retval None

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

2.3 HAL_GPIO_TogglePin()

函数简介:用于翻转某个GPIO引脚的电平状态。如果为0则变为1;如果为1则变为0。
函数参数GPIOx: 是GPIO_TypeDef * 类型,是GPIO寄存器类型,参数可选范围是GPIOA~GPIOG;
函数参数GPIO_Pin:是unit16_t类型,是GPIO寄存器的位端口;连接外设LED灯;参数可选范围是GPIO_PIN_0~GPIO_PIN_15;
返回值:无
应用场景:设置LED灯亮灭

  * @brief  Toggles the specified GPIO pin
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
  * @param  GPIO_Pin: Specifies the pins to be toggled.
  * @retval None

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

2.4 HAL_GPIO_ReadPin()

函数简介:读取输入端口引脚的状态;
函数参数:GPIOx: 是GPIO_TypeDef * 类型,是GPIO寄存器类型,参数可选范围是GPIOA~GPIOG;
函数参数: GPIO_Pin:是unit16_t类型,是GPIO寄存器的位端口;连接外设LED灯;参数可选范围是GPIO_PIN_0~GPIO_PIN_15;
返回值: 引脚输入状态的值;返回值有:GPIO_PIN_RESET或GPIO_PIN_SET;
应用场景:按键读取GPIO的状态;

寄存器关联:通过调用函数 HAL_GPIO_ReadPin(),
可以实现对IDR寄存器的数据读取;
IDR是只读输入寄存器,并且只能以16 位的形式读出;
例如要读取GPIOF.5 的输入电平,方法是:
HAL_GPIO_ReadPin (GPIOF, GPIO_Pin_5);

  * @brief  Reads the specified input port pin.
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
  * @param  GPIO_Pin: specifies the port bit to read.
  *         This parameter can be GPIO_PIN_x where x can be (0..15).
  * @retval The input port pin value.

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

3.函数参数:结构体类型的函数参数

结构体就是将多个变量组合为一个有机整体,
函数 HAL_GPIO_Init( ), 第一个参数 是 GPIO,它的类型是 GPIO_TypeDef * ,指向结构体变量(GPIO_TypeDef )的指针;右键双击 GPIO_TypeDef,然后选择 go to definition.就可以查看到该结构体成员变量的定义如图2所示:

图2:GPIO_TypeDef 结构体定义

该结构体成员变量表示了7个寄存器的名称,STM32 的每个 IO 端口都由这 7 个寄存器来控制;其中,我们最常用的 IO 端口寄存器是 4 个:CRL、CRH、IDR、ODR

2 个 32 位的端口配置寄存器 CRL 和 CRH;
2 个 32 位的数据寄存器 IDR 和 ODR;
1 个 32 位的置位/复位寄存器BSRR;
1个 16 位的复位寄存器 BRR;
1 个 32 位的锁存寄存器 LCKR;

第二个参数是GPIO_Init:它的类型是GPIO_InitTypeDef *,指向结构体变量(GPIO_InitTypeDef )的指针,其中GPIO_InitTypeDef结构体包含了Pin,mode ,pull,speed等几个成员变量,分别描述了GPIO口的速度,模式,和端口上拉或下拉状态等;
结构体指针成员变量的引用方法是通过 "->"符号实现,比如要访问GPIOC结构体指针指向的成员变量Speed,方法是GPIOC-> Speed;

图3 GPIO_InitTypeDef 结构体定义

当函数的入口参数随着开发不得不增多时,采用结构体变量,只需要在结构体中增加成员变量,而不需要修改函数定义就可以达到增加变量的目的;从而提高代码的可读性。

本次介绍了和考试相关的最常用的函数,关于中断和虚函数的使用,后续再介绍;

你可能感兴趣的:(1+X 传感网中级备考STM32:HAL库之GPIO函数功能介绍)