一、GPIO工作状态
stm32或者说基本上所有MCU的工作状态都基本可以分为以下几种,输出模式:推挽输出、开漏输出、复用推挽输出和复用开漏输出;输入模式:上拉输入、下拉输入、浮空输入和模拟输入。
1.输出状态
①推挽输出
推挽输出由一对P-MOS和N-MOS组成,当输出控制端输出为高时,上端的PMOS导通,NMOS截止, 电流方向为VDD->PMOS->输出端,对外呈现高电平;当输出控制端输出为低时,上端的PMOS截止,NMOS导通, 电流方向为VSS->NMOS->输出端,对外呈现低电平。这种输出方式不能实现线于。
功能:
推挽模式,让“输出控制”变为了VDD/Vss输出,使得输出电流增大,提高了输出引脚的驱动能力,提高了电路的负载能力和开关的动作速度。
②开漏输出
也就是传说中的OD门,若由三极管组成叫OC门。结构上和推挽输出类似,但除去上端的PMOS,使用时需外加上拉电阻,输出高电平时需要通过该上拉电阻输出。
功能:
1)提高IO驱动能力。MCU的IO口对外驱动的能力很小,若使用开漏输出,此时的驱动电流有外置的VCC提供,可提供带负载能力。
2)电平转换。如MCU只能对外输出3.3v,但由于输出高电平时是通过VCC提供,VCC为5v。此时可以对外输出5v。
3)线于。多个开漏的引脚可以直接并在一起使用,统一接一个合适的上拉电阻,就可以实现“逻辑与”关系,即当所有引脚均输出高电平时,输出才为高电平,若任一引脚输出低电平,则输出低电平。
③复用推挽/开漏输出
GPIO引脚除了作为通用输入/输出引脚使用外,还可以作为片上外设( USART、 I2C、 SPI等)专用引脚,即一个引脚可以有多种用途,但同一时刻一个引脚只能使用复用功能中的一个。
当引脚设置为复用功能时,可选择复用推挽输出模式或复用开漏输出模式,在设置为复用开漏输出模式时,需要外接上拉电阻
2.输入状态
①上拉输入
如图所示, VDD->开关->上拉电阻->I/O引脚。当开关闭合, 外部I/O无输入信号时,默认输入高电平。
功能:
该模式的典型应用就是外接按键,当没有按键按下时候, MCU的引脚为确定的高电平,当按键按下时候,引脚电平被拉为低电平。
②下拉输入
如图所示, Vss->开关->下拉电阻->外部I/O引脚。当开关闭合,外部I/O无输入信号时,默认输入低电平。
③浮空输入模式
如图所示,两个上/下拉电阻开关均断开,既无上拉也无下拉, I/O引脚直接连接TTL肖特基触发器,此时I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平, MCU引脚就输入什么电平。 MCU复位上电后,默认为浮空输入模式。
④模拟输入
两个上/下拉电阻开关均断开,同时TTL肖特基触发器开关也断开,引脚信号直接
连接模拟输入,实现对外部信号的采集。
功能:
通常用于ADC采集。
注意:
可以看到输入端都有一个TTL肖特基触发器,即斯密特触发器,作用是可以消除脉冲干扰。
二、GPIO工作速率
STM32的I/O引脚工作在输出模式下时,需要配置I/O引脚的输出速度。该输出速度不是输出信号的速度,而是I/O口驱动电路的响应速度,可以理解为输出驱动电路的带宽,即一个驱动电路可以不失真地通过信号的最大频率。
举个例子,如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。如果信号频率为10MHz,而你配置了2MHz的带宽,则10MHz的方波很可能就变成了正弦波。
这里很多人理解为GPIO的可以输出的速度或者说翻转速度,这是不对的。
STM32提供三个输出速度: 2MHz、 10MHz、 50MHz。实际开发中需要结合实际情况选择合适的相应速度,以兼顾信号的稳定性和低功耗。通常,当设置为高速时,功耗高、噪声大、电磁干扰强;当设备为低速时,功耗低、噪声小、电磁干扰弱。
通常简单外设,比如LED灯、蜂鸣器灯,建议使用2MHz的输出速度,而复用为I2C、 SPI等通信信号引脚时,建议使用10MHz或50MHz以提高响应速度。
三、参考文章
1.【嵌入式】GPIO引脚速度、翻转速度、输出速度区别-云社区-华为云
2. 韦东山老师的STM32_MINI开发手册