一、GPIO工作方式
1.1 GPIO输入
输入工作方式 |
输入路径 |
输入浮空模式 |
I
/
O
I/O
I/O端口->
T
T
L
TTL
TTL施密特触发器->输入数据寄存器->读入数据 |
输入上拉模式 |
I
/
O
I/O
I/O端口->上拉电阻
V
D
D
V_{DD}
VDD->
T
T
L
TTL
TTL施密特触发器->输入数据寄存器->读入数据 |
输入下拉模式 |
I
/
O
I/O
I/O端口->下拉电阻
V
S
S
V_{SS}
VSS->
T
T
L
TTL
TTL施密特触发器->输入数据寄存器->读入数据 |
模拟输入 |
I
/
O
I/O
I/O端口->模拟输入 |
上拉与下拉的目的:确定电平的高低状态。
1.2 GPIO输出
输出工作方式 |
输出路径 |
开漏输出模式 |
写->位设置位输出寄存器(控制)->输出数据寄存器,读/写(数据)<->输出数据寄存器->输出控制电路->
N
−
M
O
S
{N-MOS}
N−MOS->
I
/
O
I/O
I/O端口 |
开漏复用输出模式 |
来自片上的外设设备->输出数据寄存器->输出控制电路->
N
−
M
O
S
{N-MOS}
N−MOS->
I
/
O
I/O
I/O端口 |
推挽输出模式 |
写->位设置位输出寄存器(控制)->输出数据寄存器,读/写(数据)<->输出数据寄存器->输出控制电路->输出0:
N
−
M
O
S
{N-MOS}
N−MOS,输出1:
P
−
M
O
S
{P-MOS}
P−MOS->
I
/
O
I/O
I/O端口 |
推挽复用输出模式 |
来自片上的外设设备->输出控制电路->输出0:
N
−
M
O
S
{N-MOS}
N−MOS,输出1:
P
−
M
O
S
{P-MOS}
P−MOS->
I
/
O
I/O
I/O端口 |
推挽与开漏的区别:
- 推挽输出:可以输出强高低电平,连接数字器件。
- 开漏输出:只可以输出强低电平,高电平要靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻,适合做电流型的驱动。
二、GPIO相关配置寄存器
2.1 分类
每组GPIO端口的寄存器包括:
- 两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)
- 两个32位数据寄存器(GPIOx_IDR,GPIOx_ORD)
- 一个32位置位/复位寄存器(GPIOx_BSRR)
- 一个16位复位寄存器(GPIOx_BRR)
- 一个32位锁定寄存器(GPIOx_LCKR)
每个I/O端口可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)
2.2 端口配置低/高寄存器GPIOx_CRL,GPIOx_CRH
CRL/CRH每四个位控制一个IO口,CRL控制标号0~7的口,CRH控制8 ~15的口,其中包含CNFy和MODEy两类交替出现。
CNFy[1:0](y=0…7)
输入:
- 00:模拟输入
- 01:浮空输入模式(复位后状态)
- 10:上拉/下拉输入模式
- 11:保留
输出:
- 00:通用推挽输出模式
- 01:通用开漏输出模式
- 10:复用功能推挽输出模式
- 11:复用功能开漏输出模式
MODEy[1:0](y=0…7)
00:输入模式(复位后状态)
01:输出模式:最大速度10MHZ
10:输出模式:最大速度2MHZ
11:输出模式:最大速度50MHZ
2.3 端口输入/输出数据寄存器GPIOx_IDR, GPIOx_ORD
31:16:保留,始终为0
15:0:端口输入/输出数据
2.4 端口位设置/清除寄存器GPIOx_BSRR,端口位清除寄存器寄存器(GPIOx_BRR)
BSRR是控制ODR的寄存器,ODR与BSRR的区别:
-
ODR设置位值时是影响其他的位,ODR使用时先读取其状态才能设置其值
-
BSRR寄存器设置位值的时候,不会影响到其他的位的输出或输入。