【STM32】GPIO概述

00. 目录

01. GPIO简介

每个通用 I/O 端口包括 4 个 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)、2 个 32 位数据寄存器(GPIOx_IDR 和GPIOx_ODR)、1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、1 个 32 位锁定寄存器(GPIOx_LCKR) 和 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。

02. GPIO主要特性

● 受控 I/O 多达 16 个
● 输出状态:推挽或开漏 + 上拉/下拉
● 从输出数据寄存器 (GPIOx_ODR) 或外设(复用功能输出)输出数据
● 可为每个 I/O 选择不同的速度
● 输入状态:浮空、上拉/下拉、模拟
● 将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设(复用功能输入)
● 置位和复位寄存器 (GPIOx_BSRR),对 GPIOx_ODR 具有按位写权限
● 锁定机制 (GPIOx_LCKR),可冻结 I/O 配置
● 模拟功能
● 复用功能输入/输出选择寄存器(一个 I/O 最多可具有 16 个复用功能)
● 快速翻转,每次翻转最快只需要两个时钟周期
● 引脚复用非常灵活,允许将 I/O 引脚用作 GPIO 或多种外设功能中的一种

03. GPIO功能描述

根据数据手册中列出的每个 I/O 端口的特性,可通过软件将通用 I/O (GPIO) 端口的各个端口位分别配置为多种模式:
● 输入浮空
● 输入上拉
● 输入下拉
● 模拟功能
● 具有上拉或下拉功能的开漏输出
● 具有上拉或下拉功能的推挽输出
● 具有上拉或下拉功能的复用功能推挽
● 具有上拉或下拉功能的复用功能开漏

04. I/O引脚复用器和映射

微控制器 I/O 引脚通过一个复用器连接到板载外设/模块,该复用器一次仅允许一个外设的复用功能 (AF) 连接到 I/O 引脚。这可以确保共用同一个 I/O 引脚的外设之间不会发生冲突。

每个 I/O 引脚都有一个复用器,该复用器采用 16 路复用功能输入(AF0 到 AF15),可通过GPIOx_AFRL(针对引脚 0 到 7)和 GPIOx_AFRH(针对引脚 8 到 15)寄存器对这些输入进行配置。

● 完成复位后,所有 I/O 都会连接到系统的复用功能 0 (AF0)。
● 外设的复用功能映射到 AF1 至 AF13。
● Cortex™-M4F EVENTOUT 映射到 AF15。
【STM32】GPIO概述

05. 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 寄存器都用于选择上拉/下拉。

06. I/O端口数据寄存器

每个 GPIO 都具有 2 个 16 位数据寄存器:输入和输出数据寄存器(GPIOx_IDR 和GPIOx_ODR)。GPIOx_ODR 用于存储待输出数据,可对其进行读/写访问。通过 I/O 输入的数据存储到输入数据寄存器 (GPIOx_IDR) 中,它是一个只读寄存器。

07. I/O数据位操作

置位复位寄存器 (GPIOx_BSRR) 是一个 32 位寄存器,它允许应用程序在输出数据寄存器(GPIOx_ODR) 中对各个单独的数据位执行置位和复位操作。置位复位寄存器的大小是GPIOx_ODR 的二倍。

08. GPIO锁定机制

通过将特定的写序列应用到 GPIOx_LCKR 寄存器,可以冻结 GPIO 控制寄存器。冻结的寄存器包括 GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRL 和 GPIOx_AFRH。

要对 GPIOx_LCKR 寄存器执行写操作,必须应用特定的写/读序列。当正确的 LOCK 序列应用到此寄存器的第 16 位后,会使用 LCKR[15:0] 的值来锁定 I/O 的配置(在写序列期间,LCKR[15:0] 的值必须相同)。将 LOCK 序列应用到某个端口位后,在执行下一次复位之前,将无法对该端口位的值进行修改。每个 GPIOx_LCKR 位都会冻结控制寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRL 和 GPIOx_AFRH)中的对应位。

09. GPIO寄存器描述

9.1 GPIO端口模式寄存器 (GPIOx_MODER) (x = A…I)

GPIO port mode register
偏移地址:0x00
复位值:
● 0xA800 0000(端口 A)
● 0x0000 0280(端口 B)
● 0x0000 0000(其它端口)
【STM32】GPIO概述

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

GPIO port output type register
偏移地址:0x04
复位值:0x0000 0000
【STM32】GPIO概述

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

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

GPIO port output speed register
偏移地址:0x08
复位值:
● 0x0000 00C0(端口 B)
● 0x0000 0000(其它端口)
【STM32】GPIO概述

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

GPIO port pull-up/pull-down register
偏移地址:0x0C
复位值:
● 0x6400 0000(端口 A)
● 0x0000 0100(端口 B)
● 0x0000 0000(其它端口)
【STM32】GPIO概述

位 2y:2y+1 PUPDRy[1:0] :端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 上拉或下拉。
00:无上拉或下拉
01:上拉
10:下拉
11:保留

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

GPIO port input data register
偏移地址:0x10
复位值:0x0000 XXXX(其中 X 表示未定义)
【STM32】GPIO概述

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

GPIO port output data register
偏移地址:0x14
复位值:0x0000 0000
【STM32】GPIO概述

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

GPIO port bit set/reset register
偏移地址:0x18
复位值:0x0000 0000
【STM32】GPIO概述

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

GPIO alternate function low register
偏移地址:0x20
复位值:0x0000 0000
【STM32】GPIO概述

9.9 GPIO复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)

GPIO alternate function high register
偏移地址:0x24
复位值:0x0000 0000
【STM32】GPIO概述

10. 附录

10.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

10.2 参考文档

STM32F4xx英文参考手册