GPIO内部结构和工作模式

1 简介

​ GPIO:通用输入输出端口
(1) 输出功能:控制引脚输出高、低电平,实现开关控制
​ GPIO引脚接入LED,控制LED的亮灭
​ 接入继电器或三极管,可通过继电器或三极管控制外部大功率电路的通断
​ (2) 输入功能:检测外部输入电平
​ GPIO引脚连接到按键,通过读取电平状态判断按键是否按下

2 框图剖析

2.1 基本结构分析
(1) 保护二极管及上下拉电阻

保护二极管:防止引脚外部过高或过低的电压输入
​ 引脚电压高于VDD_FT,上方二极管导通
​ 引脚电压低于VSS,下方二极管导通

上下拉电阻:控制引脚默认状态的电压
​ 开启上拉,引脚电压默认为高电平
​ 开启下拉,引脚电压默认为低电平
​ 开启浮空,引脚状态不确定
​ 上下拉寄存器GPIOx_PUPDR控制引脚的上下拉以及浮空模式

(2) P-MOS管和N-MOS管

推挽输出:引脚高低电平切换时,两个管子轮流导通,P管负责灌电流,N管负责拉电流

开漏输出:上方的P-MOS管完全不工作,可设置引脚为低电平和高阻态,正常使用必须外接上拉电阻。
线与特性:多个开漏模式引脚连接到一起,只有当所有引脚都输出高阻态,由上拉电阻提供高电平,此时高电平的电压为外部上拉电阻所接的电源电压;其中一个引脚为低电平,整个线路都为低电平。

​ 推挽输出应用场景:输出高低电平且需要高速切换开关状态的场合
​ 开漏输出应用场景:在I2C、SMUS通讯等需要线与功能的总线电路以及电平不匹配场合
​ STM32 IO对外输出5V电平

(3) 输出数据寄存器

​ 双MOS管结构电路的输入信号
​ GPIOx_ODR输出数据寄存器控制GPIO引脚的输出电平
​ GPIOx_BSRR置位/复位寄存器影响GPIOx_ODR

(4) 复用功能输出

​ 复用功能用到GPIO输出,例如USART的发送引脚

(5) 输入数据寄存器

​ GPIO引脚经过上下拉电阻,连接到施密特触发器,模拟信号转换为0和1的数字信号,存储在输入数据存储器GPIOx_IDR,读取该寄存器可了解GPIO引脚的电平状态。

(6) 复用功能输入

​ 复用功能用到GPIO输入,例如USART的接收引脚

(7) 模拟输入输出

模拟输入:GPIO引脚用于ADC采集电压的输入通道,ADC采集到原始的模拟信号
模拟输出:GPIO引脚用于DAC作为模拟电压输出通道,模拟信号直接输出到引脚
​ 用于模拟功能,引脚的上下拉不起作用

2.2 GPIO工作模式
(1) 输入模式(上拉/下拉/浮空)

​ 在输入模式,施密特触发器打开,输出被禁止
​ 可设置上拉、下拉或浮空模式

(2) 输出模式(推挽/开漏,上拉/下拉/浮空)

​ 输出速度可配置
​ 推挽模式,输出数据寄存器GPIOx_ODR可控制IO输出高低电平;
​ 开漏模式,输出数据寄存器GPIOx_ODR可控制IO输出高阻态或低电平;
​ 施密特触发器打开,可通过输入数据寄存器GPIOx_IDR读取IO的实际状态;
​ 可使用上拉、下拉或浮空模式;
​ 引脚初始化后默认输出低电平,上拉不会影响引脚的电平状态,上拉只起到小幅度提高输出电流能力

(3) 复用功能(推挽/开漏,上拉/下拉)

​ 输出使能,输出速度可配置,可工作在开漏和推挽模式;
​ 输出信号来源于其他外设,输出数据寄存器GPIOx_ODR无效;
​ 输入可用,通过输入数据寄存器GPIOx_IDR读取IO的实际状态,一般直接使用外设的寄存器获取该数据信号;
​ 可使用上拉、下拉或浮空模式但引脚初始化后默认输出低电平,上拉不会影响引脚的电平状态,上拉只起到小幅度提供输出电流能力

(4) 模拟输入输出

​ 双MOS管结构关闭,施密特触发器停用,上下拉禁止

3 ST引脚配置
typedef struct
{
	uint32_t GPIO_Pin;			   //GPIO引脚         
  	GPIOMode_TypeDef GPIO_Mode;	    //工作模式   
  	GPIOSpeed_TypeDef GPIO_Speed;	//速率
  	GPIOOType_TypeDef GPIO_OType;  	//输出类型
  	GPIOPuPd_TypeDef GPIO_PuPd;    	//上下拉模式
}GPIO_InitTypeDef;

typedef enum
{ 
  	GPIO_Mode_IN   = 0x00, //输入模式
  	GPIO_Mode_OUT  = 0x01, //输出模式
  	GPIO_Mode_AF   = 0x02, //复用模式
  	GPIO_Mode_AN   = 0x03  //模拟模式
}GPIOMode_TypeDef;

typedef enum
{ 
  	GPIO_Low_Speed     = 0x00, //2MHz
  	GPIO_Medium_Speed  = 0x01, //25MHz
  	GPIO_Fast_Speed    = 0x02, //50MHz
  	GPIO_High_Speed    = 0x03  //100MHz
}GPIOSpeed_TypeDef;

typedef enum
{ 
	GPIO_OType_PP = 0x00,	//推挽输出
	GPIO_OType_OD = 0x01	//开漏输出
}GPIOOType_TypeDef;

typedef enum
{ 
	GPIO_PuPd_NOPULL = 0x00,//浮空
  	GPIO_PuPd_UP     = 0x01,//上拉
  	GPIO_PuPd_DOWN   = 0x02	//下拉
}GPIOPuPd_TypeDef;
4 八种工作模式
(1) 模拟输入
(2) 浮空输入
(3) 上拉输入
(4) 下拉输入
(5) 开漏输出
(6) 推挽输出
(7) 复用开漏输出
(8) 复用推挽输出
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值