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 结构体定义

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341