推挽输出 与 开漏输出
GPIO有八大输出模式
下图为每个GPIO口的基本结构:
通过这张图来学习
最右侧是I/O引脚,是从STM32引脚到GPIO口的导线,与其他芯片进行连接的线。
芯片内部电路所能承受的电压有限,当未知的静电进入GPIO口,大于所能承受的电压,就会被上方的保护二极管导通,将电压引入电源,由电源网络吸收,当波动电压小于VSS(0V)时,下方保护二极管被导通,波动电压被引入GND中吸收。此结构只能抵御一瞬间的电压波动,若较长的高电压导入芯片,会损坏芯片
寄存器 —— 程序与电路之间的"桥梁"
既能写。也能读。控制单片机,就是控制寄存器。
输出驱动器
输出控制模块 控制两个MOS ,P_MOS 和 N_MOS,起作用可以简化为两个被控制的开关。
VDD 3.3V高电平 VSS 0V的低电平。
STM的输出模式分为两类:推挽输出 和 开漏输出
在I/O引脚加一个工作电压为3.3V的小灯泡,另一端接地,则我们可以使用推挽输出模式,此模式下。P-MOS与N-MOS协同工作
当我写下代码
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
函数内部对相关寄存器的数据进行了修改,从写入一端直达输出控制模块,导致P-MOS激活,N-MOS关闭
此时VDD与小灯形成通路,小灯亮起。
当我们写下代码
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
函数内部对相关寄存器的数据进行了修改,从写入一端直达输出控制模块,导致P-MOS关闭,N-MOS激活
此时VSS与小灯相连,小灯关闭。
以上控制P-MOS 和 N-MOS的模式就称为推挽输出,特点:具有一定的电压与电流驱动能力,可以直接驱动一些合适的元件工作。
当小灯泡的工作电压为5V时,推挽输出提供的3.3V电压就达不到要求,无法驱动小灯正常工作。
此时就是开漏输出的用武之地,
开漏输出模式下,P-MOS一直处于关闭状态,根本不会用到内部电压,只控制N-MOS来控制小灯。显然此时控制小灯无论N-MOS处于何种状态都无法控制,此时需要将GND改为接一个外部电源(5V)来自外部的灌电流即可用N-MOS控制小灯亮灭。
当我们写下代码
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
控制GPIO口输出高电平,则N-MOS断开,整个I/O口处于断路状态,小灯熄灭。
当我们写下代码
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
控制GPIO口输出低电平,则N-MOS连接,整个I/O口处于通路状态,小灯亮起。特点:更加灵活。
- 注意,需要将上方的保护二极管设为5v容忍
对于输入,不仅可以通过控制寄存器来控制输出控制模块,也可以通过片上外设,如串口模块,I2C模块进行控制。
根据不同的组合分为了,普通的推挽输出,开漏输出,和复杂的 复用推挽输出、复用开漏输出。
回到第一幅图的上半部分,正常状态下为浮空输入,两个电阻都不会启用。
类似的,当我们设置上拉输入时,上拉电阻启用
设置下拉输入时,下拉电阻启用
电流继续前进,会进入TTL肖特基触发器,其作用是稳定电平
模拟输入:使用模拟输入读取到I/O引脚的电压值,会用到ADC
对于复用功能输入,接入了列如串口模块等须要数字,输入的片上外设,与输出部分只能有一个控制源不同的是,输入部分的不同分支可以同时读取施密特触发器的输出,就不存在复用上拉输入等模式,而是在片上外设上也使用普通的输入模式即可。
上述就是GPIO的八大输入输出模式