3.GPIO八大工作模式

207 阅读6分钟

1.八种工作模式

image.png

2.GPIO功能描述的结构图

image.png

image.png

2.1引脚说明

其中图片右边的I/O引脚就是代表实际芯片的那些引脚,比如说:

image.png

又由于芯片内部能够承受的电压有限,因此如果有静电等大于VDD3.3V的时候就由电源网络吸收:

image.png

当波动电压小于VSS也就是0V的时候,下方保护二极管导通:

image.png

但是注意此结构不能长时间容忍高电压,STM32芯片中有一部分I/O口可以做到5V容忍,也就是VDD电压为5V

在创建项目的时候,我们选择完芯片,可以在Datasheet打开芯片的手册:

image.png

image.png

2.2寄存器

此外,我们关注一下什么是寄存器:

image.png

STM32芯片中特定功能的内存单元,按照功能被叫做XXX寄存器,也是程序与电路进行连接的桥梁,存储着芯片中特定功能电路的开关信息,我们之前对某些引脚的操作就是通过这个寄存器进行的,我们可以修改里面的内容从而读取电路状态或者修改电路状态

image.png

image.png

image.png

而所谓的CubeMX还有HAL库就是提供更加方便的操作寄存器的工具:

image.png

2.3输入/输出驱动器

现在我们来关注一下输入/输出驱动器

image.png

2.3.1输出驱动器

我们先来关注一下输出驱动器

image.png

我们可以将其简单理解为两个开关:

image.png

VDD是3.3V的高电平,VSS是0V的低电平

STM32的输出模式分为两类,一个是推挽输出,一个是开漏输出。

2.3.1.1 推挽输出

在介绍两个输出模式之前,我们假设IO引脚设置了接入了一个小灯泡,工作电压也是3.3V,那么我们可以使用推挽输出模式,这个模式下P-MOS和N-MOS协同工作,这里协同工作我们来看看:

当我们想要推挽输出高电平的时候,P-MOS关闭,形成以下连通分路,小灯亮起:

image.png

当我们想要推挽输出低电平的时候,正好相反,P-MOS关闭,N-MOS激活,VSS连接到I/O引脚。对外输出低电平,小灯关闭:

image.png

推挽输出具有一定的电源驱动能力,但是,总有一些元件需要更高或者更低的电压驱动,万一小灯需要的是5V电压才能工作,那么3.3V高电平就无法将其正常驱动,我们就需要使用开漏输出

2.3.1.2开漏输出

开漏输出模式下,N-MOS工作,P-MOS一直处于断开状态:

image.png

开漏输出高电平的时候,N-MOS断开,整个内部电路处于断路状态,不向外输出特定信号:

image.png

开漏输出低电平的时候,N-MOS激活I/O引脚与VSS连接,小灯两端都是0V,也不会亮起:

image.png

那有没有什么办法可以将小灯亮起呢,我们修改一下电路:如果将小灯的GND改为来自外部的5V,那么就会形成电压差,于是小灯就亮起来了。

image.png

此时如果N-MOS断开,就不会形成电压差,小灯就会熄灭。

image.png

于是,开漏输出模式就完成了。需要注意的是,我们需要能够容忍5V电压的I/O口,否则上方保护二极管长期导通,将5V引入电源中会造成损坏。

再来一份总结:

image.png

对于输出控制模块,我们还需要注意一下可以通过两个寄存器进行操作,一个是我们使用的HAL_GPIO_WritePin函数控制的输出寄存器,另一个则是我们后面会学习到的片上外设。

image.png

因为通知进行输出控制,芯片会无法识别应该进行谁的操作,所以STM32芯片将两种输出模式又细分为了普通的推挽输出以及普通开漏输出,还有复用推挽输出和复用开漏输出。复用模式需要到后面学习,这里只是作为了解。

image.png

2.3.2输入驱动器

再来看看输入驱动器,首先电流通过I/O引脚的时候,电流会通过两个电路,设置上拉输入的时候,上拉电阻会启用,设置下拉输入的时候,下拉电阻会启用,设置浮空输入的时候,两个电阻都不会启用:

image.png

电流继续前进会遇见一个TTL肖特基触发器,或者叫做施密特触发器,作用是稳定电平,接下来我们看一下稳定电平的原理

2.3.2.1稳定电平

一般来说外界的电压输入并不会总是 标准的3.3V或者0V,因此我们先简单的规定一个参考电压,比如说1.65V,当高于这个电压就算做高电平,低于这个电压的就叫做低电平:

输入电压:

image.png

输出电压:

image.png

要实现上述功能,我们只需要一个简单的比较器就行了:

image.png

现在问题来了,如果外界的输入电压一直在参考电压(假设是1.65V)附近,那么就会导致高低电平快速变化无法准确测出当前电平,因此我们对比较器稍作改造就会得到施密特触发器,这个给出两个参考电压:高参考电压和低参考电压

image.png

image.png

经过施密特触发器处理之后的电平信号被我们使用HAL_GPIO_ReadPin函数对寄存器进行读取。

image.png

但是我们看到片上外设还有两条路径,当我们读取上拉输入、下拉输入以及浮空输入的时候读取到的都是数字信号,我们统称为数字输入,但是模拟输入读取的是具体的数值,但是具体数值需要在施密特触发器之前就进行读取,如何使用引脚读取模拟输入的具体数值,我们将会在未来的ADC相关视频中进行了解。

image.png

另外一条支线则是在施密特触发器之后,接入了例如串口模块等需要数字输入的片上外设,这个特点在于输入部分可以同时读取施密特触发器的输出,也就没有什么复用上拉输入等模式,而是在片上外设也使用普通的输入模式即可。

image.png

至此八大工作模式就已经大致介绍完毕:

image.png