技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
这个参考手册,比较重要。
还有芯片数据手册 datasheet
芯片手册
mini版的话
比如这里的PA9,PA10除了可以做下载,还可以是USART1的发送接口,和USART1_RX的接收接口。
下面是这个芯片的具体文档。
这个PA9,PA10是很重要的串口。
这个是每个IO口的内部的电路图。
加了FT的IO口是可以容忍5v的电压的,一般都是容忍3.3v的。加了FT,可以容忍5v表示。
这个时候,比如1输入了一个1高电平或者是0低电平,这个时候,这个0或1数据,通过黄色部分传输,这个时候VDD,VSS
是关闭的,这个TTL斯密特触发器是打开的,这个是把USB信号,转换为TTL信号,然后把数据,最终传入
输入数据寄存器,然后CPU就可以通过,读,去操作输入数据寄存器。
来获取输入的数据了。
这个就是输入浮空模式。
也就是在浮空状态下,可以读取外部的电平。
这个输入上拉模式,跟浮空模式的区别就是,当电平输入的时候,
比如输入了0,或者1 数据,数据传输到VDD的时候,
加一个30到50k的电阻。拉高电压。电压在电路走的过程中会有损耗之类的就可以用上拉电阻。
提高驱动能力。
这个是输入上拉模式。
下拉电阻是接地的,当电平不稳定,刚接上电源等的时候,就会打开,会把电平
强制设置为低电平。来保持系统稳定。
电压和电平的区别,电压一般用多大来说,一般是0到3.3v,
然后电平一般是高电平,低电平这样。
然后这个时候电压就是模拟信号,他经过的时候,斯密特触发器,会关闭,上拉电阻,下拉电阻也会
关闭。然后模拟信号会直接去给cpu。
下面看输出模式:
这里的开漏输出模式,指的是,当外设,输入一个1的时候,这个1首先存储在
位设置,清除寄存器中,然后再放入输出数据寄存器中,然后这个1,再输出到输出控制电路
然后这个是1的时候,N-MOS是关闭状态,这个时候,决定最终输出的,不是用户输入的1,而是
后面外部的上拉电阻还是下拉电阻。
上拉电阻高电平,下拉电阻低电平,也就是IO口处于浮空状态。
vss是接地低电平。
然后,如果输入的是0的时候,这个时候N-MOS是打开的,这个时候决定输出的是VSS
也就是输出低电平
注意,输出数据,这个是可以被CPU读取的,输出的电平可以存到输入数据寄存器中,被
cpu读取。但是要注意,由于当输入数据是高电平1的时候,由于决定数据最终是高电平还是低电平
是由后面的上拉电阻,还是下拉电阻决定的,所以cpu读取到的电平,有可能不是输入的高电平1,这个是
由后面的上拉电阻还是下拉电阻决定的。
当输入的是低电平的时候,由于N-MOS开启,这个时候N-MOS会把低电平拉到vss,也就低电平,所以这个
时候cpu读取的数据就是低电平。
这个开漏复用输出模式,这个和开漏输出模式,不同就是前面的输出数据,不是由CPU放到清除寄存器中的,
而是由外设模块,输出的数据。
这个推挽输出模式,跟开漏输出模式一样,比如CPU数据的高电平1,也是先放到数据数据寄存器中,
然后再经过输出控制电路,然后经过P-MOS,当是高电平1的时候,
P-MOS处于开的状态,N-MOS处于关的状态,输出高电平1,然后
最终CPU通过输入数据寄存器读取数据的时候,也是1
如果,Cpu输出的是低电平,这个饿时候,N-MOS开启,P-MOS关闭,最终通过IO口输出的是低电平1
注意,IO口输出的数据,同时也可以被Cpu读取到。
这个推挽复用输出模式,跟推挽输出模式,这个也是,数据来源不一样,这个来源于,
外设模块。通过复用功能输出。
IO口的几种输出模式的详细介绍,上面这个pdf中有。
这里要注意推挽输出,有高低电平,可以连接数字器件。
开漏输出,因为需要上拉,下拉电阻,所以他们只有强低电平,没有强高电平,高电平是内部上拉电阻实现的。
推挽和开漏的区别。
上面网址说的更详细。
每一组IO口,都包含上面的7个寄存器。
STM32F103ZET6有7组IO口,也就是有7*7 =49 个寄存器。
这个7组IO口,上面有写命名是GPIOA,GPIOB,....GPIOG
然后每组比如GPIOA有16个IO口。
也就是说,这16个GPIO口,就可以通过上面的7个寄存器来配置。
包含上面的7个寄存器。
端口配置低寄存器,为什么会有两个。
咱们的开发版是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口。
然后端口配置高寄存器,其实也是这样的。
这里继续看,可以看到:
4位控制一个IO口,那么由每两位组成,MODE 和 CNFO
这里的MODE 是用来表示是输入还是输出模式的,可以看到表中,00是输入,其余是输出。
,然后当MODE,比如是10,是输出模式,2mhz的速度的时候,如果CNFO是10,这个时候就是
下面的复用功能推挽输出模式。
如果是MODE是00输入模式的时候,CNFO是10,也就是上拉、下拉输入模式。
那么这里到底是用上拉,还是下拉呢?
那么,这里到底是上拉,还是下拉,这个是由ODR寄存器控制的。上面的位控制的。
这个后面再说。
端口配置高寄存器(GPIOX_CRH)这个就不说了,跟低是一样的。
端口输入寄存器,这个可以用来接收端口的数据。
可以看到16到31是保留的没有用。然后
这个端口输入寄存器,除了可以接收端口的数据,还可以给cpu读取,端口输出的数据来用,前面说过。
这个一组IO 是16个IO口。
STM32F103ZET6是7组,然后16个口,对应端口输入寄存器的0到15.
每个口可以存对应的电平内容。
端口输出数据寄存器的作用是,IO口输出低电平,里面就存0,IO口输出高电平,里面就存1
这里,也是对应的,他只用到了低16位。
对应一组io的,16个IO口。
比如PA0 对应的 第0位。
另外,端口输出数据寄存器ODR,还有一个作用可以用来,在输入模式的时候,判断是上拉,还是下拉
电阻。
这个具体是这样判断的。
比如,这里我把CRL这里的端口配置低寄存器,设置为了10 00
这里的00是输入模式,10是 输入模式中的上拉下拉输入模式。
这个时候,再去看ODR寄存器。
这里如果是PA0这个IO口,如果这里设置为0的话就是,下拉输入,如果1的话,就是上拉输入。
就是上面这个图表示的。
然后再来看BSRR寄存器。
其实BSRR寄存器的作用是用来设置,ODR这个输出数据寄存器的。
要理解端口位设置、清除寄存器 GPIOX_BSRR这个寄存器,先来看一下之前的原理图
可以看到,对于输出IO口数据的时候,有两种方式,
第一种是可以通过往位设置、清除寄存器中写入数据,这样间接的去往输出数据寄存器ODR中
写入数据。
第二种是也可以直接往输出数据寄存器中写入数据,这样也是可以的。
但是使用BSRR寄存器,间接的去写入数据有什么好处呢?
因为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有些重复。
另外锁定寄存器等,这个自己去看文档,这些不经常用。就不说了。
然后看:
这里,复用的意思是,同一个针脚,比如PA10 ,PA9可以用来当做IO口用,也可以用来,接一些外设这样来用
但是具体是做什么来用,可以理解为,当给这个PA10,PA9设置不同的模式的时候,他就有不同的作用。
对于哪些针脚,可以复用为串口和外设。可以看文档
比如这里PA9,PA10除了做USART串口还有TIM1 连接时钟的功能 。
另外这个针脚具体是怎么做到复用和映射的,后面有视频讲解。
然后映射的意思是,比如PA9,PA10这两个针脚,其实也可以映射到PB6,PB7这样,这样的话,目的
主要是为了布线方便。这个映射可以通过remap,配置来实现。
具体映射是怎么回事,后面视频有说。
然后对于stm32来说,所有的io口,都可以作为中断,使用,而51单片机好像就
只能有两个io口用来,中断使用。
后面会说,如何来用库函数,或者,直接操作寄存器,或者位操作,
来操作IO口。