GPIO I/O口的八种工作模式总结
通用模式:4种输入模式,2种输出模式(此时GPIO受CM3内核(即:cpu)控制)
复用模式:2种复用输出模式:推挽式复用功能输出模式、开漏复用功能输出模式(在复用模式下,GPIO受STM32片上外设(如:I^2C、UART、TIM、pwm、ADC等)所控制,(此时I/O口输出/输入的信息,都是由片上外设来发送/接收)
一共八种模式
4种输入模式:
1.浮空输入:
浮空输入,就是I/O口在输入模式时,红框中的上/下拉电阻都是断开连接的情况下,stm32外部输入的信号进行读取。注意:VDD为3.3v,VSS为0v。
拓展:这个上/下拉电阻的阻值范围在30k~50k之间。
经过的路径:
外部输入信号——》I/O口 ——》 同相施密特触发器(即:同相滞回比较器)——-》 输入数据寄存器 ——-》 Read
CPU通过内部的数据总线可以随时读出I/O 端口的电平变化的状态。
特点:
1.没有上拉电阻,也没有下拉电阻。
2.当没有输入时,Read读的是上一次读取的状态,因为当没有输入时,由于上拉,也没有下拉,所以此时施密特触发器就没有输入,虽然没有输出,但是施密特触发器的输出会保持上一次的输出状态不变。
3.没有输入时,I/O口呈高阻态。实际上这时的输出电路与输入的端口处于隔离状态。
施密特触发器的作用:
校正输入电平。因为,输入的电平并不是3.3v或者0v(而是模拟量),但是存储在输入数据寄存器里面的1、0却是3.3v或0v(寄存器存储的是数字量),所以我们需要用施密特触发器来将外部输入电平进行校正为只有3.3v、0v这两种电平状态。
施密特就是为了防止在某一个临界电平的情况出现各种情况的抖动出现,为了稳定我们的输出,而设计的。这里用的是非反相施密特触发器来做阈值判断。这也就是为什么单片机的高电平是在一个范围内就为高电平,低电平也是一个范围而不是一个确定的值。
上拉输入:
上拉输入就是在输入模式下,红框中的上拉电阻是连接着VDD电源的。
特点:
1.有上拉电阻,但是没有下拉电阻。
2.当没有输入时,由于上拉电阻的存在,施密特触发器输入为1,则施密特触发器输出就为1,所以Read读到的就为1。
下拉输入:
下拉输入就是在输入模式下,红框中的下拉电阻是连接着Vss地的。
特点:
1.没有上拉电阻,但是有下拉电阻。
2.当没有输入时,由于下拉电阻的存在,施密特触发器输入为0,则施密特触发器输出就为0,所以Read读到的就为0。
对于要加上拉或下拉电阻:
1.当作单片机作为输入时,假设我们直接在IO端口接一个按键到地(或电源)。因为按键按,于不按管脚都是悬空的。单片机就很难检测按键是否按下。所以人为的接一个上拉(或下拉)。以确定未按下的时候IO输入电平的状态。
2.可以提高芯片的抗干扰能。
3.当单片机的IO口作输出时,如果不接上拉电阻只能提供灌电流(如:开漏输出模式)。无法输出电流驱动外接设备。这时也需要考虑上拉电阻。这样才可以使IO输出高电平。
拉电流和灌电流是衡量电路输出驱动能力(注意:拉、灌都是对输出端而言的,所以是驱动能力)的参数,这种说法一般用在数字电路中。
由于数字电路的输出只有高、低(0,1)两种电平值:当高电平输出时,一般是输出端对负载提供电流,其提供电流的数值叫“拉电流”;当低电平输出时,一般是输出端要吸收负载的电流,其吸收电流的数值叫“灌(入)电流”。
模拟输入:
模拟输入就是在输入模式下,没有上下拉电阻,并且读取的是外部信号的模拟量。
特点:
1.没有上拉电阻,也没有下拉电阻。
2.不经过施密特触发器,读取的是信号模拟量。
3.没有输入时,I/O口呈现高阻态
细心的朋友可以看到数据通道中上拉、下拉电阻和施密特触发器,这时均处于关断的状态,“输入数据寄存器”就不能反映IO端口上的电平变化的状态了,换句话说,也就是在模拟输入状态下,CPU不能通过“输入数据寄存器”读到IO端口变化的数据了。
两种输出模式:
推挽输出:
推挽输出,顾名思义就是输出处是由图腾柱输出。但是注意,当output control模块(即:输出控制单元)的输入为0时,p-mos管关闭,N-mos管打开。当output control模块的输入为1时,p-mos管打开,N-mos管关闭。
也就是,当output control模块的输入为0时,I/O口输出就是0,当output control模块的输入为1时,I/O口输出就是1。
由于,当output control模块的输入值是来自于输出数据寄存器,所以配置输出数据寄存器为0,则I/O口输出就是0,配置输出数据寄存器为1,则I/O口输出就是1。
输出路径1:
write —–> 端口位设置/清除寄存器(即:置1/清零寄存器) —–>输出数据寄存器(ODR寄存器)—–>输出控制单元—–>I/O口
输出路径2:
Read/write (可读可写)—–> 输出数据寄存器(ODR寄存器)—–>输出控制单元—–>I/O
特点:
1.即能输出高电平,也能输出低电平。
2.当output control模块的输入为0时,p-mos管关闭,N-mos管打开。当output control模块的输入为1时,p-mos管打开,N-mos管关闭。
3.在这个模式下,如果施密特触发器是开启状态的,那么CPU 仍然可以从“输入数据寄存器”读到该IO端口电压变化的信号
GPIO口的输出模式下,有3 种输出速度可选(2MHz 、10MHz和50MHz) :
这个速度是指GPIO口驱动电路的响应速度,而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
高频的驱动电路,噪声很高 当我们的项目不需要比较高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI 性能和降低芯片功耗。当然如果我们的项目要求输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到比较失真的输出信号。
开漏输出:
开漏输出,就是输出时,p-mos管一直是关断的。也就是说,该模式下,I/O口不能输出高电平,只能输出低电平和高阻态。如果在此模式下,还想要输出高电平,那么需要在I/O外部外接一个上拉电阻,然后关闭图中的N-MOS管,此时I/O 端口的电平将由外部的上拉电阻决定(实际上,此时这个高电平并不是I/O输出的,它实际上是由外部的上拉输出的)。当没有输出的时候,I/O口为高阻态。
输出路径:与推挽输出一样。
如果CPU 写入的是逻辑“1 ”(读数据),则编号3 的N-MOS管将处于关闭状态,此时I/O 端口的电平将由外部的上拉电阻决定。如果CPU 写入的是逻辑“0 ”,则编号3的N-MOS管将处于开启状态,此时I/O端口的电平被编号3 的N-MOS管拉到了“地”的零电位。在图中的上半部,施密特触发器处于开启状态,这意味着CPU 可以在“输入数据寄存器”的另一端,随时可以监控I/O端口的状态,通过这个特性,还可以实现了虚拟的I/O端口双向通信:假如CPU 输出逻辑“1 ”,由于编号3 的N-MOS管处于关闭状态,I/O 端口的电平将完全由外部电路决定,因此,CPU 可以在“输入数据寄存器”读到外部电路的信号,而不是它自己输出的逻辑“1 ”
推挽式复用功能输出模式:
推挽式复用功能就是,输出时是推挽式输出,但是,此时I/O口是受STM32片上外设所控制的,而不是由内核(cpu)控制。
在这个模式下,如果施密特触发器是开启状态的,那么CPU 仍然可以从“输入数据寄存器”读到该IO端口电压变化的信号
开漏式复用功能输出模式:
开漏式复用功能就是,输出时是开漏式输出,但是,此时I/O口是受STM32片上外设所控制的,而不是由内核(cpu)控制。
在这个模式下,如果施密特触发器是开启状态的,那么CPU 仍然可以从“输入数据寄存器”读到该IO端口电压变化的信号