STM32 GPIO 入门指南
GPIO简介:
· GPIO(General Purpose Input Output) 通用输入输出口
· 可配置为8种输入输出模式
· 引脚电平: 0V-3.3V,部分引脚可容忍5V(参考STM32的引脚定义,带FT可容忍5V)
· 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
· 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
GPIO基本结构
(图片源自江协科技)
STM32是32位的单片机,所以STM32内部的寄存器都是32位的,但端口只有16位(PA0-PA15),所以寄存器只有低16位对应的有端口,高16位没有用到
图中寄存器用于存储数据,驱动器用于增加驱动能力(如果要进行点灯操作,需要驱动器增大驱动能力)
GPIO位结构
(图片源自江协科技)
整体
整体可分为两部分,输入驱动器以上是输入部分,输出驱动器以下是输出部分
1.IO引脚左侧的两个二极管(保护二极管):
作用: 对电压进行限幅
VDD接3.3V(如果输入电压高于3.3V,上方二极管导通,电流向上流而不进入内部电路), VSS接0V(如果输入电压低于0V(负电压),那么二极管导通,电流向上流出)
输入部分:
2. 有两个电阻(上拉电阻,下拉电阻)—–开关可以通过程序进行配置
①上拉电阻——-上拉输入模式(开关上面导通,下面断开)
作用: 上拉电阻使得电压达到VDD,保证引脚高电平
②下拉电阻——-下拉输入模式(开关上面断开,下面导通)
作用: 下拉电阻使得电压达到VSS,保证引脚低电平
③两个开关均断开,那就是浮空输入
引脚的输入电平及易受到外界干扰而改变,使得输入数据不确定(不知道是高电平还是低电平)
3.斯密特触发器(TTL肖特基触发器)
·使用原因: 输入的虽然是数字信号,实际情况下可能会产生各种失真
·作用: 对输入电压进行整形
·执行逻辑: 如果输入电压大于某一阈值,输出就会瞬间升为高电平;
如果输入电压小于某一阈值,输出就会瞬间降为低电平;
(阈值可以人为设置)
4.输入数据寄存器
·可以用程序读取数据寄存器对应某一位的数据,就可以知道端口的输入电平了
5.剩余
剩下最上方的两路就是连接片上外设了——-模拟输入/复用功能输入
·模拟输入: 连接ADC上,因为ADC需要接收模拟量(在斯密特触发器前接收)
·复用功能输入: 比如串口的输入引脚等,这根线接收的是数字量,所以在斯密特触发器后
输入部分:
·数字部分可由输出数据寄存器或片上外设控制,通过数据选择器接到了输出控制部分
1.数据寄存器:
如果通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了,
2.位设置/清除寄存器:
作用:用来单独操作输出数据寄存器的某一位,而不影响其它位
由来:输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写—–特殊操作方式
输出数据寄存器的特殊操作方式
1.读出寄存器,如何用按位与和按位或的方式更改某一位,最后将更改的数据写回去
(比较麻烦,效率不高,对于IO口的操作而言不太合适)
2.设置位设置/清除寄存器: 直接在位设置寄存器的对应位写高或低—一步到位
3.读写STM32中的"位带"区域: 位带的作用和51单片机的位寻址作用差不多,在STM32中专门分配有一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位,这就是位带的操作方式
3.两个MOS管
·输出控制通过两个MOS管,上面是P-MOS,下面是N-MOS—–电子开关
通过信号来控制开关的导通和断开,开关负责将IO口接到VDD或者VSS,这里可以选择推挽、开漏或关闭三种输出方式
·推挽输出
·在推挽输出模式下,P-MOS和N-MOS均有效,
·数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平;
数据寄存器为1时,上管断开,下管导通,输出直接接到VDD,就是输出低电平;
·在这种模式下,高低电平均有较强的驱动能力,故也称之为强推输出模式
·在推挽输出模式下,STM32对IO口有绝对的控制权,高低电平由STM32决定
·开漏输出
·在开漏模式下,P-MOS无效,只有N-MOS在工作
·数据寄存器为1时,下管断开,输出相当于断开,也就是高阻模式;
数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平
·这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的
·用途: 开漏模式可以作为通信协议的驱动方式; 比如I2C通信的引脚,就是使用的开漏模式,在多机通信的情况下,这个模式可以避免各个设备的相互干扰;
还可以用于输出5V的电平信号: 比如在IO口外接一个上拉电阻到5V的电源,当输出低电平时,由于内部N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻提高至5V
·关闭输出
·当引脚配置为输入模式的时候,两个MOS管均无效,端口的电平由外部信号来控制
GPIO模式
·通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式
①浮空输入
性质: 数字输入
特征: 可读取引脚电平,若引脚悬空,则电平不确定
②上拉输入
性质: 数字输入
特征: 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
③下拉输入
性质: 数字输入
特征: 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
(图片源自江协科技)
④模拟输入
性质: 模拟输入
特征: GPIO无效,引脚直接接入内部ADC
(图片源自江协科技)
⑤开漏输出
P-MOS无效,N-MOS有效
性质: 数字输出
特征: 可输出引脚电平,高电平为高阻态,低电平接VSS
⑥推挽输出
P-MOS和N-MOS都有效
性质: 数字输出
特征: 可输出引脚电平,高电平接VDD,低电平接VSS
(图片源自江协科技)
经过以上模式,我们可以发现再输出模式下,输入模式也是有效的,但在输入模式下,输出是无效的
原因: 一个端口只能由一个输出,但可以有多个输入
⑦复用开漏输出
性质: 数字输出
特征: 由片上外设控制,高电平为高阻态,低电平接VSS
⑧复用推挽输出
性质: 数字输出
特征: 由片上外设控制,高电平接VDD,低电平接VSS
作者:曦柠LLL