STM32——GPIO简介

1.GPIO即通用输入输出口,可配置为8种输入输出模式

2.引脚电平:0V-3.3V,部分引脚可容忍5V

3.输出模式下可控制端口输出高低电平,用以驱动LED,控制蜂鸣器,模拟通信协议输出时序等

4.输入模式下可读取端口的高低电平或电压,用于读取按键输入,外接模块电平信号输入,ADC电压采集,模拟通信协议数据等

GPIO挂载在APB2总线上,分别为GPIOA,B,C等。每个GPIO外设共有16个引脚,编号是从0-15. 

成为PA0,1,2.。。

每个GPIO包含寄存器,和驱动器,寄存器是一段特殊功能的存储器,可以通过APB2进行读写。这样就可以完成输出电平和读取电平的功能了。

寄存器的每一位对应一个引脚,输出寄存器写1,输出高电平,0输出低电平,输入寄存器读取为1,说明目前端口为高电平,读取为0就是低电平。

寄存器是32位,端口是16位,所以寄存器只有低16位有输入输出功能。寄存器只负责存储数据,如果要进行点灯的操作,需要驱动器增加驱动能力。

 结构包括3个寄存器,驱动器,IO引脚,上面是输入部分,下面是输出部分。

右边输入部分两个二极管用来保护电路,上面的二极管接VDD3.3v,下面接VSS。如果输入电压大于3.3V则二极管导通,输入电压产生的电流就会流入Vdd而不会流入内部电路。这样就可以避免过高电压对内部电路产生伤害。如果输入电压低于0V,这个电压是相对于Vss的电压,所以是可以有负电压的。这时下方的二极管就会导通,电路会从Vss直接溜出去,而不会从内部汲取电路,也是保护内部电路的。输入电压在0-3.3V时,两个二极管不会导通,这时二极管对电路没有影响。

接下来输入就到了一个上拉电阻和下拉电阻的地方,有两个开关。这两个开关可以通过程序进行控制,上面导通,下面断开,就是上拉输入模式,反之就是下拉,都断开就是浮空模式。上下拉的作用就是为了给输入提供一个默认的输入电平,因为对于一个数字的端口,输入不是高电平就是低电平,如果输入不接,输入就属于浮空状态,引脚极易受到外界干扰,所以为了避免引脚悬空导致的输入数据不确定,就需要加上上拉或者下拉电阻。接入上拉电阻,当引脚悬空时,有上拉电阻保证引脚的高电平,所以上拉输入称为默认高电平输入模式,反之低电平输入。

接下来是肖特基触发器(实际上是施密特触发器),作用是对输入电压进行整形,实行逻辑是如果输入电压大于某一阈值,输出就会瞬间升为高电平,小于就会瞬间降为低电平。

由于引脚的波形是外界输入的,是数字信号,但是数字信号实际情况下可能会产生各种失真。有了施密特触发器的时候,低于上线输出高,低于上线输出低,虽然电平低于上线,但是不会触发施密特触发器,只有高于才会。这里使用了两个阈值,中间留有一定的空间。

经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,用程序读取输入数据寄存器对应的某一位数据,就可以 知道端口的输入电平,

最后上面还有两路线路,这些就是连接到片上外设的一些端口。有模拟输入,这是连到ADC上的,因为ADC需要接收模拟量,这根线是接到施密特触发器前面的。

另一个是复用功能输入,这是连接到其他需要读取端口外设上的。比如串口的输入引脚等,这根线接受的是数字量,所以连到施密特触发器后面。

接下来是输出部分:

数字部分可以由输出数据寄存器或片上外设控制,两种控制方式通过数据选择器接到了输出控制部分,如果选择通过输出寄存器进行控制,就是普通的IO口输出。写数据寄存器的某一位就可以操作对应的某个端口了。左边还有一个位设置/清楚寄存器,这个可以用来单独操作输出数据寄存器的某一位,而不影响其他位。

因为输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制其中某一个端口而不影响其他端口的话,就需要一些特殊的操作方式,第一种方式就是先读出这个寄存器,然后按位与和按位或的方式更改某一位。最后再将更改后的数据写回去,在C语言中就是&=和|=的操作。

第二种就是通过位设置和位清楚寄存器,如果要对某一位进行置1的操作,在位设置寄存器的对应位写1即可。剩下不需要操作的位写0,这样它内部就会有电路,自动将输出数据寄存器中对应位位置为1,剩下的0保持不变。这样就保证只操作其中某一位而不影响其他为,并且这是一步到位的操作。如果相对某一位进行清零,就在位清除寄存器的对应位写1即可。

第三种操作方式就是读写STM32中的“位带”区域,这个位带的作用和51中位寻址差不多。STM32中有一段地址区域映射了段地址中所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位。

输出控制之后就是2个MOS管,上面是PMOS,下面是NMOS,通过信号来控制,MOS管负责将IO口接到VDD或者VSS。

可以选择推挽,开漏或关闭三种输出方式。

(1)推挽输出模式下,P.NMOS管都有效,

数据寄存器为1,上管导通,下管断开,输出直接接到VDD,就是输出高电平

数据寄存器为0,上管断开,下管导通,输出直接接到VSS,就是输出低电平

这种模式下高低电平均有较强的驱动能力,所以推挽输出模式也可以叫强推输出模式,在这个模式下STM32对IO口具有绝对的控制权,高低电平都由STM32说的算,

(2)开漏输出模式下,P-MOS无效,只有N-MOS工作

数据寄存器为1,下管断开,相当于输出断开,也就是高阻模式

数据寄存器为0,下管导通,输出接到VSS,也就是输出低电平

这种模式下只有低电平有驱动能力,高电平没有驱动能力,作用是作为通信协议的驱动方式,比如I2C通信的引脚就是开漏模式。

在多机通信的情况下,这个模式可以避免各个设备的相互干扰,另外开漏模式还可以用于输出5V电平信号,比如在IO口外接一个上拉电阻到5V的电源,当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻拉高至5V,这样就可以输出5V的电平信号,用于兼容5V的设备。这就是开漏输出的主要用途。

(3)关闭状态,就是当引脚配置为输入模式时,两个MOS管都无效,也就是输出关闭,端口的电平由外部信号来控制。

 使用浮空输入时,需要接上一个连续的驱动源,不能出现悬空的状态。

由电路图可以看出,在输入模式下,输出驱动是断开的,端口只能输入而不能输出。上面两个电阻可以选择上拉,下拉,或不工作。对应的就是上拉输入,下拉输入和浮空输入。

之后输入通过施密特触发器进行波形整形后,连接到输入数据寄存器,右边的输入保护,上面写的是VDD或者VDD_FT,这就是3.3V端口和5V端口的区别。

5V的保护二极管需要处理,不然直接接3.3V,外部再接入5V电压就会导致上面二极管开启,并且产生较大的电路,这样不太妥当

输出是断开的,输入的施密特触发器也是关闭的无效状态,整个GPIO的寄存器都是无效的,只有模拟输入能用,也就是从引脚直接接入片上外设,也就是ADC,所以当我们使用ADC时,将引脚配置为模拟输入就可以了。

 这时的输出是由输出寄存器控制的,P-MOS无效就是开漏输出,有效就是推挽输出,在输出模式下输入也是有效的。

 复用输出引脚电平是由片上外设控制的

复用输出的输出寄存器没有连接,引脚的控制权来自片上外设,由片上外设控制。

在输入部分,片上外设可以读取引脚的电平,同时普通的输入是有效的,顺便接收一下电平信号。

在GPIO的8种模式中,除了模拟输入会关闭数字的输入功能,其他7个模式,输入都是有效的。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值