一、简介
GPIO是通用输入输出接口,负责接受外设的输入信息和输出信号给外设。STM32F103ZET6提供了七个GPIO组,即GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF 和 GPIOG。每组GPIO包含16个I/O引脚,通过修改寄存器来配置每个I/O引脚的功能。
二、I/O引脚的基本结构
如下图所示,是芯片内部的I/O引脚的基本结构。可以大致将基本结构分为四个部分:
- I/O引脚与保护二极管
- 输入驱动器
- 输出驱动器
- 相关寄存器
1、保护二极管
保护二极管的作用是当I/O引脚输入芯片可接受范围外的电压时,保护芯片不会被烧毁。上方的保护二极管用于过电压保护,VDD 接通的是3.3V电压,当IO引脚输入过高的电压时,保护二极管接通,由于电阻极小,所以大部分电流走的是保护二极管,保证只有很小的电流进入芯片,从而保护芯片不会烧毁。下方的保护二极管同理,VSS接地,电压为0,当IO引脚输入负电压时,下方的保护二极管接通,大部分电流走保护二极管,保护芯片不会因为负电压损坏。当IO引脚输入的电压在0V~3.3V之间时,两个保护二极管都不导通,电流流入芯片。
2、输入驱动器
2.1 TTL肖特基触发器
TTL肖特基触发器也叫施密特触发器,是一个整形电路,用于将非标准方波整形为标准方波。将低于负向阀值电压的电压整形为低电平,高于正向阀值电压的电压整形为高电平,这样就将一个波浪式的模拟电压信号转换成了有着标准高低电平的电压信号。
2.2 上拉电阻与下拉电阻
电路的状态有时是未知的,通过上拉电阻和下拉电阻可使电路状态稳定,从而确定是输入是高电平有效还是低电平有效。
上面的是上拉电阻,打开后接通VDD,电路处于高电平状态,从而可以设置输入为低电平有效,比如接通一个接地的按键,当按键按下,输入一个低电平,电路的状态就会发生变化。
下面的是下拉电阻,同理,打开后接通VSS,电路处于低电平状态,从而可以设置输入为高电平有效。
3、输出驱动器
当输出控制输出低电平时,P-MOS管导通,输出高电平;当输出控制输出高电平时,N-MOS管导通,输出低电平。
4、相关寄存器
这里主要用到的寄存器有三个,输入数据寄存器IDR、输出数据寄存器ODR和位设置/清除寄存器BSRR。
4.1 输入数据寄存器IDR
输入数据寄存器IDR用于读取IO接口的输入电平,其中低16位对应16个IO接口,高16位保留。要注意该寄存器的权限是只读。
4.2 输出数据寄存器ODR
输出数据寄存器ODR用于控制IO引脚是输出高电平还是低电平,ODR的权限是可读可写。其中低16位对应16个IO接口,写入0则输出低电平,写入1则输出高电平。
4.3 位设置/清除寄存器BSRR
位设置/清除寄存器BSRR通常用于控制IO接口是高电平还是低电平。BSRR寄存器的高16位为复位(赋值0),低16位为置一。
要注意到的是,ODR和BSRR都拥有输出的功能,但由于ODR是可读可写的权限,就会出现在读与写中间发生中断时,ODR里的内容被修改,从而导致数据发生异常。所以建议输出时使用BSRR。
三、GPIO的八种工作模式
GPIO有八种工作模式,其中输入占四种,输出占四种。
输入模式有:
- 浮空输入
- 上拉输入
- 下拉输入
- 模拟输入
输出模式有:
- 开漏输出
- 推挽输出
- 开漏式复用功能
- 推挽式复用功能
通过端口配置低寄存器CRL和端口配置高寄存器CRH来配置IO引脚的工作模式。
3.1 输入模式选择
浮空输入(Floating Input)
- 特点:无内部上拉/下拉电阻,依赖外部驱动电平
- 适用场景:
- 外部信号明确驱动(如I2C、USART接收端)
- 需灵活配置输入阻抗的场合(如高速通信)
上拉输入(Pull-Up Input)
- 特点:默认高电平,外部低电平时有效
- 适用场景:
- 按键检测(按键接地)
- 总线空闲保持高电平(如中断信号线)
下拉输入(Pull-Down Input)
- 特点:默认低电平,外部高电平时有效
- 适用场景:
- 高电平有效触发(如传感器中断)
模拟输入(Analog Input)
- 特点:禁用数字逻辑,直连ADC/DAC模块
- 适用场景:
- 模拟信号采集(如温度传感器、电压检测)
3.2 输出模式选择
开漏输出(Open-Drain)
- 特点:需外接上拉电阻,支持“线与”逻辑
- 适用场景:
- I2C总线(多设备共享)
- 电平转换(如3.3V→5V系统)
推挽输出(Push-Pull)
- 特点:高低电平驱动能力强,输出阻抗低
- 适用场景:
- 直接驱动LED、继电器等负载
- 高速数字信号(如SPI、PWM)
复用功能模式
- 特点:引脚映射到片上外设(如UART、CAN)
- 适用场景:
- 通信协议(SPI、I2C、USART)
- 定时器输出(PWM、捕获输入)