STM32的GPIO

和GPIO相关的寄存器如下:

  • GPIO 端口模式寄存器 (GPIOx_MODER)
  • GPIO 端口输出类型寄存器 (GPIOx_OTYPER)
  • GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)
  • GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)
  • GPIO 端口输入数据寄存器 (GPIOx_IDR)
  • GPIO 端口输出数据寄存器 (GPIOx_ODR)
  • GPIO 端口置位/复位寄存器 (GPIOx_BSRR)
  • GPIO 端口配置锁定寄存器 (GPIOx_LCKR)
  • GPIO 复用功能低位寄存器 (GPIOx_AFRL)
  • GPIO 复用功能高位寄存器 (GPIOx_AFRH)


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

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

I/O 数据位操作
置位复位寄存器 (GPIOx_BSRR) 是一个 32 位寄存器,它允许应用程序在输出数据寄存器(GPIOx_ODR) 中对各个单独的数据位执行置位和复位操作。置位复位寄存器的大小是GPIOx_ODR 的二倍。GPIOx_ODR 中的每个数据位对应于 GPIOx_BSRR 中的两个控制位: BSRR(i) 和BSRR(i+SIZE)。当写入 1 时, BSRR(i) 位会置位对应的 ODR(i) 位。当写入 1 时,BSRR(i+SIZE) 位会清零 ODR(i) 对应的位。在 GPIOx_BSRR 中向任何位写入 0 都不会对 GPIOx_ODR 中的对应位产生任何影响。如果在 GPIOx_BSRR 中同时尝试对某个位执行置位和清零操作,则置位操作优先。

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)中的对应位。

I/O 复用功能输入/输出
有两个寄存器可用来从每个 I/O 可用的 16 个复用功能输入/输出中进行选择。借助这些寄存器,可根据应用程序的要求将某个复用功能连接到其它某个引脚。这意味着可使用 GPIOx_AFRL 和 GPIOx_AFRH 复用功能寄存器在每个 GPIO 上复用多个可用的外设功能。这样一来,应用程序可为每个 I/O 选择任何一个可用功能。由于 AF 选择信号由复用功能输入和复用功能输出共用,所以只需为每个 I/O 的复用功能输入/输出选择一个通道即可。

STM32的GPIO

例如:
对于GPIO 复用功能低位寄存器 (GPIOx_AFRL):

STM32的GPIO