专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
目录
相关文章推荐
参考消息  ·  白宫:特朗普有信心本周完成谈判 ·  昨天  
参考消息  ·  “俄可能放弃被冻结资产” ·  2 天前  
参考消息  ·  霍启刚,当选新职务 ·  2 天前  
参考消息  ·  台媒:王大陆还能回大陆吗? ·  3 天前  
参考消息  ·  爆料:美国拒绝共提涉俄草案 ·  3 天前  
51好读  ›  专栏  ›  嵌入式微处理器

一文弄懂GPIO不同模式之间的区别与实现原理

嵌入式微处理器  · 公众号  ·  · 2024-03-27 12:12

正文

GPIO全称 General Purpose Input Output ,即通用输入/输出。其实 GPIO 的本质就是芯片的一个引脚,通常在 ARM 中所有的 I/O 都是通用的。 不过,由于每个开发板上都会设计不同的外围电路,这就造成了 GPIO 的功能可能有所不同。大部分 GPIO 都是有复用功能的,比如有些 GPIO 可能是串口的 TX RX ,也可能是 I2C SCL SDA 线。


所以,我们不仅要知道GPIO能够 输出高低 电平,还要理解为什么有些GPIO可以复用某些功能,而其他的不可以。

一、GPIO内部结构

我们在使用GPIO的时候,可能不会去想为什么通过写代码或者操作寄存器就可以控制一个引脚的高低电平。

今天就让我们一起来看看,为什么通过操作寄存器(其实写代码的过程就是在操作寄存器)就能控制引脚输入或者输出。

我们想要想控制一个GPIO口的需要操作7个寄存器,分别是 CRL,CRH,IDR,ODR,BRR,BSRR,LCKR 我们对GPIO的操作本质上就是在对这些寄存器进行读写操作,以下是这些寄存器的名称:

GPIOx_CRL(x = A..E)端口配置低寄存器 32位寄存器
GPIOx_CRH(x = A..E)端口配置高寄存器 32位寄存器
GPIOx_IDR(x = A..E)端口输入数据寄存器 32位寄存器但仅用低16
GPIOx_ODR(x = A..E)端口输出数据寄存器 32位寄存器但仅用低16
GPIOx_BRR(x = A..E)端口位清除寄存器 16位寄存器
GPIOx_BSRR(x = A..E)端口位设置/清除寄存器 16位寄存器
GPIOx_LCKR(x = A..E)端口配置锁定寄存器 32位寄存器

首先,我们分析一下上面的结构电路。

1、保护二极管

保护二极管从它的名字就不难想到他是用来对系统进行保护的,通过两个二极管的导通可以防止引脚外部输入电压过低或过高。当电压过高时,上方的保护二极管导通。当电压过低时,下方的二极管导通,防止不正常电压导入到芯片内部造成芯片烧毁。

2、P·MOS管和N·MOS管

GPIO经过两个二极管的保护后向上流入输入模式,向下流入输出模式,而输出模式的控制是由一个由 P·MOS管和N·MOS管 组成的单元电路,该电路主要是控制输出的模式,由该结构狗策划给你的单元电路具有 推挽输出 开漏输出 两种模式。

当系统配置为推挽输出模式时:

  • 若向该结构中输入高电平,经过反向后,上方的 P-MOS 导通,下方的 N-MOS 关闭,对外输出高电平;
  • 若向该结构中输入低电平时,经过反向后,下方的 N-MOS 管导通,上方的 P-MOS 关闭,对外输出低电平。

  • 当引脚高低电平切换时,两个 MOS 管轮流导通, P 管负责灌电流, N 管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。**推挽输出的低电平为 0V ,高电平为 3.3V **。

当系统配置为开漏输出模式时:
  • 上方的P-MOS管完全不工作;

  • 如果我们控制输出为0,低电平,则 P-MOS 管关闭, N-MOS 管导通,使输出接地;

  • 若控制输出为 1 (它无法直接输出高电平)时,则 P-MOS 管和 N-MOS 管都关闭,所以 开漏输出模式下引脚既不输出高电平,也不输出低电平,为高阻态

推挽输出模式 一般应用在输出电平为0和3.3V而且需要 高速切换开关状态的场合 开漏输出模式 一般应用在I2C、SMBUS通信等需要 线与 功能的总线电路中

在单片机中除了必须用开漏模式的场合,一般习惯使用推挽输出模式。

3、输出数据寄存器

前面我们知道双了 MOS 管结构电路的输入信号,是由 GPIO 输出数据寄存器 GPIOx_ODR 提供的,因此我们可以通过修改输出数据寄存器的值,就可以修改 GPIO 引脚的输出电平。而置位/复位寄存器 GPIOx_BSRR 可以通过修改输出数据寄存器的值,从而影响电路的输出。

4、复用功能输出

复用功能输出中的 复用 是指 STM32 的其他片上外设对 GPIO 引脚进行控制,此时 GPIO 引脚用作该外设功能的一部分,算是第二用途。从其他外设引出来的复用功能输出信号与 GPIO 本身的数据寄存器都连接到双 MOS 管结构的输入中。

二、输入输出模式

GPIO共有8中输入输出模式,分别是: 上拉输入、下拉输入、浮空输入、模拟输入、开漏输出、推挽输出、开漏复用输出、推挽复用输出 ,下面我们详细介绍以下上面的八种输入输出模式。

  • 上拉输入: GPIO_Mode_IPU
  • 下拉输入: GPIO_Mode_IPD
  • 浮空输入: GPIO_Mode_IN_FLOATING
  • 模拟输入: GPIO_Mode_AIN
  • 开漏输出: GPIO_Mode_Out_OD
  • 推挽输出: GPIO_Mode_Out_PP
  • 开漏复用: GPIO_Mode_AF_OD
  • 推完复用: GPIO_Mode_AF_PP

下面,详细讲一下几个常用的模式。

1、浮空输入

浮空输入模式下, I/O 端口的电 平信号直接进入输入数据寄存器。 也就是说,I/O的电平状态是不确定的,完全由外 部输入决定; 如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的,通常用于 IIC USART 等总线设备上。

2、上拉输入模式

上拉输入模式下, I/O 端口的电平信号直接进入输入数据寄存器。但是在 I/O 端口悬空(在无信号输入)的情况下,输入端的电平保持在高电平(并且在 I/O 端口输入为低电平的时候,输入端的电平也是低电平)。

3、下拉输入模式

下拉输入模式下, I/O 端口的电平信号直接进入输入数据寄存器。但是在 I/O 端口悬空(在无信号输入)的情况下,输入端的电平保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也是高电平。

4、模拟输入模式

模拟输入模式下, I/O 端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如 ADC 模块等。

5、开漏输出模式

见上面二中的详细介绍。

6、开漏复用输出模式

开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的,一般用于片内外设功能: TX1,MOSI,MISO,SCK,SS

7、推挽输出模式

见上面二中的详细介绍。

8、推挽复用输出模式

推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,而是利用片上外设模块的复用功能输出来决定的,常见采用推挽输出模式的一般为片内外设功能 IIC SCL SDL

三、开漏输出和推挽输出的区别

开漏输出和推挽输出模式的区别主要是开漏输出 只可以输出强低电平,高电平得靠外部电阻拉高 。输出端相当于三极管的集电极,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);推挽输出 可以输出强高、低电平 ,连接数字器件。

四、STM32中GPIO的配置

在固件库开发中,操作寄存器 CRH CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
/*第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。






请到「今天看啥」查看全文