General-Purpose Input Output,通用型输入输出的,也简称I/O口,有时也简写为IO口。用于电信号的传递,以实现与外部器件的通信、控制外部器件或者采集外部器件数据的功能。

极海半导体-APM32F407GPIO的结构
1. 输入钳位保护;
2. 上拉/下拉电阻;
3. 史密斯触发器;
4. PMOS/NMOS结构;
5. 输出选择结构;
6. 输入/输出寄存器;
7. GPIO置位/复位寄存器;
8. 模拟外设/复用外设。
> 在工作模式章节中,会结合这张结构图讲解GPIO的各种工作模式,这里只需了解基本结构。

#极海半导体APM32F407的GPIO功能
通用
复位后,调试引脚处于复用功能上拉/下拉状态:
- PA15:JTDI 处于上拉状态
- PA14:JTCK/SWCLK 处于下拉状态
- PA13:JTMS/SWDAT 处于下拉状态
- PB4:NJTRST 处于上拉状态
- PB3:JTDO 处于浮空状态

> 1.在复位期间及复位刚刚完成后,复用功能尚未激活时,IO 端口会被配置为输入浮空模式。> 2.输入数据寄存器 (GPIOx_IDATA) 每隔 1 个 AHB1 时钟周期捕获一次 IO 引脚的数据。

### 复用(Alternate functions)
MCU的外设引脚与GPIO口共用,默认作为IO口,但可配置作为多种外设用途。这种配置GPIO口为特定外设功能引脚的操作就叫做复用。F407xx每个 IO 引脚都有一个复用器,且采用 16 路复用功能输入,可通过相应AF寄存器进行配置。
  • 完成复位后,所有 IO 都会连接到系统的复用功能 0 (AF0);
  • 外设的复用功能映射到 AF1 至 AF13,AF14保留;
  • AF15是Cortex™-M4F EVENTOUT功能的映射。
    > 使用ADC和DAC外设,只需把IO口配置为模拟通道。
# 锁定
该功能会冻结GPIOx的控制寄存器(包括GPIOx_MODE、GPIOx_OTYPE、GPIOx_OSPEED、GPIOx_PUPD、GPIOx_AFL 和 GPIOx_AFH)。
> 锁定的是工作模式配置,并非输出值。

# 重映射(Remap)
重映射就是将引脚功能重新定义到其他引脚上去。在F1xx系列的芯片中还有“重映射”这一概念,后续的F4xx,L0xx等都是作为“附加功能”,直接由外设寄存器进行配置来映射。

## GPIO的工作模式
根据IO口的特性,我们可以配置IO口为多种工作模式。
> 每个 IO 端口位均可自由编程,但 IO 端口寄存器必须按 32 位字、半字或字节进行访问。> 以确保在读取和修改访问之间发生中断请求也不会有问题。

# 浮空输入
如图中蓝色路线所示,该模式下IO端口的电平信号直接进入输入数据寄存器(GPIOx_IDATA),MCU读取到的IO口电平不确定。
> 如果在引脚处于悬空的情况下,那么浮空输入端口的电平是不确定的,由外部环境决定。
# 上拉输入
如图中蓝色路线所示,该模式下IO内部接入上拉电阻,如果IO口外部没有信号输入或者悬空,则IO口默认为高电平。如果此时IO口有输入低电平,那么引脚就为低电平,MCU读取到的就是低电平。

> APM32的内部上拉是"弱上拉",即通过此上拉输出的电流很弱,如需求大电流还是需要接外部上拉。
### 下拉输入
如图中蓝色路线所示,该模式下IO内部接入下拉电阻,如果IO口外部没有信号输入或者悬空,则IO口默认为低电平。如果此时IO口有输入高电平,那么引脚就为高电平,MCU读取到的就是高电平。
### 模拟模式
> 当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出。
  • 输入
    如图中蓝色路线所示,该模式用于GPIO作为ADC采集电压的输入通道时,此时信号不经过施密特触发器,直接直接进入ADC外设中,并且输入数据寄存器为空 ,MCU不能在GPIOx_IDATA上读到引脚状态。
  • 输出
如图中蓝色路线所示,该模式用于GPIO作为DAC输出电压的输出通道时,信号直接从外设输出到IO口。

# 开漏输出
如图中蓝色路线所示,该模式下只有N-MOS管工作。如果控制输出为低电平,则P-MOS管关闭,N-MOS管导通,使IO输出低电平。
如果控制输出高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时IO端口的电平就不会由所控制输出的高电平决定,而是由IO端口外部的上拉或者下拉决定   如果外部没有上拉或者下拉,那么IO口就会处于悬空状态。

> 1.开漏输出模式下施密特触发器是开启的,即输入可用。可以通过输入数据寄存器GPIOx_IDATA读取IO的实际状态。
> 2.IO口的电平不一定是输出的电平。

# 推挽输出
如图中蓝色路线所示,在该模式下,N-MOS管和P-MOS管都工作。如果控制输出为低电平,则N-MOS管关闭,P-MOS管导通,使IO输出低电平。
如果控制输出为高电平,则N-MOS管导通,P-MOS管关闭,使IO输出高电平,此时外部上拉和下拉的作用是控制在没有输出时IO口的电平状态。

> 1.该模式下施密特触发器是开启的,即输入可用。可以通过输入数据寄存器GPIOx_IDATA读取IO的实际状态。
> 2.IO口的电平不一定是输出的电平。
### 复用开漏
如图中蓝色路线所示,在该模式下,GPIO复用为其他外设,输出数据寄存器GPIOx_ODATA无效。 输出的高低电平来自其它内部外设,其他和开漏输出功能相同。
> 该模式下施密特触发器是开启的,即输入可用。可以通过输入数据寄存器GPIOx_IDATA读取IO的实际状态。
## 复用推挽
如图中蓝色路线所示,在该模式下,GPIO复用为其他外设,输出数据寄存器GPIOx_ODATA无效。 输出的高低电平来自其它内部外设,其他和推挽输出功能相同。

> 该模式下施密特触发器是开启的,即输入可用。可以通过输入数据寄存器GPIOx_IDATA读取IO的实际状态。
### 复用输入
该模式不能由GPIO外设配置,由其他外设复用功能决定。如图中蓝色路线所示,在该模式下,IO信号经史密斯触发器通过复用通道输入各外设中。