一、GPIO的八种输入输出模式
GPIO端口的每个位可以由软件分别配置成八种输入输出模式。
1.1输入浮空模式
下图黄色区域是该种模式电路,此时上拉和下拉电阻的开关打开,施密特触发器打开。
在I/O口写入电平->进入输入驱动器->通过施密特触发器->进入输入数据寄存器,CPU读出
输入浮空一般多用于外部按键输入。在输入浮空状态下,I/O口的电平状态不确定,由外部决定。
1.2输入上拉模式
基本结构和输入浮空模式差不多,区别在于此时输入上拉电阻的开关闭合。
由于上拉电阻的存在,可以把I/O口上的不确定的信号上拉至高电平,也就是说此种模式下I/O口默认为高电平。
1.3输入下拉模式
基本结构和输入浮空模式差不多,区别在于此时输入下拉电阻的开关闭合。
由于下拉电阻的存在,可以把I/O口上的不确定的信号拉低至低电平,也就是说此种模式下I/O口默认为低电平。
1.4输入模拟模式
模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块。
1.5开漏输出
CPU在输出数据寄存器写入电平->输出控制电路。
只能输出强低电平,高电平需要上拉电阻拉高。
当写入高电平时,N-MOS管截止导致I/O口的电平不是高电平,而是由外部的上拉或下拉电阻决定。也就是说输出电平由外接的上拉或者下拉电阻确定。同时I/O口电平也可以由输入工作模式读取进去。
当写入低电平时,此时N-MOS管处于导通状态,I/O口的电平会被N-MOS管拉低至Vss(低电平),也就是说此时I/O口输出低电平。同时I/O口电平也可以由输入工作模式读取进去。
输出端相当于三极管的集电极,要得到高电平需要上拉电阻,适合于做电流型驱动吸收电流的能力相对较强(一般20mA以内)。
以下为具体实现结构:
输入高电平时,经过反相器,此时G点为低电平,UG=US,MOS管截止,输出电压由VDD决定,输出高电平;
输入低电平时,经过反相器,此时G点为高电平,UG>US,MOS管导通,输出电压被拉低至Vss(低电压);
图中N-MOS管中的二极管是寄生二极管,起到保护MOS管的作用。当DS极之间的电压过高时,这个寄生二极管会反向击穿,让大电流流入地中,从而保护了MOS管。
详解请看:MOS管知识通俗易懂教程 - 知乎
1.6开漏复用输出
可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用),端口必须配置成复用功能输出模式(推挽或开漏),同时得到高电平也需要上拉电阻。
1.7推挽输出
不需要上拉电阻即可实现高低电平的输出,可作为双向I/O口使用。
可以输出强高低电平,基本结构和开漏输出类似。
对于推挽输出控制电路输出为“1”时,P-MOS导通,N-MOS截止,I/O口输出高电平;
当控制电路输出为“0”时,P-MOS截止,N-MOS导通,I/O口输出低电平;
同时I/O口电平也可以由输入工作模式读取进去。
以下为具体实现结构:
输入高电平时,经过反相器,此时G点为低电平,NMOS管UG=US,NMOS管截止,而PMOS管Ugs>0,PMOS管导通,输出高电平(被VDD拉高);
输入低电平时,经过反相器,此时G点为高电平,PMOS管US=UG,PMOS管截止,而NMOS管UG>US,NMOS管导通,输出电压被拉低至Vss(低电压);
1.8推挽复用输出
GPIO口被用作第二功能时的配置的情况。
二、GPIO相关配置寄存器
stm32共有七组GPIO,分别为GPIOA~GPIOG;
每组GPIO共有16个I/O口,例如GPIOA0~GPIOA15;
每组GPI/O端口有:
两个32位配置寄存器
- GPIOx_CRL:端口配置低寄存器
- GPIOx_CRH:端口配置高寄存器
两个32位数据寄存器
- GPIOx_IDR:端口输入寄存器
- GPIOx_ODR:端口输出寄存器
一个32位置位/复位寄存器
- GPIOx_BSRR:端口位设置/清除寄存器
一个16位复位寄存器
- GPIOx_BRR:端口位清除寄存器
一个32位锁定寄存器
- GPIOx_LCKR:端口配置锁存寄存器
每组I/O口含有上面的七个寄存器,进而控制每组I/O的16个I/O口。
2.1端口配置寄存器
上面的两个32位端口配置寄存器(GPIOx_CRL和GPIOx_CRH)他们每四位才能控制一个I/O口,也就是说一个32位端口配置寄存器能控制32/4=8个I/O口,两个32为端口配置寄存器才能控制每组I/O的16个I/O口。
假设是GPIOA,CRL控制低八位(PA0~PA7),CRH控制高八位(PA8~PA15)
2.1.1端口配置低寄存器(GPIOx_CRL)
可以看到上图有16个小方块, 每个小方块包含两位,则两个小方块控制一个I/O口。
这四位中MODE0[1:0]控制输入输出的模式及输出模式的端口速率(看下图),看其英文MODE就是模式的意思。
CNF0[1:0]控制输入输出的哪种模式(看下图)
需要指出的是在输入模式下1 0 到底是上拉还是下拉模式,涉及到后面的寄存器,这里不做分析。
但是可以看下图先了解一下
2.1.2端口配置高寄存器(GPIOx_CRH)
CRL和CRH的作用是一样的,区别在于CRH控制标号为8~15的I/O口。
2.2端口数据输入寄存器(GPIOx_IDR)
IDR寄存器的低16位,每个位控制该组I/O的16个I/O口,每个位对应的是此I/O口的输入电平是高电平还是低电平。
2.3端口数据输出寄存器(GPIOx_ODR)
和IDR类似,ODR寄存器的低16位,每个位控制该组I/O的16个I/O口,每个位对应的是此I/O口的输出电平是高电平还是低电平。
前面提过,ODR寄存器还可以配置在输入模式下是上拉还是下拉,在输入模式下ODR可以配置成上拉或者下拉模式,在输出模式下可以配置I/O口的输出电平。
2.4端口位设置/清除寄存器(GPIOx_BSRR)
这个寄存器也可以配置I/O口输出是高电平还是低电平,它的低16位,可以设置I/O口输出模式。
假如设置为1,则对应的ODR寄存器的位为1,设置为0,则不对ODR寄存器对应的位产生任何影响。
而高16位则相反:
那么这样一来好像端口位设置/清除寄存器也能达到控制输出电平的目的?
前面我们学过原理图,CPU首先写入端口位设置/清除寄存器,然后由它达到控制端口数据输出寄存器的目的。
有些人觉得多此一举,明明都可以通过端口数据输出寄存器设置输出电平了为什么还要搞一个“太上皇”控制它呢?
欸,在某些实时场景里面大有作为!
我是初学者,不甚清除,看这个:
STM32F10x系列GPIO寄存器BRR、BSRR、ODR、IDR的使用理解(1) - 知乎
https://www.cnblogs.com/shangdawei/p/4723941.html
2.5端口位清除寄存器(GPIOx_BRR)
BRR寄存器实际上作用不是很大,作用和BSRR高16位的作用是一样的。所以在实际的使用过程中,我们通常使用BSRR的低16位,和BRR的低16位(所以BSRR的高16位不经常使用)
2.6端口配置锁存寄存器(GPIOx_LCKR)
用的比较少,暂时先不作讨论
三、stm32引脚说明
3.1端口复用功能
stm32有144个引脚,前面知道他有112个I/O口,那这样对于资源的分配就太不合理了,比如用于外设的资源就非常少了,所以STM32的大部分端口都具有复用功能。
所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。
作用:最大限度的利用端口资源
3.2端口重映射功能
就是可以把某些功能引脚映射到其他引脚。比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7
作用:方便布线文章来源:https://www.toymoban.com/news/detail-815719.html
待补充,待更新...文章来源地址https://www.toymoban.com/news/detail-815719.html
到了这里,关于STM32-GPIO工作方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!