在使用库函数编写STM32单片机GPIO程序时,一般都是通过配置相应的寄存器来实现具体的功能。下面将根据《STM32参考手册》对各个寄存器进行梳理。
每个通用I/O端口包括4个32位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和GPIOx_PUPDR)、2个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)、一个32位置位/复位寄存器(GPIOx_BSRR)、1个32位锁存寄存器(GPIOx_LCKR)和2个32位复用功能选择寄存器(GPIOx_AFRH和GPIOx_AFRL)。
GPIO按照功能分类:
(1)I/O端口控制寄存器
每个GPIO有4个32位存储器映射的控制寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR),可配置多达16个I/O。GPIOx_MODER寄存器用于选择I/O方向(输入、输出、AF、模拟)。GPIOx_OTYPER和GPIOx_OSPEEDR寄存器分别用于选择输出类型(推挽或开漏)和速度(无论采用哪种I/O方向,都会直接将I/O速度引脚连接到相应的GPIOx_OSPEEDR寄存器位)。无论采用哪种I/O方向,GPIOx_PUPDR寄存器都用于选择上拉/下拉
(2)I/O端口数据寄存器
每个GPIO都具有2个16位数据寄存器:输入和输出数据寄存器(GPIOx_IDR和GPIOx_ODR)。GPIOx_ODR用于存储输出数据,可对其进行读/写访问。通过I/O输入的数据存储到输入数据寄存器(GPIOx_IDR)中,它是一个只读寄存器。
(3)I/O数据为操作
置位复位寄存器(GPIOx_BSRR)是一个32位寄存器,它允许应用程序在输出数据寄存器(GPIOx_ODR)中对各个单独的数据为执行置位和复位操作。置位复位寄存器的大小是GPIOx_ODR的两倍。具体实现机理参考GPIOx_BSRR寄存器的介绍。
(4)GPIO锁定机制
通过将特定的写序列应用到GPIOx_LCKR寄存器可以冻结GPIO控制寄存器。冻结的寄存器包括GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRL和GPIOx_AFRH。具体锁定设置参考GPIOx_LCKR寄存器介绍。
下面对GPIO寄存器进行详细的介绍。可通过字节、半字或字对GPIO寄存器进行访问。
GPIO port mode register
偏移地址:0x00
复位值:
0xA800 0000(端口A)
0x0000 0280(端口B)
0x0000 0000(其他端口)
位2y:2y+1 MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0...15)
这些位通过软件写入,用于配置I/O方向模式。
00:输入(复位状态)
01:通用输出模式
10:复用功能模式
11:模拟状态
GPIO port output type register
偏移地址:0x04
复位值:0x0000 0000
位31:16保留,必须保持复位值。
位15:0 OTY[1:0]:端口x配置位(PORT x configuration bits)(y=0...15)
这些位通过软件写入,用于配置I/O输出类型。
0:输出推挽(复位状态)
1:输出开漏
GPIO端口输出速度寄存器(GPIOx_OSPEEDR)(x=A...I)
GPIO port output speed register
偏移地址:0x08
复位值:
0x0000 00C0(端口B)
0x0000 0000(其它端口)
位2y:2y+1 OSPEEDRy[1:0]:端口x配置位(PORT x configuration bits)(y=0...15)
这些位通过软件写入,用于配置I/O输出速度。
00:2MHZ(低速)
01:25MHZ(中速)
10:50MHZ(快速)
11:30pF时为100MHZ(高速)(15pf时为80MHZ输出(最大速度))
GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)(x=A...I)
GPIO port pull-up/pull-down register
偏移地址:0x0C
复位值:
0x6400 0000(端口A)
0x0000 0100(端口B)
0x0000 0000(其它端口)
位2y:2y+1 PUPDRy[1:0]:端口x配置位(PORT x configuration bits)(y=0...15)
这些位通过软件写入,用于配置I/O上拉或下拉
00:无上拉或下拉
01:上拉
10:下拉
11:保留
GPIO port input data register
偏移地址:0x10
复位值:0x0000 XXXX(其中X表示未定义)
位31:16保留,必须保持复位值
位15:0 IDRy[15:0]:端口输入数据(Port input data)(y=0...15)
这些位为只读形式,只能在字模式下访问。它们包含相应I/O端口的输入值
GPIO port output data register
偏移地址:0x14
复位值:0x0000 0000
位31:16保留,必须保持复位值。
位15:0 ODRy[15:0]:端口输出数据(Port output data)(y=0...15)
这些位可通过软件读取和写入
注意:通过写入GPIOx_BSRR寄存器,可以分别对ODR位进行置位和复位(x=A...I)
GPIO端口置位/复位寄存器(GPIOx_BSRR)(x=A...I)
GPIO port bit set/reset register
偏移地址:0x18
复位值:0x0000 0000
位31:16 BRy:端口x复位位y(Port x reset bit y)(y=0...15)
这些位为只写形式,只能在字、半字或者字节模式下访问。读取这些位可返回值0x0000
0:不会对相应位的ODRx位执行任何操作
1:对相应的ODRx位进行复位
位15:0 BSy:端口x置位位y(Port x set bit y)(y=0...15)
这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值0x0000
0:不会对相应的ODRx位执行任何操作
1:对相应的ODRx位进行置位
注意:如果同时对BSx和BRx置位,则BSx的优先级更高。
GPIO端口配置锁定寄存器(GPIOx_LCKR)(x=A...I)
GPIO port configuration lock register
当正确的写序列应用到第16位(LCKK)时,此寄存器将用于锁定端口位的配置。位[15:0]的值用于锁定GPIO的配置。在写序列期间,不能更改LCKR[15:0]的值。将LOCK序列应用到某个端口位后,在执行下一次复位之前,将无法对端口位的值进行更改。
注意:可使用特定的写序列对GPIOx_LCKR寄存器执行写操作。在此写序列期间只允许使用字访问(32位长)
每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)
偏移地址:0x1C
复位值:0x0000 0000
访问:仅32位字,读/写寄存器
位31:17保留,必须保持 复位值
位16 LCKK[16]:锁定键(Lock Key)
可随时读取此位。可使用锁定键写序列对其进行修改。
0:端口配置锁定键未激活。
1:端口锁定键已激活。直到MCU复位时,才锁定GPIOx_LCKR寄存器。
锁定键写序列:
WR LCKR[16] = '1' + LCKR[15:0]
WR LCKR[16] = '0' + LCKR[15:0]
WR LCKR[16] = '1' + LCKR[15:0]
RD LCKR
RD LCKR[16]= '1'
注意:在锁定键写序列期间,不能更改LCK[15:0]的值。
锁定序列中的任何错误都将中止锁定操作
在任一端口位上的第一个锁定序列之后,对LCKK位的任何读访问都将返回‘1’,直到下一次CPU复位为止。
位15:0 LCKy:端口x锁定位y(port x lock bit y )(y = 0...15)
这些位都是读/写位,但只能在LCKK位等于‘0’时执行写操作
0:端口配置未锁定
1:端口配置已锁定
GPIO alterate function low register
偏移地址:0x20
复位值:0x0000 0000
位31:0 AFRLy:端口x位y的复用功能选择(Alternate function selection for port x bit y)(y=0...7)
这些位通过软件写入,用于配置复用功能I/O。
AFRLy选择:
0000:AF0 0001:AF1 0010:AF2 0011:AF3
0100:AF4 0101:AF5 0110:AF6 0111:AF7
1000:AF8 1001:AF9 1010:AF10 1011:AF11
1100:AF12 1101:AF13 1110:AF14 1111:AF15
GPIO alternate function high register
偏移地址:0x24
复位值:0x0000 0000
位31:0 AFRHy:端口x位y的复用功能选择(Alternate function selection for port x bit y)(y=0...7)
这些位通过软件写入,用于配置复用功能I/O。
AFRLy选择:
0000:AF0 0001:AF1 0010:AF2 0011:AF3
0100:AF4 0101:AF5 0110:AF6 0111:AF7
1000:AF8 1001:AF9 1010:AF10 1011:AF11
1100:AF12 1101:AF13 1110:AF14 1111:AF15