一、GPIO简单介绍
- 引脚电平:0V~3.3V,部分引脚可容忍5V
- •输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- •输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
-
基本结构 -
GPIO八种输入输出模式
二、模拟输入与数字输入的区别
-
模拟输入可以接收连续变化的信号,这些信号可以是电压或电流,其值在一定的范围内连续变化。
-
数字输入只能接收离散的信号,即高电平(通常表示为1)或低电平(通常表示为0)。
-
模拟输入的特点
连续性:模拟信号是连续的,可以表示无限多的值。
精度:模拟输入的精度较高,可以检测到微小的变化。
噪声敏感:模拟信号容易受到噪声和干扰的影响。
4. 数字输入的特点
离散性:数字信号是离散的,只有有限的状态(通常是两种)。
抗干扰性:数字信号对噪声和干扰具有较强的免疫力。
简单性:数字电路设计相对简单,易于实现和调试。
5.模拟输入与数字输入选择
精度要求:如果应用对精度要求较高,如传感器测量,通常选择模拟输入。
抗干扰性:在噪声环境或长距离传输中,数字输入可能更为可靠。
系统复杂性:数字系统通常更简单,成本更低,而模拟系统可能需要更复杂的电路和更高的成本。
兼容性:现代微处理器和计算机更易于处理数字信号,但许多传感器和现实世界信号都是模拟的,因此需要根据具体需求选择。
三、四种输入模式
- 浮空输入:没有明确的电平参考,浮空输入的电平状态是不确定的,可能会受到外部电磁干扰、静电或其他电路的影响。(一般不用浮空输入)
- 上拉输入:通过在输入引脚和正电源电压(如VCC)之间连接一个电阻,将输入引脚默认拉高到高电平的一种电路设计方法。这种设计通常用于数字电路中的GPIO(通用输入输出)引脚,以防止引脚处于浮空状态,从而提高电路的稳定性和可靠性。特点:默认高电平
- 下拉输入:通过在输入引脚和地(GND)之间连接一个电阻,将输入引脚默认拉低到低电平的一种电路设计方法。这种设计同样用于数字电路中的GPIO(通用输入输出)引脚,以防止引脚处于浮空状态,并确保在没有外部信号作用时输入引脚有一个确定的低电平状态。特点:默认低电平,防止浮空减少干扰,降低功耗,适用于数字电路与微控制器。
- 模拟输入:(GPIO)无效,引脚直接接入内部ADC.
四、四种输出模式
- 开漏输出:开漏输出只有一个晶体管(通常是N沟道MOSFET)连接到输出引脚和地(GND),而没有直接连接到正电源(VCC)的晶体管。特点:只能输出低电平,开漏输出可以主动驱动低电平(通过导通内部的N沟道MOSFET将引脚拉低到GND)。高电平由外部上拉电阻实现,当开漏输出需要表示高电平时,需要外部连接一个上拉电阻到正电源(VCC)。当内部的MOSFET关闭时,引脚通过上拉电阻被拉高到高电平。多路复用,多个开漏输出可以连接到同一条线上,形成“线与”逻辑。只要有一个输出为低电平,整个线就为低电平;只有所有输出都为高电平(即所有内部的MOSFET都关闭),线才被上拉电阻拉高到高电平。电压灵活性,由于高电平是由外部上拉电阻提供的,因此开漏输出可以适应不同的电源电压 levels,只要上拉电阻连接到相应的电源电压即可。电流驱动能力开漏输出通常可以提供较大的电流驱动能力,适合驱动负载如LED、继电器等。
- 推挽输出:数字电路中另一种常见的输出配置,与开漏输出不同,推挽输出能够主动驱动高电平和低电平。推挽输出通常包含一对互补的晶体管(一个N沟道MOSFET和一个P沟道MOSFET,或者一个NPN晶体管和一个PNP晶体管),它们分别用于驱动输出引脚到高电平和低电平。特点: 抗干扰能力强,能够主动驱动两个电平。开漏特性,每个输出引脚只能驱动低电平,高电平状态由外部上拉电阻维持。节省引脚,通过共享信号线,可以减少所需的GPIO引脚数量。灵活性,可以通过软件或硬件控制来动态改变哪个开漏输出正在驱动信号线。冲突避免,需要确保在任何时刻只有一个开漏输出正在驱动信号线,以避免电平冲突。
- 复用开漏输出:是一种电路设计技术,其中多个开漏输出引脚共享同一条外部信号线。这种设计允许在不同的时间或基于特定的控制信号,选择性地使能或禁用这些开漏输出,从而在同一个物理线上传输多个不同的信号。特点:共享信号线, 双向驱动:推挽输出可以主动驱动高电平和低电平,不需要外部上拉或下拉电阻。高驱动能力,由于使用了互补的晶体管对,推挽输出可以提供较强的电流驱动能力,适合驱动各种负载。 快速切换:推挽输出可以在高电平和低电平之间快速切换,适合高速数字信号传输。确定的电平:推挽输出的高电平和低电平是确定的,不受外部电路影响。
- 复用推挽输出:是一种将多个推挽输出引脚共享同一条信号线的电路设计方式。这种设计允许在不同的时间或条件下,通过控制这些引脚来传输不同的信号或实现不同的功能。特点:共享信号线,多个推挽输出引脚可以连接到同一条信号线,通过时分复用或编码方式来区分不同的信号。强驱动能力,每个推挽输出都具有强大的高电平和低电平驱动能力,无需外部上拉或下拉电阻。节省引脚,通过共享信号线,可以减少所需的GPIO引脚数量,从而节省电路资源。高速传输,推挽输出支持高速信号传输,适用于需要快速数据交换的应用场景。冲突管理,需要确保在任何时刻只有一个推挽输出驱动信号线,以避免信号冲突。软件可控,通过软件可以灵活地控制每个推挽输出的状态,实现多种功能。
#include "stm32f10x.h" // Device header #include "Delay.h" // Device header /*控制Led闪烁*/ int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//启用外设时钟 GPIO_InitTypeDef GPIO_InitStructure; //初始化结构体定义 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//选择GPIO推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选择数据端口位 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化 while(1) { GPIO_ResetBits(GPIOA,GPIO_Pin_0);//清楚数据 Delay_ms(500); GPIO_SetBits(GPIOA,GPIO_Pin_0);//设置数据端口位 Delay_ms(500); GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//清楚端口引脚 Delay_ms(500); GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//设置端口引脚 Delay_ms(500); GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0); Delay_ms(500); GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1); Delay_ms(500); } }