STM32——GPIO知识梳理
一.GPIO
1.GPIO的简述
STM32的GPIO(General Purpose Input/Output,通用输入/输出)是微控制器上可编程的引脚,用于与外部设备进行数字信号交互,它挂载在APB2总线上,
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
它有以下几个基本特征:
- GPIO的基本结构以及分组
- GPIO的八种工作状态
- GPIO的寄存器控制
以上几个特性将在下面进行详细的展开叙述
2.GPIO的基本结构以及分组

GPIO基本结构如图所示,在STM32中所有的GPIO外设都是挂载在APB2总线上的,GPIO外设的名称按照ABCD等等依次命名,如GPIOA,GPIOB 等 ,对GPIO的控制和操作可以通过控制STM32的GPIO的寄存器直接操作或库函数(如HAL/LL/标准库)实现对应的引脚配置和电平操作(GPIO的电平范围在0-3.3V,部分GPIO可以到达5V。)来控制GPIO。
每个GPIO外设有16个金属引脚,以GPIOA为例,它的16个金属引脚分别为PA0,PA1,PA2等(即编号0-15),每个GPIO外设可以简单理解由寄存器和驱动器构成
其中寄存器是一个特殊的存储器可以通过APB2总线对其实现读写功能,寄存器由32个bit组成(也就是32位),寄存器的低16位的每一位对应一个金属引脚,(高16位没有用到)如图所示,
可以看到它的高16没有用到,只用到了低16位
如寄存器第0位对应的就是金属引脚PA0,对其写0就是输出低电平,写1就是输出高电平,反之如果对应金属引脚读取到低电平就是对应寄存器的那一位是0,读取到高电平就是对应寄存器那一位是1.,寄存器只起到存储数据的作用
驱动器是用来增强信号的驱动能力的,它负责控制引脚的输出能力、电平特性以及信号质量,对STM32外设的一些驱动不仅依靠对寄存器的读写操作还依靠驱动器来增强驱动能力
了解了GPIO的整体框架和结构后,下面进行GPIO某一位具体结构的叙述,如图所示为GPIO某一具体位的结构框图,以下以GPIOA的PA0端口举例,


我们先来观察一下绿色所框选出来部分的金属引脚PA0的结构,可以看出它由两个三个结构组成一个电源正负极VDD和VSS ,两个保护二极管,还有一个金属IO引脚

这两个保护二极管有着保护电路的作用,下面进行先说一下接VDD的那个二极管的作用,当输入电压高于该GPIO外设最高电压时候,接VDD的保护二极管将会导通,电流呈现这样的流向

将不会进入到内部电路从而起到保护内部电路的作用
接着再来看下面那个保护二极管的作用,当输出的电压低于GPIO外设最低电压范围也就是0V以下,下面的保护二极管将会导通,它的电流流向将会呈现如图所示的流向,它将会直接从VSS流向外部,从而起到保护内部电路的作用

接下来我们再看第一个图中的蓝色框部分,先看上半部分也就是输入驱动器的部分,可以明显看出来它由三部分组成,输入数据寄存器 ,施密特触发器(肖特触发器)和 上拉电阻(VDD)和下拉电阻(VSS)

先看黄色框中的部分,它有三种组合方式,

- 上面导通下面断关就是上拉输出模式(默认高电平模式)
- 下面导通上面断开就是下拉输出模式默认低电平模式)
- 上面和下面都断开就是浮空输出模式
上拉输出模式和下拉输出模式作用就是给输入提供一个默认的电压,因为输入只有高低电压,当你没有操控这个IO口时候,如果你不给定一个电压,那么它就是一个不稳定不确定状态容易受到外界的干扰和产生波动,所以上下拉输出模式就是为了解决这种不稳定的问题,其中上拉输出模式就是当你没有对这个IO口进行操作时候它默认输出高电平,同理下拉输出模式就是当你没有对这个IO口进行操作时候它默认输出低电平
再来看红色框部分施密特触发器(肖特触发器)

由于输入的电压(实际是数字信号)是具有波动性(数字信号的失帧)的,它时高时低不稳定,为了让电压稳定下来就在电路装了一个施密特触发器(肖特触发器),它的主要作用就是对输入电压进行整形的调整,当输入的电压大于某一阈值它就会变为输出高电压状态,当输出电压低于某一阈值它就会变为输出低电压的状态,从而达到稳定的输入电压状态
最后再来看绿色框部分输入数据寄存器

经过施密特触发器(肖特触发器)的调整输入的电压是稳定的 最后就会输入到输入数据寄存器里面高电平为1 低电平为0,我们再通过程序读取该寄存器这一位的数据就知道IO口是高电平还是低电平了
了解完输入部分,我们再来看输出的部分也就是如图所示的部分

如图所示输出的部分可以分为两个部分,寄存器(位置设\清除寄存器和输出数据寄存器)和两个MOS管(上面是P-MOS下面是N-MOS类似于一种信号开关,通过信号来控制开关与否)

先看蓝色部分,它同样有三种组合方式
- P-MOS和N-MOS均有效时候是推挽输出模式(强推输出模式)
- P-MOS无效和N-MOS有效时候是开漏输出模式
- P-MOS和N-MOS均无效时候是输出关闭模式
- P-MOS和N-MOS均有效推挽输出模式(强推输出模式):当数据寄存器对应位为1时候,上面 P-MOS导通,下面N-MOS断开,输出直接接到VDD,输出高电平,数据寄存器对应位为0时候,上面 P-MOS断开,下面N-MOS导通,输出直接接到VSS,输出低电平
- P-MOS无效和N-MOS有效开漏输出模式::当数据寄存器对应位为1时候,,下面N-MOS断开,变成高阻状态,,数据寄存器对应位为0时候,下面N-MOS导通,输出直接接到VSS,输出低电平
- P-MOS和N-MOS均无效时候是**关闭模式*:端口的电平由外部信号控制
3.GPIO的八种工作模式
GPIO的八种工作模式的基本介绍


1.浮空输入,上拉输入,下拉输入的基本框图

可以看到当输入模式时候,输出驱动器是断开的,也就是只有输入有效,输出无效的一种状态,三种模式的配置跟前面的讲解一样

2.模拟输入的基本框图(ADC用的输入方式)

可以看到这个施密特触发器(肖特触发器)是没有用的也就是可以简单理解成这样的一个线路

3.推挽输出和开漏输出基本框图

可以看到当是输出状态时候,输入驱动器是导通的也就是有效的,也就是说在输出的同时也能输入,输入输出互不影响,两种模式的配置跟前面讲解的一样

4.复用开漏/推挽输出基本框图
输出的线路可以简单理解为如图所示

在分流部分具体走蓝色的还是红色的就取决于具体是复用开漏还是复用推挽了还有复用功能输出线的数字信号了
4.GPIO的寄存器控制
讲解了上面几个工作模式那么具体的我们如何用软件来实现对寄存器的控制配置从而实现对GPIO的工作模式的配置呢,参考数据手册不难得到具体配置方法,下面罗列出数据手册对这块的配置讲解


仔细观察华能看到输出模式的一个速度限制,对其速度的配置也就是限制IO口翻转速度的大小,从而实现低耗功能一般默认为50MHz
前面我们在讲解输出部分时候 也就是图示部分
在这块我们说到了位设置寄存器\清楚寄存器那么我们具体怎么通过配置它们来实现位设置和清除功能呢?
参考数据手册后我们就能得到回答了如图所示

- 红色框高16位部分就是清除位的操作,通过黄色框的讲解我们就能实现清除特定位的的功能
- 蓝色框低16位部分就是设置位的操作,通过黄色框的讲解我们就能实现设置特定位的的功能
接下来再看这个端口位清除寄存器,它的作用跟上面的端口位设置\清除寄存器的红色框高16位部分就是清除位的操作是一样的,至于为什么要有这个 是为了方便我们同时进行清除和设置操作,如果我们对某一特定位进行用第一个寄存器也就是端口位设置\清除寄存器的话可能有先后之分即先进行位设置后进行位清除,有时序的差,但是用下面这个端口位清除寄存器就能实现清除和设置位同步了,一般来说我们要对多位设置或者清除用端口位设置\清除寄存器,要实现同时的位设置和清除用端口位清除寄存器

本文材料参考
STM32入门教程-2023版 细致讲解 中文字幕


1946






