HAL_GPIO_Init函数实现原理

前言

之前在使用GPIO配置的时候使用初始化函数去进行配置,但用了这么久的st官方给的函数也不知道它是怎么去实现的,今天突发奇想来自己学习研究一下

函数入口参数讲解

上面是从库里面截取的图片,可以喊道有两个结构体指针作为函数的参数,那么我们先来看一下这两个结构体的内容所代表的含义是什么吧

 

 首先讲一下第一个结构体,第一个结构体所标识出来的也就是我们各个IO口的寄存器,每个寄存器是一个字长也就是32bit;第二个结构体就是我们一般通俗易懂的GPIO的几个配置方面,像引脚、模式、上下拉、速度,无论怎么配 最终都是依靠寄存器去配置的,这个底层逻辑是不变的。

函数内部变量的讲解

在来讲解一下使用到的变量的作用以及含义

 上面我也将函数内各个变量的用途标了出来,不过好像看不太清,我直接在下面列出

  • position: 这个是用于下面for循环使用的 也就是对16个pin口进行循环
  • ioposition:这个是对当前循环到的位置的pin口进行判断,是否设置了这个pin口
  • iocurrent:当前使用到的pin口
  • temp:临时变量
  • config:用于保存每一次的配置信息
  • *configregister:用于保存GPIO的实际地址(重要)
  • registeroffset:寄存器的偏移地址

具体配置操作

for循环

跟踪进去 可以看到是16 也就是对16个pin进行轮询配置

首先我们需要理解的一点是 整个for循环始终都是在配置两个寄存器其实也可以说是一个寄存器

分别是CRL CRH

 一个端口低位一个端口高位

 switch语句

在选择完pin口后使用Switch 对其模式进行相应的配置

下面是对输入进行的配置 所有的模式都使用的同一个代码段 

 赋值阶段

最后一步就是将值配置到寄存器上面了

 

第一个找到GPIO的地址,注意这里使用了一个三目运算对GPIO低寄存器和高寄存器进行了配置

configregister 找到具体的GPIO的寄存器地址

registeroffset 偏移地址 也就是对具体的pin口进行配置

最后讲值赋值到相应的寄存器的位置上去,这个函数大概就是用了位掩码、赋值的方式进行配置

 还有后面的函数是对中断进行的配置模式进行配置 这里就不具体展开讲了(因为我还没仔细去研究 )

感悟

 想想之前只知道调库,学东西还是要了解原理才行啊,任重道远呀!

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值