STM32学习笔记【江科协】【3-1】GPIO输出

GPIO理论部分
GPIO General Purpose Input Output )通用输入输出口
可配置为 8 种输入输出模式
引脚电平: 0V~3.3V ,部分引脚可容忍 5V
*数据0,就是0V低电平;数据1,就是3.3V高电平。容忍5V的意思是可以在这个端口输入5V,也认为是高电压。但对于输出而言,最大输出3.3V,因为供电就只有3.3V。具体哪些端口容忍5V,可以参考端口的引脚定义,带FT(Five Tolerate)就是可以容忍5V的
输出模式下可控制端口输出高低电平,用以驱动 LED 、控制蜂鸣器、模拟通信协议输出时序等
*只要是可以用高低电平控制的地方,都可以使用GPIO控制,如果是功率比较大的设备,只需要加入驱动电路即可。GPIO还可以模拟通信协议,比如I2C、SPI或者某个芯片特定的协议,都可以使用GPIO的输出模式来模拟其中输出的时序部分
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、 ADC 电压采集、模拟通信协议接收数据等
*输入模式最常见的是读取按键,用来捕获我们的按键按下事件。另外可读取一些数字输出的模块,比如套件里光敏电阻模块、热敏电阻模块等。如果这个模块输出的是模拟量,那GPIO还可以配置成模拟输入的模式,再配合ADC外设,就可以直接读取端口的模拟电压了。除此之外,模拟通信协议时,接收通信线上的数据,也是靠GPIO的输入来完成的

GPIO的整体构造

在STM32中所有GPIO都挂载在APB2外设总线上,其中GPIO外设的名字是以GPIOA、GPIOB......这样的名称命名的,每个GPIO一共有16个引脚,编号是0到15,那么GPIOA的第0号引脚,我们一般称之为PA0,以此类推PA1......一直到PA15,在每个GPIO模块内,主要包含了寄存器和驱动器。寄存器就是特殊的存储器,内核可以通过APB2总线对寄存器读写,这样就可以完成输出电平和读取电平的功能了。这个寄存器每一位对应一个引脚,其中输出寄存器写1,对应引脚就会输出高电平,写0就会输出低电平;输入寄存器读取为1,就证明对应端口目前为高电平,读取为0,就是低电平

因为STM32都是32位的单片机,所以STM32内部的寄存器都是32位的,但端口只有16位,所以只有低16位对应的有端口,高16位是没有用到的

驱动器是为了增加信号的驱动能力的,寄存器只负责读取数据,如果要进行点灯这样的操作的话,还是需要驱动器负责加大驱动能力


GPIO每一位的具体结构


上拉和下拉的作用?这个其实是为了给输入提供一个默认的输入电平的,因为我对应一个数字端口,输入不是高电平就是低电平,那如果输入引脚啥都不接,就不好分辨是高电平还是低电平呢,实际是输入啥都不接,输入处于浮空状态,引脚的输入电平极易受外界干扰而改变。为避免引脚悬空而导致输入数据不确定,需要在这里加上上拉或者下拉电阻
接入上拉电阻时,但引脚悬空时,还有上拉电阻来保证引脚的高电平,上拉输入可以称作默认为高电平的输入模式;下拉也是同理,就是默认的低电平的输入方式
上拉和下拉电阻的阻值还是比较大的,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作

施密特触发器的作用就是对输入电压进行整形的,执行逻辑是,如果输入电压大于某一阈值,输出就会瞬间升高为高电平,输入电压小于某一阈值,输出就会瞬间降为低电平。引脚的波形是外界输入的,虽然是数字信号,实际情况下可能产生各种失真,信号可以经此整形,可以有效避免因信号波动造成的输出抖动现象

输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制而不影响其他端口的话,就需要一些特殊的操作方式第一种方式是,先读出这个寄存器,然后用按位与和按位或的方式更改某一位,最后再将更改后的数据写回去,在C语言中就是&=和|=的操作,这种方式比较麻烦,效率不高,对于IO口操作而言不太合适。第二种方式是通过设置这个位设置和位清除寄存器,如果要对某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0,这样它内部就会有电路,自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变,这就保证了只操作其中某一位而不影响其它位,并且这是一步到位的操作,如果想对某一位进行清0的操作,就在位清除寄存器的对应位写1即可,这样内部电路就会把这一位清0了。第三种操作方式,读写STM32中“位带”区域,这个位带的作用就和51单片机的位寻址作用差不多,在STM32中,专门分配有一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位,这就是位带的操作方式。库函数使用的是第二种方式

MOS管就是一种电子开关,信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS,在这里可以选择推挽、开漏或者关闭三种输出方式。在推挽输出的模式下,P-MOS和N-MOS均有效。数字寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平;数据寄存器为0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平,这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也叫做强推输出模式。在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平都是由STM32说的算。在开漏输出模式下,这个P-MOS是无效的,只有M-MOS在工作,数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平,这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的,这个开漏模式可以作为通信协议的驱动方式,比如I2C通信的引脚,就是使用开漏模式,在多机通信的情况下,这个模式可以避免各个设备的相互干扰,另外开漏模式还可以用于输出5V的电平信号,比如在IO口外接一个上拉电阻到5V电源,当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由内部的上拉电阻拉高至5V,这样就可以输出5V的电平信号,用于兼容一些5V电平的设备,这就是开漏输出的主要用途。剩下的一种状态是关闭,这个是的那个引脚配置为输入模式的时候,这两个MOS管都无效,也就是输出关闭,端口的电平由外部的信号来控制


通过配置GPIO的端口配置寄存器,上面位结构的电路也会根据我配置而改变,比如开关的通断、N-MOS和P-MOS的是否有效、数据选择器的选择,端口可以配置成以下8种模式

 这三个模式电路基本一样,区别就是上拉电阻和下拉电阻的连接,在使用浮空输入时,端口一定要接一个连续的驱动源,不能使端口悬空

输入模式下,输出驱动器是断开的,只能输入不能输出,开关闭合对应着三种模式

容忍5V的引脚,保护二极管上面需要做出处理,要不然这里直接接VDD3.3V,外部再接入5V的电压会导致上面的二极管打开,并且产生较大电流,这样是不太妥当的

模拟输入可以说是ADC模数转换器的专属配置了

输出是断开的,输入的施密特触发器也是关闭无效的状态,整个GPIO只剩下这根线有用,也就是从引脚直接接上片上外设,也就是ADC。所以当我们使用ADC时,直接将引脚配置为模拟输入就行了,其他时候一般用不上

下面两者的区别在于,开漏输出的高电平呈现高阻态,没有驱动能力,推挽输出的高低电平都有驱动能力

P-MOS如果无效就是开漏输出,P-MOS和N-MOS有效就是推挽输出。另外,我们可以看到在输出模式下,输入模式同样有效(前面的结构输出模式下,输入模式都是无效的)。这是因为一个端口可以有多个输入,但只能有一个输出。所以当配置成输出模式时,内部顺便输入一下是没问题的

下面两者与上面的区别在于,复用的输出,引脚是由片上外设控制的

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


STM32参考手册GPIO/AFIO这一章

STM32内部的GPIO外设
 

端口配置寄存器 

16个端口就需要64位,所以这里配置寄存器两个,一个是端口配置低寄存器,一个是端口配置高寄存器

这里还多出了一项GPIO输出的速度,结构图里没有说明速度这个参数,这个GPIO输出速度可以限制输出引脚的最大翻转速度,这个设计是为了降低功耗和稳定性,如果要求不高直接配置成50MHz即可

然后是端口输入数据寄存器

 里面低16位对应15~0号引脚,高16位没有使用

端口输出数据寄存器与端口输入数据寄存器一样,只用到了低16位

 端口位设置/清除寄存器

这个寄存器的低16位的作用和上面端口位设置/清楚寄存器的高16位作用是一样的,这个寄存器存在是为了方便操作设置的,想进行单一的位设置和位清除,那位设置用上面这个寄存器,位清除用下面这个寄存器,因为在设置和清除时,使用的都是低16位的数据,这样就方便一些;如果想使用多个端口的位设置和位清除,那就使用第一个寄存器即可,这样就可以保证位位设置和位清除的同步性。如果对信号的同步性要求不高的话,先进行位设置再进行位清除也是没问题的


STM32外部的设备和电路

LED发光二极管,正向通电点亮,反向通电不亮

LED电路符号

左边是正级,右负是负极

LED实物图

如果没有剪过引脚,那么长脚是正极,短脚是负极 

看图也可以区分,内部较小的一边是正极,较大的一边是负极

有源蜂鸣器

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音(51单片机的内容)

 三极管开关来驱动,在VCC和GND分别接上正负极的供电,然后中间这个引脚接低电平,蜂鸣器就会响,中间这个引脚接高电平,蜂鸣器就关闭


 硬件电路 

LED两种电路

 低电平点亮,高电平熄灭

限流电阻的作用:①反正LED因电流过大而烧毁,②调节LED的亮度

高电平点亮,低电平熄灭

那么这两种点亮方式该如何选择呢?要看IO口高低电平的驱动能力了,上面所说的推挽输出模式下,高低电平的驱动能力都较强,所以在这里这两种接法均可,但是在单片机的电路里一般倾向于第一种接法,因为很多单片机和芯片都都使用了高电平弱驱动,或者低电平强驱动的规则,这样可以避免高低电平打架,高电平驱动能力弱在这种情况下第二中接法就不行了这是PNP三极管的驱动电路,三极管的左边是基极,带箭头的是发射级,剩下的是集电极,左边的基极给低电平,三极管就会导通,通过3V和GND就可以给蜂鸣器提供驱动电流了,基极给高电平,电路截止,蜂鸣器没有电流

 

NPN三极管的驱动电路,各部分名称与上同,驱动逻辑和上面相反的,基极给高电平导通,给低电平断开

PNP的三级管最好接在上面,NPN的三极管最好接在下面,因为三极管的通断需要在基极与发射级中间产生一定的开启电压的,负载装在发射级这边可能导致三极管不能正常开启

这里采用了三极管开关的驱动方式,三极管开关是最简单的驱动电路了。对于功率稍微大一点的,直接用IO口驱动就会导致STM32负担过重,这时就可以用一个三极管驱动电路来完成驱动任务


  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值