GPIO(General Purpose Input/Output)是一种通用输入输出接口,用于连接微控制器、嵌入式系统或其他电子设备与外部世界进行交互。
GPIO是一种非常灵活的接口,可以实现数字输入、数字输出、模拟输入、模拟输出等多种功能。在嵌入式系统中,GPIO通常在芯片引脚和外部电路之间起到了一个桥梁的作用。
通过GPIO,我们可以将内部的信号或数据与外部的设备或传感器进行连接和交互。例如,可以通过GPIO读取按键的状态、控制LED的亮灭,或者连接各种传感器读取温度、湿度、光强等物理量。因为GPIO非常通用,所以几乎所有的微控制器都具有GPIO功能。在开发嵌入式系统时,我们通常会使用GPIO来实现各种基本的输入输出功能,因此对GPIO的掌握是非常必要的。
STM32F407中的GPIO
STM32F407是一款基于Arm内核的高级32位MCU,具有140个GPIO端口,每个端口的PAD模块电路基本一致,能够实现浮空输入、上拉输入、下拉输入、模拟输入四种输入模式以及推挽输出和开漏输出两种输出模式。
STM32F407概貌图(POLY)
一般GPIO由两部分组成,一部分是寄存器,存储着输入或者需要输出的数据,通过访问寄存器可以对IO端口进行操作;简单来说,寄存器就是一个内存单元,一个具有特殊功能的内存单元。另一部分是PAD模块,为IO端口的驱动电路,其结构如下图。
STM32F407中GPIO的仿真分析
GPIO工作原理
GPIO的工作原理涉及多个寄存器的操作。对于输入功能,可以通过读取某个寄存器来确定引脚的电位高低;对于输出功能,可以通过写入某个寄存器来控制引脚输出高电位或低电位。
此外,GPIO还支持中断功能,可以在外部事件触发时产生中断请求,实现实时响应或处理特定事件。当我们说到操作一个外设或者是完成某一个功能时,其实都是在操作寄存器。如下图,此为GPIO端口输出速度寄存器,可以通过写入寄存器的某位来控制引脚输出的速度。
GPIO寄存器
GPIO工作模式
输入模式
浮空输入:引脚处于悬空状态。浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,与内部电路无关,因此读取该端口的电平是不确定的,易受干扰。一般多用于外部按键输入或需要灵活配置输入阻抗的场合。
上拉输入:在引脚上接上拉电阻。输入的电平不会因上下浮动而导致输入信号不稳定。当外部没有信号输入时,上拉电阻会将输入信号钳在高电平,此时引脚始终读到高电平信号。如下图所示,图中PAD信号是IO端口信号,此时IO端口没有输入,是上拉电阻将信号钳在高电平;PAD_Z是PAD模块中输出电路的输出信号。该模式适用于需要默认高电平的输入场合。
上拉输入(外部没有输入)
当外部输入高电平时,上拉电阻对其没有影响;当外部输入低电平时,由于上拉电阻的驱动能力较弱,无法改变输入的逻辑状态,输入依旧是逻辑‘0’,此时引脚始终读到输入的电平信号,如下图所示。
上拉输入(外部有输入)
下拉输入:在引脚上接下拉电阻。输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,下拉电阻会将输入信号钳在低电平,此时引脚始终读到低电平信号。如下图所示,图中PAD信号是IO端口信号,此时IO端口没有输入,是下拉电阻将信号钳在低电平;PAD_Z是PAD模块中输出电路的输出信号。该模式适用于需要默认低电平的输入场合。
下拉输入(外部没有输入)
当外部输入低电平时,下拉电阻对其没有影响;当外部输入高电平时,由于下拉电阻的驱动能力较弱,无法改变输入的逻辑状态,输入依旧是逻辑‘1’,此时引脚始终读到输入的电平信号,如下图所示。
下拉输入(外部有输入)
模拟输入:直接将电压信号传送到模拟模块,信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到模拟模块。所以可以理解为模拟输入的信号是未经处理的信号。如下图所示,图中PAD_ANA_VO是IO端口信号未经过施密特触发器的信号。该模式适用于需要采集模拟信号的场合。
模拟输入
当 GPIO 引脚用于 ADC 采集电压的输入通道时,则需要选择“模拟输入”功能,因为经过施密特触发器后信号只有 0、1 两种状态,如图8中PAD_Z信号。所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。
输出模式
推挽输出:推挽输出就是利用两个不同的MOS管来实现输出。推挽输出模式下(PMOS管+NMOS管),通过设置位设置/清除寄存器或者输出数据寄存器的值,途经PMOS管和NMOS管,最终输出到IO端口。具备输出高低电平的能力。
推挽输出高电平:输出数据寄存器的值经过控制电路激活PMOS管,输出高电平;
推挽输出低电平:输出数据寄存器的值经过控制电路激活NMOS管,输出低电平,其波形如下图,图中PAD_D是PAD模块中输出电路的数据输入。
推挽输出
开漏输出:MOS管的漏极处于一个开路状态,所以这个模式称之为开漏模式。开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。可以利用改变上拉电源的电压来适应所需,进而提高外部电路的驱动能力。
开漏输出低电平:输出数据寄存器的值经过控制电路激活NMOS管,输出低电平;
开漏输出高电平:PMOS管不会被激活,需要外接上拉电阻输出高电平。
虽然开漏输出是没有办法在内部输出一个高电平,但其有以下两种优势:
在输出电路中常见到这样的情况:在MOS管的控制电路中有很多并联的管子,这些管子受译码或者其他方式控制,如下图所示,这样的电路可以调节输出的时间。
输出电路
上图电路中红框中的管子导通越多,输出响应越快。如下图所示,其中PAD_FAST信号是所有管子都导通,速度最快;PAD_SLOW信号是所有管子都截至,速度最慢。
输出速度对比
总结
以上是对STM32F407中GPIO的仿真分析。总的来说,GPIO作为通用输入输出接口,在嵌入式系统和单片机中具有重要的地位。理解和掌握GPIO的使用方法和注意事项,对于嵌入式系统开发者来说是非常重要的。希望本篇GPIO能够帮助大家更好地了解和掌握GPIO的知识。