前言
GPIO 是通用输入输出端口(General Purpose Input Output)的简称,可以通过把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通信。
- 两种模式区别
三、复用模式
在复用功能模式下,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器无效;输入可用,通过输入数据寄存器可获取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);
摘自 只争朝夕的奈斯
标签:输出,引脚,MOS,低电平,模式,八种,GPIO,输入 From: https://www.cnblogs.com/yashiror/p/18662169