GPIO的八种工作模式


前言

GPIO 是通用输入输出端口(General Purpose Input Output)的简称,可以通过把GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
最基本的输出功能是控制引脚输出高、低电平,实现开关控制等
最基本的输入功能是检测外部输入电平等。
其中有八种输入输出模式,下面将会对八种模式逐一解释。
GPIO控制框图


一、输入模式

在输入模式下,施密特触发器打开,输出模式被禁用,此时可通过输入数据寄存器读取I/O 状态。其中输入模式又可细分为上拉输入、下拉输入、浮空输入和模拟输入四种模式。
输入模式

小知识
(1) TTL肖特基触发器(施密特触发器)
作用:用于稳定电平,防止高低电平来回波动
工作原理:施密特触发器会设置两条参考电压,高参考电压和低参考电压。
当高于高参考电压时,输出高电平;低于低参考电压时,输出低电平;位于两条参考电压之间时,保持之前的电平状态。
(2) 保护二极管
作用:防止过大的电压进入单片机内部,造成损坏
工作原理:输入时,IO引脚输入的电压如果大于3.3V,则连接VDD的二极管导通;IO引脚输入的电压如果小于0V,则连接VSS的二极管导通,只有当IO引脚输入的电压在0到3.3V之间的时候,才会进入内部电路,这样防止过大的电压进入单片机内部,造成损坏

1.上拉输入

VDD侧的开关闭合,内部上拉电阻导通,使其GPIO的默认状态为高电平。
应用场景:需要默认高电平的场合,如按键检测。

2.下拉输入

VSS侧的开关闭合,内部下拉电阻导通,使其GPIO的默认状态为低电平。
应用场景:需要默认低电平的场合,如检测低电平信号的变化。

3.浮空输入

VSS和VDD侧的开关都断开,此时GPIO的电平状态不确定,由外设决定。
应用场景:常用于按键检测,接收高低电平信号。

4.模拟输入

引脚直接接入片上外设,如用于ADC采集,不需要施密特触发器整形
应用场景:用于检测外部的模拟电压,如温度、压力传感器的输出。

二、输出模式

在输出模式下,推挽模式时双MOS 管以轮流方式工作,输出数据寄存器可控制I/O输出高低电平。开漏模式时,只有N-MOS 管工作,输出数据寄存器可控制I/O 输出高阻态或低电平。

1.推挽输出

通过输出驱动器控制P-MOS和N-MOS开关来输出高低电平的。
推挽输出英文为Push-Pull mode,可以理解为对电流进行推拉操作
当P-MOS闭合,N-MOS断开时,输出高电平,此时可理解为将电流推出去
当P-MOS断开,N-MOS闭合时,输出低电平,此时可理解为将电流拉(挽)进来
该模式下具有驱动能力,可以通过单片机内部电压驱动外设
应用场景:高速切换和高负载能力的场合,如驱动LED指示灯、继电器。

推挽输出

2.开漏输出

只有N-MOS工作,P-MOS一直处于断开状态。通过控制N-MOS的开合来控制电路。
该模式下无驱动能力,需要外部电压驱动外设
应用场景:需要外部上拉电阻定义高电平的场合,如I2C通信。

开漏输出

3. 两种模式区别

推挽输出开漏输出
优点可以直接输出3.3V配合外部电路 更加灵活
缺点只能输出3.3V高电平实际是高阻态 无法输出电流

三、复用模式

在复用功能模式下,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器无效;输入可用,通过输入数据寄存器可获取I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。
复用模式

1.复用推挽输出

GPIO输出控制的来源来自片上外设,如串口模块,PWM波等,其原理和普通的推挽输出一样。

2.复用开漏输出

GPIO输出控制的来源来自片上外设,如I2C模块等,其原理和普通的开漏输出一样。

四、代码实现

/* 定义一个GPIO_InitTypeDef类型的结构体 */
GPIO_InitTypeDef GPIO_InitStruct = {0};

/* 开启相关的GPIO外设时钟 */
__HAL_RCC_GPIOC_CLK_ENABLE();

/* 选择要控制的GPIO引脚*/
GPIO_InitStruct.Pin = GPIO_PIN_13;
/* 设置引脚模式为通用推挽输出*/
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
/* 指定引脚的上下拉配置 */
GPIO_InitStruct.Pull = GPIO_NOPULL;
/* 设置引脚速率 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
/* 初始化GPIOC*/
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

/*配置GPIO的输出电平状态 */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值