上犹电脑信息网我们一直在努力
您的位置:上犹电脑信息网 > 文件问题 > 电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解-chm文件怎么打开

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解-chm文件怎么打开

作者:上犹日期:

返回目录:文件问题

从这章开始,我们正式步入了单片机教学部分。学会使用单片机是开发项目的前提,作 者希望大家除了学习 STM32 单片机之外,更重要的是要学会单片机开发的的通用编程方法, 虽然不同单片机的开发方式有异,但是学会一种单片机之后再学习其他单片机的时候就会简 单很多。 另外作者在讲解如何对单片机编程的同时还会讲解开发板的原理图,让大家在学习单片 机的同时再学习一些电路知识。

电路原理

LED 灯也叫发光二极管,广泛应用在家居照明,其特点是亮度高、功耗低、寿命长且价 格便宜,LED 灯有不同类型的封装,外观有很大的差异,但是它们的原理都是相同的,另外 由于它是二极管的一种,因此也具有单向导电的特性,在电压反接时断路。下面是直插 LED 和贴片 LED 的示意图(封装种类远比展示要多):

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

众所周知,二极管一个很重要的特性就是它的正向压降,一般的二极管的正向压降都会 小于等于 0.7V,而发光二极管的压降会比一般的二极管高出很多,而且不同颜色压降也不 同,如下图:

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

另外发光二极管的电流一般要保证小于 20ma(大功率照明 LED 除外),否则寿命会有 很大衰减。因此我们不可能直接将 LED 接到电源,而是通过串联限流电阻来保证流过 LED 的 电流大小,计算公式为:

ILED = (VCC-VLED)/R

公式中的 VLED 是 LED 的正向压降,通常取 1.7V。阻值 R 在 300Ω到 1KΩ之间选取。 现在我们开始驱动 LED,想要 LED 发光,那么就必须保证阳极和阴极之间存在一个正向 压差且这个正向压差要大于 LED 的压降,这里采用 IO 口(3.3V)直接驱动 LED,当 IO 口输 出高电平的时候 LED 点亮,输出低电平则熄灭,因此我们只需要操作 IO 为输出,并控制它 的输出电平状态即可。 在开始学习 GPIO 控制 LED 之前先了解两个概念:端口复用和重映射。 之前介绍过 STM32 的外设功能十分的丰富,有各类通信的接口(UART,SPI,IIC 等),也有 ADC,PWM 输出等,这些都必须通过 IO 口来实现功能,因此这里就涉及到端口复用概 念,我们可以通过软件来设置此时使用哪种外设,复用的概念解决了外设数量与单片机引脚 数量不一致所导致的问题。 STM32 的一个 IO 口会有很多外设复用,如下图:

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

上图可以看到,一个 IO 口可以被很多外设复用,那么如果此时想要使用 PCB13 作为 IO 用,同时又想使用 UART3_CTS 功能怎么办,这里就又引出了端口重映射的概念,即我们通过 软件可以设置某个具有重映射功能的外设由 A 引脚映射到 B 引脚(假设此时 B 引脚没有用 到),通过这种机制就解决了多种外设同时使用同一引脚时所引起的冲突问题。 STM32 每个 GPIO 端口有两个 32 位配置寄存器(GPIOx_CRL, GPIOx_CRH),两个 32 位数 据寄存器(GPIOx_IDR 和 GPIOx_ODR),一个 32 位置位/复位寄存器(GPIOx_BSRR),一个 16 位 复位寄存器(GPIOx_BRR)和一个 32 位锁定寄存器(GPIOx_LCKR)。他们可以通过软件配置寄存 器来指定 GPIO 的输入输出功能,常用 GPIO 功能如下:

─ 输入浮空

─ 输入上拉

─ 输入下拉

─ 模拟输入

─ 开漏输出

─ 推挽式输出

─ 推挽式复用功能

─ 开漏复用功能 STM32 GPIO 结构如下:

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

接下来根据这张图讲解一下各个输入输出配置的信号流向。

⚫ 浮空输入

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

浮空输入是指即不上拉到 VDD 也不上拉到 VSS,此时它是“浮空”的,因此状态是不确 定的,这就需要外部电路来给它一个状态,比如外部高电平或者低电平,我们在使用定时器 的输入捕获功能时就需要将 IO 设置为浮空输入,那么可以保证单片机收到的电平状态一定 就是来自于外部的电平信号。

⚫ 模拟输入

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

模拟输入的其实是也是浮空输入,只不过没有走 TTL 施密特触发器(译文错误),因为 我们希望得到流入引脚的是模拟信号而不是两种状态的 0 或 1 的数字信号。

⚫ 上下拉输入

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

上下拉输入我合并到一起讲解,上拉就是通过电阻将引脚拉到 VCC,空闲状态一直是高 电平,程序读取到的数据为 1,反之下拉读取到的为 0。

⚫ 推挽输出

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

当某个引脚的输出寄存器设置位为 1 是,对应 PMOS 导通 NMOS 截止,IO 口输出高电平, 此时引脚向外输出电流(拉电流),当输出寄存器位 0,则对用 PMOS 截止,NMOS 导通,此时引脚等效于接到单片机的地,电流由外部电路流入单片机(灌电流),但是大家在电路设 计的时候要保证每个 IO 口拉/灌电流不要超过 25ma 且流过单片机的电流不要大于 150ma, 否则会减损单片机寿命。

⚫ 开漏输出

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

开漏指的是集电极开漏,也就是说集电极悬空,那么此时需要外部的上拉电阻来连接 IO 口,学过 51 单片机的都知道 P0 端口需要连接上拉电阻,原因就是 P0 的 8 个 IO 口都是集 电极开漏输出的,集电极开漏的好处在于,用户可以通过更改外部上拉电阻来自定义拉电流, 提高 IO 口驱动能力(此时要考虑当 NMOS 导通时灌电流是否超过最大值),另外也可以通过 集电极开漏输出做电平匹配,比如现在想通过 STM32 去和一个 2.8V 的器件通信,那么我们 完全可以将电阻上拉到 2.8V,除此之外,我们还可以将多个集电极开漏输出的 IO 通过共用 一个上拉电阻的方式来实现线与的功能。 对于复用推挽或者复用开漏和上面的结构一致,只不过数据接通的是对应的复用外设。 接下来介绍本例程用到的 GPIO 寄存器。

⚫ GPIO 的端口配置寄存器(GPIOx_CRL/ GPIOx_CRH)

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

端口配置寄存器低 32 位

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

端口配置寄存器高 32 位

STM32 的每个 IO 口对应 4 位寄存器,低 2 位用于设置 IO 口输入还是输出以及输出的速 度,高 2 位用于设置对应输入或输出模式下的更具体的工作模式。

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

端口数据输入寄存器

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

端口数据输出寄存器

输入寄存器上对应位的值代表此时该位对应的 IO 引脚的电平状态,输出寄存器对应位 的值决定了此时该位对应的 IO 引脚输出的电平状态。这里可以发现输出寄存器都是以字的 形式读写的,不能单独对某一个位进行设置,当然,我们可以先读取此时寄存器的值然后对 某一位或者某几位进行位的操作,来达到只设置某一位或某几位的目的。例如:我想设置 PA2 输出高电平,有两种方法可以实现(他们等效只不过写法不同):

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

上面的不管是设置输出高电平还是低电平,他们的过程都是一样的:1. 读取 GPIOA 的 ODR 寄存器 16 位的值到临时变量

2. 修改临时变量

3. 将临时变量设置的值以字(16 位)为单位一次性写入到 GPIOA 的 ODR

这就涉及到读-改-写三个过程,假设此时设置 PA2 为 1,当执行到流程 1 或者 2 的 时候,中断发生了,在中断函数中把 PA2 设置为 0,但是退出中断后,程序继续执行流 程 3,也就是它又把 PA2 设置为 1,那么中断就不起作用了。这个问题就出在了对 ODR 设置的时间过长,因此 ST 为我们提供了端口位设置/清除寄存器来解决这个问题。(当 然上面所说的这种情况很少发生,但不代表不存在)

⚫ 端口位设置/清除寄存器(GPIO_BSRR/GPIO_BRR)

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

BSRR 寄存器

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

BRR 寄存器

有了位设置/清除寄存器,我们对 IO 引脚输出状态的设置就会在单写入周期完成,没有 读-改的过程,因此操作就更加安全。一般对 BSSR 或者 BRR 进行设置的时候直接一条语句搞 定: GPIOA->BSSR = 0x02; 另外一个寄存器就是端口配置锁定寄存器(GPIOx_LCKR),这里就不做过多讲解了,因为 用的不多,这个寄存器的作用就是把当前 GPIO 的设置给锁定,使得在下次单片机复位或者 重新上电之前我们都不能对 GPIO 再进行设置。

程序讲解

根据上面所讲的这些来开始我们点亮 LED 的学习。大家直接看代码:

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

LED 初始化函数

在控制外设之前我们都会设置外设的功能来满足我们的需求,这个过程就称之为初始化。 我们要驱动 LED 当然要设置 GPIO 为输出,并指定输出引脚,以及输出状态。我们在前几章 说过,要让外设工作就必须开启的时钟(这和 51 以及其他一些单片机不同,大家慢慢适应), 因此我们第一件事儿就是开启外设 GPIOB 的时钟,接着对定义的功能结构体进行设置,大家 要区分 GPIO_InitTypeDef 和 GPIO_TypeDef 结构体的区别,前者是设置 GPIO 属性的集合, 比如使用哪个引脚,工作的模式,输出的速度,而后者则是 GPIO 各个寄存器的集合。 如果大家对 GPIO 设置属性的参数感兴趣的话可以跳转到定义处查看,这里我们以 GPIO 工作模式为例向大家介绍一下:

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

GPIO 模式参数

可以看到除了推挽输出还有其他我们之前介绍过的模式。 在配置完 GPIO 的工作属性之后(引脚,模式,速度)之后通过 GPIO_Init(GPIOB,&GPIO_InitStructure);初始化 GPIO,GPIO 配置生效。该函数其实就是对我们之前讲解的寄存器进行操作,只不过在操作之前还做了很多诸如参数是否正确的判断等。 另外还用到了如下两个函数来点亮或者熄灭 LED:GPIO_SetBits(GPIOB, GPIO_Pin_5); GPIO_ResetBits(GPIOB, GPIO_Pin_5);

我们打开定义,可以看到:

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

GPIO 置位函数

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

GPIO 复位函数

与他们类似的函数还有 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)函数,只不过该内部是通过设置 ODR 寄存器实现的:

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

GPIO_Write 函数

在平时开发时还是前两者用的较多。 读到这有人会说:我怎么知道库函数有哪些呢?没关系,我们打开标准库函数文件夹, 会发现一个 CHM 文件:

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

库函数查看方法

打开这个文件,然后用到哪个外设就打开哪个外设的函数,然后点击那个数字就是这个 函数在对应文件中的行号。 此时 LED 的驱动就写完了,接着我们在 main 函数中调用 LED 驱动函数并实现用户业务 逻辑——LED 闪烁。

电子那点事:GPIO 输出实验_点亮 LED 软硬件超详细讲解

业务逻辑实现

函数中先对 LED 进行初始化,然后进入死循环,重复执行我们的业务代码。这里顺便 说一下可以使用 for(;;)代替 while(1),他们的效果是等同的。 因为现在我们还没有讲解精准的定时器延时,因此只是简单通过循环语句阻塞单片机重复的做无意义的事情来延时,我们将空循环执行了 100 万次换来的是 300ms 左右的延时。此 时我们编译链接程序然后烧录到开发板上并复位,可以看到 LED 在不停的闪烁。 本章 LED 就讲解到这里了,本章需要大家理解的知识很多,希望大家多动手慢慢消化。 本章的知识点主要是,GPIO 的通用功能(只作为 GPI用),GPIO 复用功能,GPIO 重映射, GPIO 的几种工作模式(开漏,推挽,浮空,上拉,下拉等)以及库函数如果使用。

相关阅读

关键词不能为空
极力推荐

电脑蓝屏_电脑怎么了_win7问题_win10问题_设置问题_文件问题_上犹电脑信息网

关于我们