前言
之前在使用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口进行配置
最后讲值赋值到相应的寄存器的位置上去,这个函数大概就是用了位掩码、赋值的方式进行配置
还有后面的函数是对中断进行的配置模式进行配置 这里就不具体展开讲了(因为我还没仔细去研究 )
感悟
想想之前只知道调库,学东西还是要了解原理才行啊,任重道远呀!