1 GPIO功能描述
1.1 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。
─ 输入浮空
─ 输入上拉
─ 输入下拉
─ 模拟输入
─ 开漏输出
─ 推挽式输出
─ 推挽式复用功能
─ 开漏复用功能
每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访问)。 GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
下图给出了一个I/O端口位的基本结构
Vdd_ft,部分io口可以容忍5V
1.2 端口位配置表
- 通用推挽输出模式(00):在这种模式下,N-MOS 管和 P-MOS 管都会工作。当控制输出为低电平时,P-MOS 管关闭,N-MOS 管导通,使输出低电平;当控制输出为高电平时,P-MOS 管导通,N-MOS 管关闭,使输出高电平。I/O 端口的电平就是输出的电平。外部上拉和下拉的作用是控制在没有输出时 I/O 口的电平。此模式可以输出强高电平和强低电平,适用于连接数字器件。推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。
- 通用开漏输出模式(01):在开漏输出模式时,只有 N-MOS 管工作。如果控制输出为低电平,则 P-MOS 管关闭,N-MOS 管导通,使输出低电平;若控制输出为高电平,则 P-MOS 管和 N-MOS 管都关闭,输出指令不起作用,此时 I/O 端口的电平不由输出的高电平决定,而是由 I/O 端口外部的上拉或者下拉决定(如果没有上拉或者下拉,I/O 口就处于悬空状态)。并且施密特触发器是打开的,即输入可用,通过输入数据寄存器可读取 I/O 的实际状态,I/O 口的电平不一定是输出的电平。开漏输出模式适合用于电平不匹配的场合,要得到高电平需要接上拉电阻,其吸收电流的能力相对较强(一般 20mA 以内)。它的一个特点是可以通过改变上拉电源的电压来改变传输电平,还可以将多个开漏输出的 Pin 连接到一条线上,通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。
- 复用功能推挽输出模式(10):当 GPIO 复用为其他外设(如 I2C)时,输出数据寄存器无效,输出的高低电平来源于其他外设。施密特触发器打开,输入可用,通过输入数据寄存器可获取 I/O 实际状态。除了输出信号的来源改变,其他与通用推挽输出模式相同。
- 复用功能开漏输出模式(11):当 GPIO 复用为其他外设时,输出数据寄存器也无效,输出的高低电平同样来源于其他外设。施密特触发器打开,输入可用,通过输入数据寄存器可读取 I/O 实际状态。除了输出信号的来源改变,其他与通用开漏输出模式相同。
在实际使用中,可以根据具体的需求来选择合适的输出模式。例如,如果需要输出强高低电平并连接数字器件,可选择通用推挽输出模式;如果要连接不同电平的器件或实现特定的电平转换,通用开漏输出模式可能更合适;而当 GPIO 被用作其他外设功能时,则需根据外设的要求选择复用功能推挽输出模式或复用功能开漏输出模式。同时,在使用开漏输出模式时,通常需要接上拉电阻以确保能输出高电平。
1.3 输出模式位
1.4 复用功能(AF)
使用默认复用功能前必须对端口位配置寄存器编程。
● 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部
驱动。
注意: 也可以通过软件来模拟复用功能输入引脚,这种模拟可以通过对GPIO控制器编程来实现。此时,端口应当被设置为复用功能输出模式。显然,这时相应的引脚不再由外部驱动,而是通过GPIO控制器由软件来驱动。
● 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
● 对于双向复用功