GPIO寄存器以STM32F429IGTx为例

  • 每组GPIO端口的寄存器包括:
  • 4个32位配置寄存器
  • 一个端口模式寄存器(GPIOx_MODER)(x = A..I)
  • 一个端口输出类型寄存器(GPIOx_OTYPER) (x = A..I)
  • 一个端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..I/)
  • 一个端口上拉下拉寄存器(GPIOx_PUPDR) (x = A..I/)
  • 这四个寄存器就可以组成八种IO口的不同状态
  • 2个32位数据寄存器
  • 一个端口输入数据寄存器(GPIOx_IDR) (x = A..I)
  • 一个端口输出数据寄存器(GPIOx_ODR) (x = A..I)
  • 1个32位置位/复位寄存器
  • 一个端口置位/复位寄存器(GPIOx_BSRR) (x = A..I)
  • 1个32位锁存寄存器
  • 一个端口配置锁存寄存器(GPIOx_BSRR)
  • 2个32位复用共功能寄存器
  • 两个复用功能寄存器(地位GPIOx_AFRL & GPIOx_AFRH)
  • GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A..I)
  • GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A..I)


  1. 每组IO口有10个寄存器组成,如果芯片有GPIOA~GPIOI,9个组那么一共有90个寄存器
  2. 如果配置一个IO口需要2个位,那么刚好32位寄存器配置一组IO口16个IO口
  3. 如果配置一个IO口只需要1个位,一般高16位保留
  4. BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,BSRRL配置一组IO口的16个IO口的状态(1),BSRRH配置复位状态(0)。

每组GPIO端口的寄存器包括:

4个32位配置寄存器

一个端口模式寄存器(GPIOx_MODER)(x = A…I)

GPIO端口模式寄存器有32位。又分成了16组,每组有两位,每两位控制一个IO口。

perf stat监控PMU寄存器 p0ifg寄存器_复用

位 2y:2y+1 MODERy[1:0]:
	端口 x 配置位 (Port x configuration bits) (y = 0..15)
这些位通过软件写入,用于配置 I/O 方向模式。
00:输入(复位状态)(浮空输入)
01:通用输出模式
10:复用功能模式
11:模拟模式

一个端口输出类型寄存器(GPIOx_OTYPER) (x = A…I)

GPIO端口输出类型寄存器有32位但是只用了低16位。每位控制一个IO口。

perf stat监控PMU寄存器 p0ifg寄存器_perf stat监控PMU寄存器_02

位 31:16 保留,必须保持复位值。
位 15:0 OTy[1:0]:端口 x 配置位 (Port x configuration bits) (y = 0..15)
这些位通过软件写入,用于配置 I/O 端口的输出类型。
0:输出推挽(复位状态)
1:输出开漏

一个端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A…I/)

GPIO端口输出速度寄存器有32位。又分成了16组,每组有两位,每两位控制一个IO口。

perf stat监控PMU寄存器 p0ifg寄存器_寄存器_03

位 2y:2y+1 OSPEEDRy[1:0]:
	端口 x 配置位 (Port x configuration bits) (y = 0..15)
这些位通过软件写入,用于配置 I/O 输出速度。
00:2 MHz(低速)
01:25 MHz(中速)
10:50 MHz(快速)
11:30 pF 时为 100 MHz(高速)(15 pF 时为 80 MHz 输出(最大速度))

一个端口上拉下拉寄存器(GPIOx_PUPDR) (x = A…I/)

GPIO端口上拉下拉寄存器有32位。又分成了16组,每组有两位,每两位控制一个IO口。

perf stat监控PMU寄存器 p0ifg寄存器_复用_04

位 2y:2y+1 PUPDRy[1:0]:
	端口 x 配置位 (Port x configuration bits) (y = 0..15)这些位通过软件写入,用于配置 I/O 上拉或下拉。
00:无上拉或下拉(浮空输入状态)
01:上拉
10:下拉
11:保留
这四个寄存器就可以组成八种IO口的不同状态

如:推挽输出:先配置模式寄存器为通用输出模式,输出类型寄存器配置为推挽输出,输出速度寄存器配置一个 自己需要的速度,然后在配置上拉/下拉寄存器为上拉或下拉

2个32位数据寄存器

一个端口输入数据寄存器(GPIOx_IDR) (x = A…I)

GPIO端口输入数据寄存器有32位但是只用了低16位。每位控制一个IO口。

perf stat监控PMU寄存器 p0ifg寄存器_perf stat监控PMU寄存器_05

位 31:16 保留,必须保持复位值。
位 15:0 IDRy[15:0]:端口输入数据 (Port input data) (y = 0..15)
这些位为只读形式, 只能在字模式下访问 。  它们包含相应 I/O 端口的输入值。

如果现在读取是GPIOA 端口 IDR0为1, PA1引脚j就是输入的高电平

一个端口输出数据寄存器(GPIOx_ODR) (x = A…I)

GPIO端口输出数据寄存器有32位但是只用了低16位。每位控制一个IO口。

perf stat监控PMU寄存器 p0ifg寄存器_perf stat监控PMU寄存器_06

位 31:16 保留,必须保持复位值。
位 15:0 ODRy[15:0]:端口输出数据 (Port output data) (y = 0..15)
		这些位可通过软件读取和写入。
	注意:对于原子置位/复位,通过写入 GPIOx_BSRR 寄存器,可分别对 ODR 位进行置位和复位 (x = A..I/)。

输出数据寄存器和输入数据寄存器相对应,吧相应的位设置为1,相应的引脚就输出高电平

1个32位置位/复位寄存器

一个端口置位/复位寄存器(GPIOx_BSRR) (x = A…I)

这个寄存器和端口输出数据寄存器是比较相似

它吧寄存器的32位分为了两组 低16位为一组,高16位为一组

低组寄存器给相应的位配置为1对应的引脚就会输出高电平

低组寄存器给相应的位配置为0对应的引脚不会动作,以前是什么电平现在还是什么电平

高组寄存器给相应的位配置为1对应的引脚就会输出低电平

高组寄存器给相应的位配置为0对应的引脚不会动作,以前是什么电平现在还是什么电平

perf stat监控PMU寄存器 p0ifg寄存器_perf stat监控PMU寄存器_07

位 31:16 BRy:端口 x 复位位 y (Port x reset bit y) (y = 0..15)
	这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。
	0:不会对相应的 ODRx 位执行任何操作
	1:对相应的 ODRx 位进行复位
  注意:如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。
位 15:0 BSy:端口 x 置位位 y (Port x set bit y) (y= 0..15)
	这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。
	0:不会对相应的 ODRx 位执行任何操作
	1:对相应的 ODRx 位进行置位

1个32位锁存寄存器

一个端口配置锁存寄存器(GPIOx_BSRR)

端口配置锁存寄存器有32位使用了低17位

当正确的写序列应用到第 16 位 (LCKK) 时,此寄存器将用于锁定端口位的配置。位 [15:0] 的

值用于锁定 GPIO 的配置。在写序列期间,不能更改 LCKR[15:0] 的值。将 LOCK 序列应用

到某个端口位后,在执行下一次复位之前,将无法对该端口位的值进行修改。

perf stat监控PMU寄存器 p0ifg寄存器_stm32_08

位 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:端口配置已锁定

2个32位复用共功能寄存器

两个复用功能寄存器(地位GPIOx_AFRL & GPIOx_AFRH)

GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)

分为高位AFRH和低位AFRL,分别控制8个IO口

perf stat监控PMU寄存器 p0ifg寄存器_寄存器_09

位 31:0 AFRLy:端口 x 位 y 的复用功能选择 (Alternate function selection for port x bit y) (y = 0…7)
这些位通过软件写入,用于配置复用功能 I/O。
AFRLy 选择:

0000:AF0			1000:AF8
0001:AF1			1001:AF9
0010:AF2			1010:AF10
0011:AF3			1011:AF11
0100:AF4			1100:AF12
0101:AF5			1101:AF13
0110:AF6			1110:AF14
0111:AF7			1111:AF15
GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)

perf stat监控PMU寄存器 p0ifg寄存器_stm32_10


位 31:0 AFRHy:端口 x 位 y 的复用功能选择 (Alternate function selection for port x bit y) (y = 8.0.15)

这些位通过软件写入,用于配置复用功能 I/O。

AFRHy 选择:
0000:AF0			1000:AF8
0001:AF1			1001:AF9
0010:AF2			1010:AF10
0011:AF3			1011:AF11
0100:AF4			1100:AF12
0101:AF5			1101:AF13
0110:AF6			1110:AF14
0111:AF7			1111:AF15