一、什么是GPIO?

GPIO全称为General PurposeInput Output,即通用输入输出端口。

GPIO特点:
1、快速翻转,每次翻转最快只需要两个时钟周期。在不超频的情况下F1系列系统时钟频率最高可设置为72Mhz,因此IO口的翻转速度最快为36Mhz。若将芯片系统时钟频率超频到100Mhz以上,则IO口的翻转速度最快可以到50Mhz,通常不建议超频使用。
2、GPIO可分为CMOS端口和TTL端口,见数据手册引脚定义表格,其中IO Level有FT标识的即为TTL端口,表示该端口可容忍5V,兼容3.3V;没有FT标识的即为CMOS端口,表示该端口最大可承受电压为3.3V。
3、GPIO识别电压范围:-0.3V到1.164V识别为低电平,1.833V到3.6V识别为高电平。

二、IO端口基本结构

GPIO基本结构图
上图为GPIO基本结构图,其中上半部分为输入,下半部分为输出。

结构图中部分元器件的特性如下:
1、保护二极管的钳位作用:

钳位二极管的工作原理

2、施密特(肖特基)触发器的整形作用:

施密特触发器电路及工作原理详解

3、PMOS、NMOS的导通条件

PMOS & NMOS电流流向及符号图

NMOS与PMOS的导通条件与使用方法

整理笔记——推挽输出、开漏输出

三、GPIO的八种工作模式

1.输入浮空

输入浮空
特点: 空闲时(外部高阻态),IO状态不确定,由外部环境决定

2.输入上拉

输入上拉
特点:空闲时(外部高阻态),IO呈现高电平

3.输入下拉

输入下拉
特点:空闲时(外部高阻态),IO呈现低电平

4.模拟输入

模拟输入
特点:专门用于模拟信号输入或输出,如ADC和DAC

5.开漏输出

开漏输出
PMOS管始终不导通;往ODR对应位写0,NMOS管导通,写1则NMOS管不导通。
相当于PMOS的栅极接了VDD(3.3V),NMOS的栅极接了反相器。
特点:不能输出高电平,必须有外部(或内部)上拉才能输出高电平,常用于IIC。可以实现IO的线与

6.开漏式复用功能

开漏式复用功能
特点:
1、不能输出高电平,必须有外部(或内部)上拉才能输出高电平
2、由其他外设控制输出

7.推挽输出

推挽输出
往ODR对应位写0,NMOS管导通,写1则PMOS管导通。
相当于NMOS、PMOS的栅极接了反相器。
特点:可输出高低电平,驱动能力强。电平切换速度快,常用于控制输出,但不支持线与
当GPIO配置为推挽输出模式时,配置上、下拉电阻(GPIO_PuPd)实际并不起作用。在输出模式下,GPIO的输出电平完全由用户写入到输出数据寄存器(ODR)的值决定。但此时该IO口的输入功能仍然生效,因此可以有如下应用:

//GPIO口翻转
#define	LED_Toggle		GPIO_WriteBit(GPIOB,GPIO_Pin_1,(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1)))

8.推挽式复用功能

推挽式复用功能
特点:
1、可输出高低电平,驱动能力强
2、有其他外设控制输出

四、手把手配置GPIO(标准库)

1、初始化GPIO

void gpio_init(void)
{
  //使能GPIOB时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure the GPIO_LED pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;             //引脚号
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //电平切换速度
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}

2、在main函数中控制PB5口每500ms闪烁

  while (1)
  {
      Delay(500);
      GPIO_SetBits(GPIOB, GPIO_Pin_5);
      
      Delay(500);
      GPIO_ResetBits(GPIOB, GPIO_Pin_5);
  }
}

五、思考

1.为什么推挽输出不支持线与?

线与
上图可知,当两个推挽输出的IO接到一起时,若IO1输出1,IO2输出0,将导致IO1的上管和IO2的下管短路,烧坏芯片。

2.MCU如何输出5V信号?

开漏输出
可选择开漏输出,通过5V上拉,当控制IO为1时,即可输出5V信号。

3.对比开漏输出和推挽输出的差异?

特性 推挽输出 推挽输出
驱动能力 强(主动推/拉) 弱(依赖上拉电阻)
高电平来源 芯片内部VDD 外部上拉电源
电平兼容性 固定为VDD 可适配不同电压(如5V)
总线冲突风险 有(可能短路) 无(支持“线与”)
典型应用 高速信号、独立驱动 I2C、电平转换、共享信号线

总结

GPIO是STM32最基础的外设,成为一名点灯大师是合格嵌入式工程师的第一步。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐