STM32F4XXGPIO知识点总结——GPIO寄存器介绍

在使用库函数编写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端口模式寄存器(GPIOx_MODER)(x=A...I)

GPIO port mode register

偏移地址:0x00

复位值:

0xA800 0000(端口A)

0x0000 0280(端口B)

0x0000 0000(其他端口)

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第1张图片

位2y:2y+1    MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0...15)

                      这些位通过软件写入,用于配置I/O方向模式。

                     00:输入(复位状态)

                     01:通用输出模式

                    10:复用功能模式

                    11:模拟状态

  • GPIO端口输出类型寄存器(GPIOx_OTYPER)(x = A...I)

GPIO port output type register

偏移地址:0x04

复位值:0x0000 0000

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第2张图片

位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(其它端口)

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第3张图片

位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(其它端口)

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第4张图片

位2y:2y+1  PUPDRy[1:0]:端口x配置位(PORT x configuration bits)(y=0...15)

     这些位通过软件写入,用于配置I/O上拉或下拉

 00:无上拉或下拉

 01:上拉

 10:下拉

 11:保留

  • GPIO端口输入数据寄存器(GPIOx_IDR)(x=A...I) 

GPIO port input data register

偏移地址:0x10

复位值:0x0000 XXXX(其中X表示未定义)

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第5张图片

位31:16保留,必须保持复位值

位15:0  IDRy[15:0]:端口输入数据(Port input data)(y=0...15)

这些位为只读形式,只能在字模式下访问。它们包含相应I/O端口的输入值

  • GPIO端口输出数据寄存器(GPIOx_ODR)(x=A...I)

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

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第6张图片

位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位字,读/写寄存器

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第7张图片

位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复用功能低位寄存器(GPIOx_AFRL)(x=A...I)

GPIO alterate function low register

偏移地址:0x20

复位值:0x0000 0000

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第8张图片

位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复用功能高位寄存器(GPIOx_AFRH)(x=A...I)

GPIO alternate function high register

偏移地址:0x24

复位值:0x0000 0000

STM32F4XXGPIO知识点总结——GPIO寄存器介绍_第9张图片

位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

你可能感兴趣的:(单片机基础知识)