Tips:
本文全部的TTL肖特基触发器应该均为施密特触发器,有些忘记改了。
资料来源:[3-1] GPIO输出_哔哩哔哩_bilibili
一、GPIO简介:
GPIO(General Purpose Input Output)是指通用输入输出接口,它允许微控制器或微处理器与外部设备进行数字通信。GPIO端口可以被配置成输入或输出,并且可以根据不同的应用场景进行多种配置。
1、可配置为8种输入输出模式
2、引脚电平:0V~3.3V(输出最高电压3.3V),不分引脚能容忍5V电压(输入电压)
3、输出模式下可控制端口输出高低电平,用于驱动LED、控制蜂鸣器、模拟通信协议输出时序
4、输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
二、I/O端口的基本结构
1、结构分区
2、功能讲解
2.1、保护二极管
如果输入电压在0~3.3V之间,说明是正常电压,会正常进入驱动部分。
2.2、上拉电阻和下拉电阻
上拉电阻和下拉电阻都可以通过程序进行配置,
上面导通,下面断开:上拉输入模式
下面导通,上面断开:下拉输入模式
上面、下面都断开:浮空输入模式
作用:给输入提供一个默认的输入电平,因为对于一个数字的端口,不是1就是0(即高电平和低电平)。如果啥都不接,输入处于浮空状态,引脚的输入极容易受外界信号的干扰而发生改变。
2.3、施密特触发器(图中所说的肖特基触发器是翻译错误)
当输入信号大于上压阈值时,施密特触发器会将输出状态反转并且保持稳定,直到下一次输入信号使得输出状态再次反转。这种特性使得施密特触发器能够有效地锁定数字信号,确保信号的稳定传输。
2.4、模拟输入
模拟输入连接到片上外设,比如说ADC模拟量,因为模拟量是波动的,所以要连接到施密特触发器之前。
2.5、 复用功能输入
复用功能输入连接的片上外设比如说是串口等,接收到的是数字信号,可以直接使用,连接到施密特触发器后面。
2.6、输出数据寄存器
关闭模式:即工作与输入模式下,N-MOS和P-MOS都关闭。(很好理解)
2.7、推挽输出
P-MOS和N-MOS均有效,该模式下 高低电平均有较强的驱动能力,故该模式又可叫强推输出模式。
2.8、开漏输出
P-MOS无效,只有N-MOS处于工作模式。
输出寄存器为1时,P-MOS不工作,N-MOS断开,处于高阻态模式,该模式下,如果接入一个外部5V电压,高阻态下也能提供一个5V的输出。
输出寄存器为0时,N-MOS导通,接VSS,I/O口输出低电平。
一般作为通讯协议的驱动模式,如I2C。
三、GPIO工作模式
1、浮空/上拉/下拉输入配置
浮空模式:上拉电阻和下拉电阻均断开,输入需要接入一个稳定的电平信号;
上拉输入:上闭下断,输入高电平;
下拉输入:上断下闭,输入低电平;
进来的模拟信号都要经过施密特触发器,整形成为稳定的数字信号。
2、模拟输入(ADC模数转换器专属配置)
3、开漏输出、推挽输出
区别:开漏输出没有驱动能力,而推挽输出有驱动能力
3.1、推挽输出
- 内部结构:通常包含两个晶体管(如NPN和PNP),这两个晶体管处于互补的工作状态。当一个导通时,另一个截止。
- 工作原理:
- 当输出逻辑高电平时,上拉晶体管(如PNP)导通,输出接近电源电压。
- 当输出逻辑低电平时,下拉晶体管(如NPN)导通,输出接近地电平。
- 特点:
- 可以直接输出高电平和低电平,无需外部上拉或下拉电阻。
- 输出阻抗较低,能够提供较大的驱动电流。
- 适用于需要快速切换且不需要额外外部组件的应用场景。
3.2、开漏输出
- 内部结构:仅包含一个晶体管(通常是N沟道MOSFET或NPN晶体管),该晶体管的集电极或漏极未连接到任何电源。
- 工作原理:
- 当晶体管导通时,输出为低电平。
- 当晶体管截止时,输出呈高阻态,此时需要外部上拉电阻来将输出拉至高电平。
- 特点:
- 输出不能直接提供高电平,必须通过外部上拉电阻实现。
- 可以实现线与逻辑(即多个开漏输出可以直接并联在一起,用于实现逻辑与功能)。
- 适合于需要电流源驱动或者与其他具有不同电源电压的设备接口的情况。
- 通常用于需要较高灵活性的输出配置,例如I²C或SPI通信接口。
3.3、总结
- 应用选择:如果你需要一个可以直接输出高电平和低电平的引脚,并且不需要与其他不同电源电压的设备相连,则推挽输出更合适。如果需要与其他设备进行灵活的接口连接,或者需要实现线与逻辑,则应选择开漏输出。
- 电流驱动能力:推挽输出通常能提供更大的驱动电流,而开漏输出则更适合于吸收电流的应用。
- 功耗考虑:开漏输出在高阻态时几乎不消耗功率,这在某些低功耗应用中可能是一个优势。
4、复用开漏输出/复用推挽输出
4.1、复用推挽输出 (Alternate Function Push-Pull)
- 内部结构:类似于普通的推挽输出,但输出信号被路由到一个特定的外设功能。
- 工作原理:
- 当输出逻辑高电平时,上拉晶体管导通,输出接近电源电压。
- 当输出逻辑低电平时,下拉晶体管导通,输出接近地电平。
- 特点:
- 可以直接输出高电平和低电平。
- 适用于需要快速切换且不需要额外外部组件的应用场景。
- 通常用于需要驱动外设接口,如USART、SPI、I²C等。
4.2、复用开漏输出 (Alternate Function Open Drain)
- 内部结构:类似于普通的开漏输出,只包含一个N沟道MOSFET或NPN晶体管,其输出端没有连接到电源。
- 工作原理:
- 当晶体管导通时,输出为低电平。
- 当晶体管截止时,输出呈高阻态,此时需要外部上拉电阻来将输出拉至高电平。
- 特点:
- 输出不能直接提供高电平,必须通过外部上拉电阻实现。
- 适合于需要与其他具有不同电源电压的设备接口的情况。
- 通常用于需要较高灵活性的输出配置,例如I²C总线。
4.3、总结
- 主要用途:这两种配置都是为了将GPIO端口用作特定的外设功能。
- 输出特性:复用推挽输出可以直接输出高低电平,而复用开漏输出需要外部上拉电阻才能输出高电平。
- 应用场景:
- 如果你需要直接驱动外设接口,且不需要额外的电压转换或电流限制,可以选择复用推挽输出。
- 如果你需要与其他不同电源电压的设备接口,或者需要实现线与逻辑(多个开漏输出可以直接并联在一起),则应选择复用开漏输出。
四、项目实战
1、点亮LED灯
方案一:低电平驱动方案(对应模式:推挽输出)
例程:
#include "stm32f10x.h"
int main(void)
{
// 1、配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
// 2、配置GPIO口
GPIO_InitTypeDef GPIO_InitStruction;
GPIO_InitStruction.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruction.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruction.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruction);
// 3、操作对应GPIO口
GPIO_SetBits(GPIOA,GPIO_Pin_0); //对指定GPIO口置1操作
// GPIO_ResetBits(GPIOA,GPIO_Pin_0); //对指定GPIO口置0操作
// GPIO_WriteBit(GPIOA, uint16_t GPIO_Pin, Bit_SET); //对指定GPIO口置BitVal操作,Bit_RESET=0,Bit_SET=1
// GPIO_Write(GPIOA, uint16_t PortVal);
while(1)
{
}
}
方案二:
2、驱动蜂鸣器
方案一:
方案二
3、按键控制LED灯(传感器单元同理)
传感器单元,如红外反射传感器、光敏传感器、热敏传感器等模块,接入3V3电源和接地后,输出口输出的数据都是1和0的数字信号,在输入模式中有上拉、下拉、浮空和模拟输入四种模式,在这里可以根据实际电路进行选择。