打印
[其他ST产品]

认识STM32的 GPIO口

[复制链接]
3517|80
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qsrg51|  楼主 | 2024-1-31 15:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
正式进入STM32的实际开发过程,此系列选用寄存器开发,从最底层操作,通过查看手册配置寄存器来实现对应的功能,整个过程记录下来会显得有些臃肿,全文结构大概是前面部分介绍理论知识,后半部分介绍实操以及代码。笔者尽量做的简洁点,文中如有不足,希望各位提出指正。

认识GPIO
GPIO是什么
首先,我们需要知道GPIO是个什么东西,对于这种问题,咱还是老套路,先问问“C知道”。



感觉说的不够清楚,我们再看看百度百科的回答。
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。
既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。
嗯,看了百度解释,想必学过51系单片机或者其他系单片机的同学已经有了一个大致答案,功能和51的P0-P3类似,做输入、输出或输入输出都做,那他肯定就是和51单片机差不多引脚了吧。
对于没学过其他系单片机的同学可能还是一头雾水,我知道你很懵但你先别懵,我给你个答案,
通俗来讲,GPIO就是STM32上的大部分引脚,就是如下图所示红圈里的大多数。




使用特权

评论回复
沙发
qsrg51|  楼主 | 2024-1-31 15:45 | 只看该作者
注意提取关键字,我说的是大多数,并不是说所有,这就说明二者不能打等号。


那么这二者有什么区别呢,我们再看一张图,这个图具体标注了上面的芯片每个脚对应的名称。

使用特权

评论回复
板凳
qsrg51|  楼主 | 2024-1-31 15:45 | 只看该作者
细细观察,这里面的脚似乎还挺有规律
1.大部分是PA0-15,PB0-15…PE0-15这部分就是上面说到的GPIO,也就是说,STM32中PXX这种标号的就是GPIO口,他们可以做输入、输出也可以既做输入又做输出;
2.剩下一大部分是VDD、VSS、VREF、VDDA、VSSA这些,这部分在昨天的硬件介绍中提到了,就是STM32的各类电源组,他们是为整个单片机提供能源输入的接口;
3.还有NRST、BOOT0这些就是昨天最小系统中写到的引脚。
好了,到这儿,我们对GPIO是什么有了一个概念,接下解决第二个问题

使用特权

评论回复
地板
qsrg51|  楼主 | 2024-1-31 15:45 | 只看该作者
GPIO有什么用
还是看个图吧,我们知道STM32内部有着各种各样的片内外设,GPIO也是片内外设的一种但是他与其他片内外设有着一个很大的区别,从下图可以看出,GPIO的位置在整个芯片的外围,只有它能够和外界接触,整个芯片的所有片上外设以及内核要和外部传递交换信息都必须经过GPIO才能实现,他是连接单片机内部和外部的通道,它既可以将内核以及其他片内外设的信息传递出来(输出),也可以将片外外设的信息传递给内核或者片内外设(输入),有时候兼顾输入输出的功能。

使用特权

评论回复
5
qsrg51|  楼主 | 2024-1-31 15:46 | 只看该作者
好了,关于GPIO有什么用,我们也有了基本的认知,接下来,我们需要搞定今天的重点内容,怎么用。

GPIO怎么用
在探究怎么用之前,还需要补充一点STM32上有关GPIO的相关内容:

使用特权

评论回复
6
qsrg51|  楼主 | 2024-1-31 15:46 | 只看该作者
STM32上GPIO的命名以及数量
关于STM32上GPIO命名以及数量的问题,这个之前在芯片手册那一段有提到过。
GPIO的端口号是从PA、PB——PI;一共9个端口号,每个端口号上有0-15共16个管脚号,也就是说,理论上一块STM32单片机有着16*9=144个GPIO。
看到这,有的同学会有问题,你数理论上有144个GPIO,可是你上面的这个STM32F407VE就只有100个脚,而且还有那么多是电源和最小系统的专用脚,你这前后不对啊。
是的,我们的F407VE确实没有144个GPIO,还记得我们之前在芯片命名处做过介绍吗,根据命名的不同,芯片引脚数量是不一样的,这中间省略掉的就是GPIO的数量。144个GPIO对于大多数项目来说太多了,造成了资源浪费。这也是为什么芯片型号如此丰富的原因了,我们在项目中选择主控一定要注重适用性。
这里我们再拿STM32F407VE的芯片手册图来做个细致介绍,如下图所示:

使用特权

评论回复
7
qsrg51|  楼主 | 2024-1-31 15:46 | 只看该作者
STM32F407VE一共有82个GPIO口,
其用到的GPIO端口号和管脚为:

使用特权

评论回复
8
qsrg51|  楼主 | 2024-1-31 15:46 | 只看该作者

使用特权

评论回复
9
qsrg51|  楼主 | 2024-1-31 15:47 | 只看该作者

使用特权

评论回复
10
qsrg51|  楼主 | 2024-1-31 15:47 | 只看该作者
由此可见此款单片机一共有80个GPIO口,如果使用内部时钟的话,还可以扩展出GPIOH0与GPIOH1这两个外部时钟引脚。

使用特权

评论回复
11
qsrg51|  楼主 | 2024-1-31 15:47 | 只看该作者
GPIO口的框图(重点)
接下来,就是本文的第一个大重点了,关于GPIO框图的解释,通过这个图,我们需要基本弄清楚,1.GPIO口的输入,输出模式;2.每种模式对应的作用;3.使用GPIO不同模式时需要使用哪些片内外设,需要使用哪些寄存器。
编程手册中关于GPIO的结构图介绍如下图所示,官方是将所有模式以及输入输出整合在一张图上面,为了方便理解,我们来做个拆分。

使用特权

评论回复
12
qsrg51|  楼主 | 2024-1-31 15:49 | 只看该作者
输入框图解析
对上图稍微做了一个拆分,如下图所示,此图为GPIO的输入框图。
首先,从最左边开始介绍,从图中我们可以看出,最终输入单片机内核的方式一共有三种,第一种是经过ADC的模拟输入、第二种经过其他片上外设的复用输入,第三种是最下面的经过输入数据寄存器后直接输入给内核的,接下来我们来看一看这三种输入的介绍。
————————————————

使用特权

评论回复
13
qsrg51|  楼主 | 2024-1-31 15:49 | 只看该作者
三种输入模式
1.模拟输入:模拟输入模式,见名知意,就是从片外外设输入进来的信号是模拟量。
这里需要对模拟量与数字量做个区分,我们都知道,单片机也好,电脑也好,他们所能识别以及处理的始终是二进制数,也就是0101000…的数据串,这个1010100…组成的数据串就是数字量,通俗点说就是0和1,我数字量0和1对应的模拟量电压的低电平与高电平;那么什么是模拟量呢,就比如我们常见的电压、温度、湿度等等这些都叫做模拟量,总之就是需要经过一定的电路转换后才可以被单片机和电脑识别的量就是模拟量。
也正是因为单片机的内核无法直接识别模拟量的输入,所以外设的模拟量信号在进入芯片后,需要经过上图中浅绿色的ADC这个模拟量转数字量的片上外设才可以,也就是说,这种输入模式是专门用来处理模拟信号的,当我们确定输入量是模拟量时就必须将GPIO配置成为模拟输入模式。

使用特权

评论回复
14
qsrg51|  楼主 | 2024-1-31 15:49 | 只看该作者
2.复用输入:关于复用输入模式,在弄清楚了上面的模拟输入后就可以对照了,既然为ADC专门开辟了一条输入道路,其他的片上外设自然也得争取一下,所以就有了复用输入模式,这个复用输入与模拟输入的最大不同在于,其接收到的信号都是数字量,只是根据不同的片上外设需求对这些数字量进行了定义,封装,打包,在输入内核之前,需要经这些对应协议的片上外设进行解析,拆包,然后再转交给内核处理。类似SPI、I2C、UART这些片上外设都是需要使用到这个模式的,当我们确定输入量需要使用这些片上外设进行加工时就必须使用此模式。

使用特权

评论回复
15
qsrg51|  楼主 | 2024-1-31 15:49 | 只看该作者
3.通用输入:最后一种输入模式,就是通用输入模式,说白了就是输入状态只有0与1两种状态,类似按键的按下、未按下,某种传感器的阈值超标或者没超标之类的只涉及开与关的监测时,就是使用此模式。

GPIO输入时内部器件及其作用
至此,关于GPIO的三种输入模式我们已经搞清楚了,但是图中还有一些器件的用处没有提到,下面来做个简单的介绍:(从右至左来看)

使用特权

评论回复
16
qsrg51|  楼主 | 2024-1-31 15:49 | 只看该作者
3.通用输入:最后一种输入模式,就是通用输入模式,说白了就是输入状态只有0与1两种状态,类似按键的按下、未按下,某种传感器的阈值超标或者没超标之类的只涉及开与关的监测时,就是使用此模式。

GPIO输入时内部器件及其作用
至此,关于GPIO的三种输入模式我们已经搞清楚了,但是图中还有一些器件的用处没有提到,下面来做个简单的介绍:(从右至左来看)

使用特权

评论回复
17
qsrg51|  楼主 | 2024-1-31 15:50 | 只看该作者
.保护二极管
1.当外设信号进来之后首先经过的是上下各有一个保护二极管的位置,这两个二极管,可以成为钳位二极管,也就是将输入的电压控制IO口可以接受的范围内,当外界输入信号的电压高于VDD_FT时,上半部分的保护二极管会导通,将高电压带走,以此来保护IO以及单片机内部电路如下图所示:、

使用特权

评论回复
18
qsrg51|  楼主 | 2024-1-31 15:50 | 只看该作者
同样,当输入信号的电压低于VSS时,下半部分的保护二管会导通,形成一个反向回路,从而保护IO口不被烧毁。、、

使用特权

评论回复
19
qsrg51|  楼主 | 2024-1-31 15:50 | 只看该作者
2.上下拉电阻(可配置)
2.经过保护电路后,会看到如下图所示的两个可编程控制的上下拉电阻,关于这两个电阻,一般是不会使用的,原因是其上下拉的能力有限,不是很稳定,为了保证良率,一般都是采取IO口外部在上下拉电阻来实现,这个在明天的按键输入编程中会有所体现。当然也有部分厂家会节约成本,就是用内部上拉下拉来实现控制IO口的初始状态,这种现象我们遇到了在来介绍。在这里我们只需要知道这个电路使我们程序里面可以控制的即可。
上拉电阻:上拉功能,IO口空闲时间保持高电平,
下拉电阻:下拉功能,IO口空闲时间保持低电平。

使用特权

评论回复
20
qsrg51|  楼主 | 2024-1-31 15:51 | 只看该作者
注意这个上下拉电阻,是已经硬件连接在IO口上了,无论GPIO是输入模式还是输出模式它都存在,只是输出模式的时候会配置为浮空,不需要使用到它。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

395

帖子

2

粉丝