一、什么是GPIO
1、GPIO代表输入\输出,是一种用于与外部设备通信的通用接口。在嵌入式系统中,GPIO通常是一组可以配置为输入或输出的引脚,用于与外部电子元件(如传感器、执行器、LED等)进行数字通信。
解析:1)单片机通过GPIO引脚控制传感器和执行器。
2)传感器有高低电平,会输入到GPIO引脚上,然后通过单片机的程序去控制GPIO的寄存器,让它来感受外部引脚的高低电平变化。比如说人体红外传感器,假设有人是高电平,没有人是低电平。这个高低电平的变化传到GPIO引脚,单片机通过程序控制GPIO的控制器来感受外部引脚的高低电平的状态。(比如说 单片机可以将 GPIO 设置为输入模式,从而感受外部引脚的电平状态(高电平或低电平)。
3)假设执行器是灯泡,传感器通过输出高低电平来驱动灯泡,使灯泡亮灭。
2、STM32F407IGH6共有176个引脚,其中GPIO引脚共140个。 GPIO引脚分为9组(GPIOA~GPIOI),其中GPIOA~GPIOH 8组每组16个引脚(pin0~pin15),GPIOI组12个引脚(pin0~pin11)。
二、GPIO框图分析
解析:
上图 芯片 内部(看不到):
1)二极管:起引脚保护作用,防止过压,把内部的电路烧了
2)内部的上下拉电阻
3)输入部分
4)输出部分
三、GPIO的模式
1、GPIO输入模式
GPIO输入模式常用来检查芯片外部IO引脚的状态,外部电压经过TTL施密特触发器之后,将输出逻辑,最终写于GPIO寄存器。
输入模式执行流程:
1)TTL施密特触发器:能将输入进来的模拟电压转换为数字电压。比如说外部输入电压是3.3v,是高电平,经过TTL施密特触发器后就变成了1。
2)输入信号最终会反映到输入数字寄存器中,则该寄存器中会有这一个GPIO组里面16个引脚的状态。
3)输入数字寄存器就是我们编程时侯要去访问的寄存器,通过访问该寄存器就能知道这个GPIO组里面的每一个引脚的状态,如果是高电平,读出来的这一位的就是1;如果是低电平,则读出来的就是0。
4)通过这种方式,我们的程序就知道外部的引脚的状态了。
注:TTL施密特触发器:
施密特触发器是一种整形电路,可以将输入信号整形为方波信号;
当输入电压高于正向阈值电压,输出为高;
当输入电压低于负向阈值电压,输出为低;
IO口信号经过触发器后,可以将电平分为高电平与低电平,也就是1和0的数字信号。
输入数据寄存器:
整个寄存器是32位(0~31)高16位(16~31)没有用到,是保留的,只要关注低16位(0~15)就行了,这16位对应了每一组GPIO的管脚(pin0~pin15),通过读取输入数据寄存器的状态就知道外部引脚的状态了。最终读取的结果为对应引脚的状态(1,0)的16进制形式。
注:输入电压范围 (本数据摘自STM32F407xx datasheet)
TTL施密特触发器上触发点2.31V:0.7*VDD(1.7V≤VDD≤3.6V)
TTL施密特触发器下触发点0.99V:0.3*VDD( 1.7V≤VDD≤3.6V)
5V容忍输入电压范围:-0.3V~5.5V(2V≤VDD≤3.6V)
(VDD是我们给芯片的供电电压,一般为3.3V)
(一般情况下,单片机大部分的引脚都会有5V容忍)
(1)浮空输入
浮空输入模式是一种高阻态模式,不设置上拉或者是下拉,引脚不连接到外部电路,处于高阻状态。当接入外部电路时,则可通过读取引脚的电平状态来检测外部信号高低电平的变化。
I/O引脚的初始值是不确定,可能是高电平也可能是低电平,主要取决于电路板上的噪声。
(2)上拉输入
上拉输入的特点是具有内部上拉电阻,引脚的默认电平为高电平,常用于检测外部信号为低电平。
解析:信号从I/O引脚进来,上拉电阻的开关是闭合的,在此处的电压被拉到了VDD,引脚的默认状态*(初始状态)被拉到了3.3V(高电平状态),经过TTL,3.3V的电压转变为数字1,输入到输数字寄存器中了。内部上拉电阻阻值比较大,外部驱动较强。
如果外面有驱动信号(驱动比较强),通过I/O引脚输入的信号的高低电平状态就会随着外部驱动而变化。
(3)下拉输入
下拉输入的特点是具有内部下拉电阻,引脚的默认电平为低电平,常用于检测外部信号为高电平。
VSS是芯片内部的信号,可看作GND,是0V。下拉电阻那一处的电压被拉到了0V,I/O引脚的默认状态为0V 。经过触发器后就变成了数字0,然后输入到输入数字寄存器中。
2、GPIO输出模式
GPIO控制器输出模式,主要是由P-MOS管和N-MOS管组成的一个结构单元。 当P-MOS管和N-MOS管同时工作,可组成 推挽输出 模式; 当只有N-MOS管工作时,可组成 开漏输出 模式。
VDD一般就是3.3V; VSS一般就是GND
可用 示波器 测试 观察现象
(1)推挽输出
推挽输出模式,是根据P-MOS和N-MOS管的工作方式命名的。
a. 在该结构单元输入一个低电平时,P-MOS管导通,N-MOS管截止,对外输出高电平。
b. 在该结构单元输入一个高电平时,P-MOS管截止,N-MOS管导通,对外输出低电平。
解析:
假如说寄存器中设置的是一个1,那么经过“输出控制”这个电路,就会转换成0V,转换成0V后,P-MOS就导通了,最终输出就是3.3V了。
如果说给寄存器设置成0,那么经过“输出控制”后,就会转换为3.3V,那么N-MOS就导通了,最终输出0V。
(2)开漏输出
a. 开漏输出模式时,不论输入是高电平还是低电平,P-MOS管总处于关闭状态。
b. 当输入高电平时,N-MOS管导通,输出即为低电平,
c. 当输入低电平时,N-MOS管截止,这个时候引脚状态既不是高电平,也不是低电平,我们称之为高阻态。
d. 如果想让引脚输出高电平,那么引脚必须外接一个上拉电阻,由上拉电阻提供高电平。
解析:
1)开漏输出输出很少使用内接上拉电阻,其高电平的状态通常是由外部的上拉电阻决定的,若给外接的上拉的VDD设置为3.3V,则I/O口引脚上的电压就是3.3V;如果想输出一个2.8V的电压,用推挽输出无法完成,需要使用开漏输出,将其外部上拉的供电电压VDD设置为2.8V,那么对应的引脚上的电压就是2.8V。
2)开漏输出的驱动可以靠外部上拉电阻或内部上拉电阻输出高电平。接内部下拉是没有意义的,因为开漏输出本来就可以输出低电平。
3)开漏输出的外部上拉电平一般是由外部的外围电路通过电阻分压或电平转换芯片给它做一个电源的供电。
4)外部上拉电阻的阻值一般情况下要看驱动器件的负载能力。
ODR与BSRR寄存器
1) 使用ODR(输出数据寄存器)设置IO口引脚状态:(要考虑其余引脚的状态)
a. 读取ODR寄存器数据
b. 使用位操作修改要操作的IO引脚状态
c.将修改后的数据写回ODR寄存器。
2) 使用BSRR(置位复位寄存器)设置IO口引脚状态:
a.设置要操作的IO引脚状态(置位对应[0:15],复位对应[16:31])
b.将数据写到BSRR寄存器。
3、模拟模式
GPIO模拟输入的原理相对简单,IO引脚上的模拟电压在GPIO部分不做任何处理,直接输入到芯片内部的ADC控制器部分进行采样处理。
1)模拟输入上一般会接一个ADC(模数转换控制器),引脚上输入的模拟信号直接交给ADC进行处理。
2)模拟输出上一般会接一个DAC(数模转换控制器),ADC生成的一个模拟量输出
4、复用模式
IO复用模式主要是为后续各种控制器,驱动对应外设时提供的一个配置,将IO引脚设置为复用模式后,该管脚状态的控制不再由GPIO控制器控制其高低状态,而是由对应的外设控制器进行状态控制。
1)复用模式 输入的数据一般会给到片上外设,如 I2C控制器、UART串口控制器 等。
2)复用输出:比如说2c控制器或者说串口控制器要输出的数据直接给到输出控制单元,从而驱动对应的引脚上的电平的变化。
3)一个引脚复用的功能可以有16(0~15)种状态,每个引脚不是说这16种状态都会有。
4)通过上图左侧选定的AFx上的控制器来控制I/O引脚,就不归输入、输出寄存器管了。
GPIO复用功能低位寄存器(GPIOx_AFRH)低8位引脚(Pin0~Pin7)
GPIO复用功能高位寄存器(GPIOx_AFRH) 高8位引脚(Pin8~Pin15)
具体每个引脚复用什么可以查看数据手册
四、将GPIO配置为输入\输出模式的场景
1. 设置为输出
-
控制外部设备:如点亮LED、驱动继电器、控制电机等。
-
发送信号:如与其他设备通信时发送数据或时钟信号。
-
生成PWM信号:用于控制电机速度、LED亮度等。
2. 设置为输入
-
读取传感器数据:如按钮、开关、温度传感器等。
-
检测信号:如接收其他设备的信号或中断。
-
监控状态:如检测设备是否开启或关闭。
3. 注意事项
-
电压和电流:确保在GPIO的额定范围内。
-
上拉/下拉电阻:输入模式下可能需要配置,避免悬空状态。
-
初始化:上电时正确配置GPIO方向,避免意外行为。
示例
输出模式:控制LED时,GPIO设置为输出,高电平点亮,低电平熄灭。
输入模式:读取按钮状态时,GPIO设置为输入,按下为低电平,松开为高电平。
4. 总结
-
输出模式:用于控制或驱动外部设备。
-
输入模式:用于读取外部信号或传感器数据。
五、补充
补充:
1)GPIO控制器想要工作起来,还需要内部的时钟系统给它供一个基础的工作时钟。芯片内部的控制器想要工作,需要将内部的时钟使能,这样控制器里面的寄存器才能正常的工作
2)通过设置GPIO的相关寄存器来改变GPIO的状态。比如说改变GPIOx的Piny引脚的工作模式,需改变GPIOx的GPIO_MODER_MODER寄存器的Piny的状态,如下图中的寄存器所示。
3)若想改变GPIOx的Piny引脚的输出类型,则改变GPIOx端口输出数据寄存器(GPIOx_OTYPER)的状态。如下图所示
也可通过置位/复位寄存器(GPIOx_BSRR)来控制输出数据寄存器,从而间接控制输出的电平,如下图所示
4)置位/复位寄存器只允许写,而程序 可写可读 输出数据寄存器。但这两个寄存器实现的效果是一样的。
5)GPIO端口输出速度寄存器(GPIOx_OSPEEDR):设置I/O引脚两个状态反转的速度的
六、留言
如有问题,敬请指正,感谢阅读。