解析GPIO代码与寄存器点亮LED

  1. GPIO外设接口原理分析

ST公司提供的关于GPIO的案例代码中,调用了很多关于GPIO外设相关的函数接口以及数据类型,作为初学者必须认真分析代码,才能掌握GPIO外设的核心原理。按照ST提供的关于外设的初始化和配置的流程分析:

定义外设的初始化结构体变量 + 打开外设时钟 + 对结构体成员进行赋值 + 初始化外设!

(GPIO初始化按照这个流程准没错)

  1. 定义GPIO外设的和初始化相关的结构体变量,结构体类型是定义在stm32f4xx_gpio.h

ST公司为MCU中的每个外设都封装了对应的源文件和头文件,而一般结构体类型都定义在头文件中,而ST公司对文件的命名是有规则: stm32f4xx_xxx.c or stm32f4xx_xxx.h

  1. 想要使用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外部的晶振电路提供,晶振进行震荡会生成周期性脉冲信号,把脉冲信号提供寄存器使用,用于让寄存器暂存一组二进制数。

  1. 打开GPIO外设的时钟之后,可以对GPIO外设的初始化结构体中的成员进行赋值,如:

设置GPIO引脚的编号

设置GPIO引脚的模式

设置GPIO引脚的输出类型

设置GPIO引脚的内部电阻

设置GPIO引脚的输出速度

输出速度指的是引脚电平的翻转速度,如果选择高速,则会增加功耗和噪声,如果不知道选择哪种,则选择高速即可。

  1. 设置好了GPIO结构体的各个成员的值,需要把结构体中的值写入到GPIO端口寄存器!

对于外设的初始化函数而言,原理就是把配置好的参数写入到外设对应的寄存器中,初始化外设的前提是必须先打开外设的时钟!

二、MCU寄存器开发流程

不管是图形界面开发还是函数库开发,本质都是对硬件的寄存器进行配置,只不过函数库开发和图形界面开发都是ST公司的开发人员帮用户提前配置好了硬件的寄存器,并把配置过程封装在函数接口中,所以用户可以直接调用对应的函数接口来提高开发效率。

使用函数库开发(标准库 or HAL库)或者STM32CubuMX图形工具开发的缺点是代码运行效率比较低,因为函数内部可能嵌套调用其他函数,而且函数调用过程会占用堆栈空间。

所以项目对实时性要求比较高的情况下,开发人员应直接通过配置寄存器的方式控制硬件,目的是提高程序的运行效率以及节约内存。

  1. 查看原理图,找到控制发光二极管的芯片的IO口,如LED0 -- PF9引脚,其他引脚类似!

  1. 分析原理图,理解硬件的控制原理(复杂外设还需要结合数据手册),输出低电平就亮!

  1. 查阅ST公司提供的芯片的中文参考手册,目的是为了了解当前的外设都有哪些寄存器!

  1. 查阅ST公司提供的芯片的中文参考手册,目的是掌握外设的相关寄存器的使用流程!!

  1. 查阅芯片的数据手册以及中文参考手册,计算出需要使用的外设的寄存器的物理地址!

  1. 通过GPIO外设的寄存器的地址来对寄存器进行读写操作,需要把寄存器地址转为指针

  1. 对外设的寄存器的指针进行访问即可,需对转换后的寄存器地址进行间接访问(解引用)

作业:利用寄存器的方式实现控制开发板的4个LED灯,要求使用寄存器开发!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值