STM32工作笔记0022---STM32F1开发版 GPIO口工作原理

 技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第1张图片

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第2张图片

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第3张图片

这个参考手册,比较重要。

还有芯片数据手册 datasheet

芯片手册

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第4张图片

 

mini版的话

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第5张图片

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第6张图片

比如这里的PA9,PA10除了可以做下载,还可以是USART1的发送接口,和USART1_RX的接收接口。

下面是这个芯片的具体文档。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第7张图片

 

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第8张图片

这个PA9,PA10是很重要的串口。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第9张图片

这个是每个IO口的内部的电路图。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第10张图片

加了FT的IO口是可以容忍5v的电压的,一般都是容忍3.3v的。加了FT,可以容忍5v表示。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第11张图片

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第12张图片

 

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第13张图片

这个时候,比如1输入了一个1高电平或者是0低电平,这个时候,这个0或1数据,通过黄色部分传输,这个时候VDD,VSS

是关闭的,这个TTL斯密特触发器是打开的,这个是把USB信号,转换为TTL信号,然后把数据,最终传入

输入数据寄存器,然后CPU就可以通过,读,去操作输入数据寄存器。

来获取输入的数据了。

这个就是输入浮空模式。

也就是在浮空状态下,可以读取外部的电平。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第14张图片

这个输入上拉模式,跟浮空模式的区别就是,当电平输入的时候,

比如输入了0,或者1 数据,数据传输到VDD的时候,

加一个30到50k的电阻。拉高电压。电压在电路走的过程中会有损耗之类的就可以用上拉电阻。

提高驱动能力。

这个是输入上拉模式。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第15张图片

下拉电阻是接地的,当电平不稳定,刚接上电源等的时候,就会打开,会把电平

强制设置为低电平。来保持系统稳定。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第16张图片

电压和电平的区别,电压一般用多大来说,一般是0到3.3v,

然后电平一般是高电平,低电平这样。

然后这个时候电压就是模拟信号,他经过的时候,斯密特触发器,会关闭,上拉电阻,下拉电阻也会

关闭。然后模拟信号会直接去给cpu。

下面看输出模式:

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第17张图片

这里的开漏输出模式,指的是,当外设,输入一个1的时候,这个1首先存储在

位设置,清除寄存器中,然后再放入输出数据寄存器中,然后这个1,再输出到输出控制电路

然后这个是1的时候,N-MOS是关闭状态,这个时候,决定最终输出的,不是用户输入的1,而是

后面外部的上拉电阻还是下拉电阻。

上拉电阻高电平,下拉电阻低电平,也就是IO口处于浮空状态。

vss是接地低电平。

然后,如果输入的是0的时候,这个时候N-MOS是打开的,这个时候决定输出的是VSS

也就是输出低电平

注意,输出数据,这个是可以被CPU读取的,输出的电平可以存到输入数据寄存器中,被

cpu读取。但是要注意,由于当输入数据是高电平1的时候,由于决定数据最终是高电平还是低电平

是由后面的上拉电阻,还是下拉电阻决定的,所以cpu读取到的电平,有可能不是输入的高电平1,这个是

由后面的上拉电阻还是下拉电阻决定的。

 

当输入的是低电平的时候,由于N-MOS开启,这个时候N-MOS会把低电平拉到vss,也就低电平,所以这个

时候cpu读取的数据就是低电平。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第18张图片

这个开漏复用输出模式,这个和开漏输出模式,不同就是前面的输出数据,不是由CPU放到清除寄存器中的,

而是由外设模块,输出的数据。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第19张图片

这个推挽输出模式,跟开漏输出模式一样,比如CPU数据的高电平1,也是先放到数据数据寄存器中,

然后再经过输出控制电路,然后经过P-MOS,当是高电平1的时候,

P-MOS处于开的状态,N-MOS处于关的状态,输出高电平1,然后

最终CPU通过输入数据寄存器读取数据的时候,也是1

如果,Cpu输出的是低电平,这个饿时候,N-MOS开启,P-MOS关闭,最终通过IO口输出的是低电平1

注意,IO口输出的数据,同时也可以被Cpu读取到。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第20张图片

这个推挽复用输出模式,跟推挽输出模式,这个也是,数据来源不一样,这个来源于,

外设模块。通过复用功能输出。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第21张图片

IO口的几种输出模式的详细介绍,上面这个pdf中有。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第22张图片

这里要注意推挽输出,有高低电平,可以连接数字器件。

开漏输出,因为需要上拉,下拉电阻,所以他们只有强低电平,没有强高电平,高电平是内部上拉电阻实现的。

推挽和开漏的区别。

上面网址说的更详细。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第23张图片

每一组IO口,都包含上面的7个寄存器。

STM32F103ZET6有7组IO口,也就是有7*7 =49 个寄存器。

这个7组IO口,上面有写命名是GPIOA,GPIOB,....GPIOG

然后每组比如GPIOA有16个IO口。

也就是说,这16个GPIO口,就可以通过上面的7个寄存器来配置。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第24张图片

包含上面的7个寄存器。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第25张图片

端口配置低寄存器,为什么会有两个。

咱们的开发版是STM32,也就是是32位的,但是配置每个IO口,需要4个位。

也就是CRL/CRH每四个位控制一个IO口,CRL控制标号的0-7口。

CRH控制标号的8-15口。

32 /4 =8 一个寄存器32位可以控制8个IO口

但是一组有16个IO口,所以需要两个寄存器。

这里比如GPIOA-CRL这个端口配置低寄存器,这组IO口。

咱们说一组IO口,包含16个IO口。

这个GPIOA-CRL端口配置低寄存器,有32位,对应的是PA0--PA7端口。

每个IO口占用4位,一共是8个IO口。

然后端口配置高寄存器,其实也是这样的。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第26张图片

这里继续看,可以看到:

4位控制一个IO口,那么由每两位组成,MODE 和 CNFO

这里的MODE 是用来表示是输入还是输出模式的,可以看到表中,00是输入,其余是输出。

,然后当MODE,比如是10,是输出模式,2mhz的速度的时候,如果CNFO是10,这个时候就是

下面的复用功能推挽输出模式。

 

如果是MODE是00输入模式的时候,CNFO是10,也就是上拉、下拉输入模式。

那么这里到底是用上拉,还是下拉呢?

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第27张图片

那么,这里到底是上拉,还是下拉,这个是由ODR寄存器控制的。上面的位控制的。

这个后面再说。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第28张图片

 

端口配置高寄存器(GPIOX_CRH)这个就不说了,跟低是一样的。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第29张图片

端口输入寄存器,这个可以用来接收端口的数据。

可以看到16到31是保留的没有用。然后

这个端口输入寄存器,除了可以接收端口的数据,还可以给cpu读取,端口输出的数据来用,前面说过。

这个一组IO 是16个IO口。

STM32F103ZET6是7组,然后16个口,对应端口输入寄存器的0到15.

每个口可以存对应的电平内容。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第30张图片

端口输出数据寄存器的作用是,IO口输出低电平,里面就存0,IO口输出高电平,里面就存1

这里,也是对应的,他只用到了低16位。

对应一组io的,16个IO口。

比如PA0 对应的 第0位。

另外,端口输出数据寄存器ODR,还有一个作用可以用来,在输入模式的时候,判断是上拉,还是下拉

电阻。

这个具体是这样判断的。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第31张图片

比如,这里我把CRL这里的端口配置低寄存器,设置为了10 00

这里的00是输入模式,10是 输入模式中的上拉下拉输入模式。

这个时候,再去看ODR寄存器。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第32张图片

这里如果是PA0这个IO口,如果这里设置为0的话就是,下拉输入,如果1的话,就是上拉输入。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第33张图片

 

 

就是上面这个图表示的。

然后再来看BSRR寄存器。

其实BSRR寄存器的作用是用来设置,ODR这个输出数据寄存器的。

要理解端口位设置、清除寄存器 GPIOX_BSRR这个寄存器,先来看一下之前的原理图

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第34张图片

可以看到,对于输出IO口数据的时候,有两种方式,

第一种是可以通过往位设置、清除寄存器中写入数据,这样间接的去往输出数据寄存器ODR中

写入数据。

第二种是也可以直接往输出数据寄存器中写入数据,这样也是可以的。

但是使用BSRR寄存器,间接的去写入数据有什么好处呢?

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第35张图片

因为BSRR寄存器,有个特点就是比如以低16位为例子,

设置了BS0为1,其他为0的时候,这个时候也是BS0就设置为了1,其他的设置为0以后就是不受影响的。

所以,如果想把某位设置为1,只需要把这位设置为1,其他的位设置为0就可以了,

这样间接的设置,就会,往ODR寄存器对应的位置上设置为1,而其他位置上保持原来的数据,保持不变。

 

而直接操作ODR的话,因为ODR是设置为什么就是什么的。

这个时候因为尤其在实时系统里,在编程的时候经常需要做这样的操作,

先把ODR的值读进来,进行分析以后,然后再给ODR寄存器,再写入一个值,其他的位保持不变。

 

而对于BSRR就比较方便,咱们只需要设置对应的位为1,其他位为0,这样就不用管其他位了,其他位就不会变,避免了错误

操作等。

 

就像上面写的一样,BSy 低16位他的作用是,设置为1,就是ODRY对应的位设置为1,其他位设置为0,对对应的ODRY位没有影响

BRy对于高位,16到31位,这个设置为0是对对应的ODRY位没有影响,设置为1,是吧对应的ODRY位设置为0

如果同时设置了BRY,BSY对应的位,那么BSY有用。

再看BRR,端口位清除寄存器。

这个寄存器的作用跟上面说的BSRR寄存器的,高位16--31位的功能是一样的,

所以在使用的时候一般是使用BSRR的低16位和BRR的低16位,BSRR的高16位一般不怎么用。

 

这个是针对于STM32F103ZET6来说的,对于STM32F4系列的,这里就经过优化了,好像就没有BRR寄存器了。

因为功能跟BSRR有些重复。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第36张图片

另外锁定寄存器等,这个自己去看文档,这些不经常用。就不说了。

然后看:

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第37张图片

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第38张图片

 

这里,复用的意思是,同一个针脚,比如PA10 ,PA9可以用来当做IO口用,也可以用来,接一些外设这样来用

但是具体是做什么来用,可以理解为,当给这个PA10,PA9设置不同的模式的时候,他就有不同的作用。

 

对于哪些针脚,可以复用为串口和外设。可以看文档

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第39张图片

比如这里PA9,PA10除了做USART串口还有TIM1 连接时钟的功能 。

另外这个针脚具体是怎么做到复用和映射的,后面有视频讲解。

然后映射的意思是,比如PA9,PA10这两个针脚,其实也可以映射到PB6,PB7这样,这样的话,目的

主要是为了布线方便。这个映射可以通过remap,配置来实现。

具体映射是怎么回事,后面视频有说。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第40张图片

然后对于stm32来说,所有的io口,都可以作为中断,使用,而51单片机好像就

只能有两个io口用来,中断使用。

STM32工作笔记0022---STM32F1开发版 GPIO口工作原理_第41张图片

后面会说,如何来用库函数,或者,直接操作寄存器,或者位操作,

来操作IO口。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(硬件嵌入式)