GPIO端口寄存器配置

每组GPIO端口有7个寄存器。包括:

1.两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH)

2.两个32位数据寄存器(GPIOx_IDR, GPIOx_ODR)

3.一个32位置位/复位寄存器(GPIOx_BSRR)

4.一个16位复位寄存器(GPIOx_BRR)

5.一个32位锁定寄存器(GPIOx_LCKR)

这7个寄存器适当配置,可以控制一组GPIO的16个IO口。

 

为什么16个IO口需要两个32位的配置寄存器呢?CRL/CRH每四个位控制一个IO口,GPIOx_CRL共32位可控制0-7口(4*8),GPIOx_CRH共32位可控制8-15口(4*8)

1端口配置低寄存器(GPIOx_CRL) (x=A..E)
用来配置GPIO端口的输入输出模式,具体配置方式见下图,表格中表示相同的8组配置,分别对应一个IO口。

GPIO端口寄存器配置

2端口配置高寄存器(GPIOx_CRH) (x=A..E)
端口配置高寄存器GPIOx_CRH与端口配置低寄存器GPIOx_CRL配置方式相同,只不过GPIOx_CRH配置每组GPIO的高8口,GPIOx_CRL配置每组GPIO的低8口。 

GPIO端口寄存器配置

 

3端口输入数据寄存器(GPIOx_IDR) (x=A..E)
GPIOx_IDR寄存器的高16位保留,始终读为0、低16位每个位控制该组一个IO,刚好16个,对应IO口输入电平。

GPIO端口寄存器配置

4端口输出数据寄存器(GPIOx_ODR) (x=A..E)
GPIOx_ODR寄存器的高16位保留,始终读为0、低16位每个位控制该组一个IO,刚好16个,对应IO口输出电平。每个位控制一个IO口的输出电平高或者低。同时GPIOx_ODR可以配置上下拉模式(此处我也没搞懂,先mark)

GPIO端口寄存器配置

 

5端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)
当GPIOx_BSRR的低16位对应设置为1时,对应的IO口输出为高电平;对应设置为0时,对应IO口不产生任何的影响,此处所说的影响是指对GPIOx_ODR寄存器的影响,也就是说通过设置GPIOx_BSRR间接设置GPIOx_ODR。高16位的工作方式与低16位刚好相反。

GPIO端口寄存器配置

 

6端口位清除寄存器(GPIOx_BRR) (x=A..E)
作用同GPIO_BSRR的高16位。

GPIO端口寄存器配置

GPIO端口寄存器配置

 

7端口配置锁定寄存器(GPIOx_LCKR) (x=A..E)
当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位[15:0]用于锁
GPIO端口的配置。在规定的写入操作期间,不能改变LCKP[15:0]。当对相应的端口位执行了
LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。
每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。

GPIO端口寄存器配置