- GPIO外设接口原理分析
ST公司提供的关于GPIO的案例代码中,调用了很多关于GPIO外设相关的函数接口以及数据类型,作为初学者必须认真分析代码,才能掌握GPIO外设的核心原理。按照ST提供的关于外设的初始化和配置的流程分析:
定义外设的初始化结构体变量 + 打开外设时钟 + 对结构体成员进行赋值 + 初始化外设!
(GPIO初始化按照这个流程准没错)
- 定义GPIO外设的和初始化相关的结构体变量,结构体类型是定义在stm32f4xx_gpio.h
ST公司为MCU中的每个外设都封装了对应的源文件和头文件,而一般结构体类型都定义在头文件中,而ST公司对文件的命名是有规则: stm32f4xx_xxx.c or stm32f4xx_xxx.h
- 想要使用GPIO外设必须提前打开GPIO端口外设时钟,需要使用ST提供的函数,如下:
对于以上5个关于外设的时钟控制(启用/禁用)的函数都是针对MCU内部的总线而言的,比如AHB1、AHB2、AHB3、APB1、APB2都是MCU内部的总线的名称,而MCU中的外设都是挂载在总线下的!!!!
总线和外设的关系:外设需要挂载在总线下,不同的总线的性能是不同的,可以把总线理解为高速公路的3条车道(快车道 120KM/H 中间车道 100KM/H 慢车道 80KM/H),外设可以理解为是汽车,性能强的车应该在快车道行驶........
在MCU中主要有3条总线需要掌握:AHB总线(高级高性能总线)、APB1总线(高级外设总线1)、APB2总线(高级外设总线2),总线频率如下:
每条总线都会挂载不同的外设,不同的总线都不同的关于时钟控制的函数,如何知道外设和总线的关系,可以通过阅读MCU的参考手册:
可以发现,GPIO外设都是挂载在AHB1总线下的,所以如果打算启用某个GPIO端口的时钟,就需要使用AHB1总线对应的函数(注意阅读参考手册不是所有芯片的GPIO都是挂载在AHB1总线下的,例如STM32F103系列GPIO挂载在APB2总线下)
可以知道,MCU内部的外设的时钟在复位之后默认处于关闭状态,如果打算使用外设,则需要在使用外设之前启用外设的时钟!!因为MCU微控制器一般要在低功耗的场景使用的,所以这种现象是为了降低MCU的功耗。
启用外设时钟的根本原因:从底层角度分析,控制硬件的手段是寄存器,而数字电路中寄存器属于时序逻辑电路,因为寄存器是由触发器构成,STM32F407ZET6这颗MCU是32bit的内核,所以MCU中的寄存器的宽度是32bit,所以一个寄存器需要由32个触发器级联组成。
也就是寄存器中的触发器需要脉冲信号,脉冲信号由MCU外部的晶振电路提供,晶振进行震荡会生成周期性脉冲信号,把脉冲信号提供寄存器使用,用于让寄存器暂存一组二进制数。
- 打开GPIO外设的时钟之后,可以对GPIO外设的初始化结构体中的成员进行赋值,如:
设置GPIO引脚的编号
设置GPIO引脚的模式
设置GPIO引脚的输出类型
设置GPIO引脚的内部电阻
设置GPIO引脚的输出速度
输出速度指的是引脚电平的翻转速度,如果选择高速,则会增加功耗和噪声,如果不知道选择哪种,则选择高速即可。
- 设置好了GPIO结构体的各个成员的值,需要把结构体中的值写入到GPIO端口寄存器!
对于外设的初始化函数而言,原理就是把配置好的参数写入到外设对应的寄存器中,初始化外设的前提是必须先打开外设的时钟!
二、MCU寄存器开发流程
不管是图形界面开发还是函数库开发,本质都是对硬件的寄存器进行配置,只不过函数库开发和图形界面开发都是ST公司的开发人员帮用户提前配置好了硬件的寄存器,并把配置过程封装在函数接口中,所以用户可以直接调用对应的函数接口来提高开发效率。
使用函数库开发(标准库 or HAL库)或者STM32CubuMX图形工具开发的缺点是代码运行效率比较低,因为函数内部可能嵌套调用其他函数,而且函数调用过程会占用堆栈空间。
所以项目对实时性要求比较高的情况下,开发人员应直接通过配置寄存器的方式控制硬件,目的是提高程序的运行效率以及节约内存。
- 查看原理图,找到控制发光二极管的芯片的IO口,如LED0 -- PF9引脚,其他引脚类似!
- 分析原理图,理解硬件的控制原理(复杂外设还需要结合数据手册),输出低电平就亮!
- 查阅ST公司提供的芯片的中文参考手册,目的是为了了解当前的外设都有哪些寄存器!
- 查阅ST公司提供的芯片的中文参考手册,目的是掌握外设的相关寄存器的使用流程!!
- 查阅芯片的数据手册以及中文参考手册,计算出需要使用的外设的寄存器的物理地址!
- 通过GPIO外设的寄存器的地址来对寄存器进行读写操作,需要把寄存器地址转为指针
- 对外设的寄存器的指针进行访问即可,需对转换后的寄存器地址进行间接访问(解引用)
作业:利用寄存器的方式实现控制开发板的4个LED灯,要求使用寄存器开发!!!!!!