在MCU(微控制器/单片机)及相关基础里说到,通用输入输出引脚GPIO(单片机最基础的功能)是读取输入和控制输出(读0和1)的硬件外设。
如果是单片机,由MCU固件 直接写寄存器操控,如果是LinuxAP主,则由Linux驱动操控
GPIO电路结构
上面是每个GPIO的内部结构
最上面是输入电路,输入的是外部电路的电平信号;
而下半部分是输出电路,输出的是微控制器内部的控制信号
最后边有俩保护二极管,当电压高于/低于 VDD/VSS时,输入被钳位至VDD/VSS左右,防止过高或过低的电压导致芯片内部损坏
输入模式
TTL施密特触发器将模拟信号转化为数字信号
输入数据寄存器可以存储输入信号,可以通过端口模式寄存器来选择使用上拉或者是下拉电阻
当输入信号弱,容易收到干扰不稳定时选择上拉输入模式;下拉不常用
上拉输入
寄存器直接读取IO端口的电平,IO为高电平则读取高电平;IO为低则读取低电平;端口悬空无信号时读取的是高电平
下拉输入
寄存器直接读取IO端口的电平,IO为高电平则读取高电平;IO为低则读取低电平;端口悬空无信号时读取的是低电平。
浮空输入
寄存器直接读取IO端口的电平,IO为高电平则读取高电平;IO为低则读取低电平;端口悬空无信号时读取的是电平是不确定的。【输入阻抗高、MCU采集状态是单纯的外部信号;没有IO信号时读取的端口状态不确定】
模拟输入
I/O端口的模拟信号不经过施密特触发器直接输入到模拟外设(如ADC模块)
输出模式
通过编程直接控制寄存器的数值0 or 1;
复用功能输出的控制源来自片上外设(如串口)
开漏输出和推挽输出的区别:
1、开漏输出只能拉低输出信号,高电平需要靠外部电阻拉高。但支持线与功能
2、推挽输出可以提供较强的高电平与低电平驱动能力,但不支持线与功能
在单片机中,除了需要使用开漏输出的场合一般都使用推挽输出模式
推挽输出
P-MOS和N-MOS同一时间只有一个管子导通
当P-MOS通则输出高电平;N-MOS通则低电平(驱动能力和IO端口特性有关)
开漏输出
只有一个N-MOS管。没有上拉电阻时N-MOS管导通、输出端口信号被拉低;当N-MOS管截至,其电阻可以看作无穷大,输出电阻为高阻态。要想输出高电平需要外部上拉电阻提供驱动输出。【特点:当多个开漏输出引脚连在一块时都输出高电平,才能输出高电平,否则所有引脚电压被这一个拉低了】
推挽复用输出
与推挽输出类似,只是其控制源来自片上外设【PWM/串口等】
开漏复用输出
与开漏输出类似,只是其控制源来自片上外设【I2C等】