【单片机学习之旅】(3-2)stm32F4 GPIO库函数解析

前言

学习了32寄存器的用法后,我们可以通过官方标准库的函数来使用GPIO口,那么标准库具体是怎么实现的呢?

1.gpio.c函数解析

1.void GPIO_DeInit(GPIO_TypeDef* GPIOx)
该函数是用来关闭GPIOx时钟的,函数的参数为结构体指针类型,需要注意的是函数的第一句:

	 assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

它的作用就是判断你传入的参数是否正确,参数的值就是外设GPIOx对应的地址
在这里插入图片描述
很显然当没有定义USE_FULL_ASSERT时,它是无作用的。

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);

当定义了USE_FULL_ASSERT,就会声明assert_failed函数,则可以根据需求编写函数assert_failed(uint8_t* file, uint32_t line)当做报错警告,file为文件名,line为行号。例如:

void assert_failed(uint8_t* file, uint32_t line)
{printf("Wrong parameters value: file %s on line %d\r\n", file, line);  while(1);}

2.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
同样的函数开始进行断言,判断IO组,Pin脚,模式,上下拉是否正确,后续不再叙述
在这里插入图片描述
这3个辅助初始化的变量开始都为0,很明显for将执行16次,第一次pos为1,currentpin=GPIO_Pin&1;MODER=MODER&0xfffffffc,意思就是把低2位清除,然后再MODER=MODER|GPIO_Mode;GPIO_Mode就是要设置的模式,这样第一个Pin的模式就配置好了,如果是输出或复用模式,就配置IO速度和推挽/开漏,逻辑是一样的,因为输出类型寄存器只用了低16位,所以每次GPIO_OTYPER_OT_0只要左移1位,其它的都要2,再接下来就是配置上下拉,所有模式都可配置。执行16次,对应Pin0-15。
3.void GPIO_StructInit(GPIO_InitTypeDef
GPIO_InitStruct)
把GPIO寄存器恢复默认值
4.void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
在这里插入图片描述
我们都知道GPIO是有一个锁定寄存器的,用来锁定控制寄存器和复用寄存器
通过特定的写序列配置锁定寄存器就能实现,第16位为1,低16位为对应要锁定的Pin,一般情况都是使用不到的
5.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

通过判断输出数据寄存器的值&GPIO_Pin是否为1来返回1/0

6.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)

返回输入数据寄存器的16位数据(高16位保留),用来读取输入模式下一组IO口电平状态

7.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)

返回输出数据寄存器的16位数据(高16位保留),用来读取输出模式下一组IO口电平状态

8.void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

向置位/复位寄存器低16位对应位写1来将Pin脚置高

9.void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

向置位/复位寄存器高16位对应位写1来将Pin脚置低

注意:如果同时将置位/复位寄存器高16位及低16位都置1,则低16位优先级更高
10.void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)

通过向置位/复位寄存器高16位或低16位置1实现某个IO输出高低电平,

11.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)

直接向输出数据寄存器低16位写入16位数据,达到控制一组IO电平的目的

12.void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

翻转数据寄存器某个位的状态

13.void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
复用功能选择函数,因为复用功能寄存器是有2个的,64位控制16个Pin,每4个位控制16种复用功能,每个Pin都可选择

2.gpio.h文件

在这里插入图片描述
该文件下有大量的类似的宏定义,它是和断言函数搭配起来使用的,()内的参数是规定的就会返回1.
在这里插入图片描述
定义了很多枚举类型的变量,方便用来设置初始化参数
在这里插入图片描述
每次需要初始化IO时需要定义一个该结构体类型的结构体,将需要初始化的参数都设置好,再经过GPIO_Init()函数配置到GPIO寄存器

总结

以上就是GPIO库函数的全部内容,实现的方法还是比较容易看懂的,如果新手比较懵,建议看看C语言的结构体。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值