441 字
1 分钟
GPIO(通用输入输出)STM32F103
2026-05-20

GPIO(通用输入输出)STM32F103#

概述#

GPIO 是 MCU 与外部世界交互的最基本接口。每个引脚可以配置为输入、输出、复用功能或模拟模式。

[!NOTE] 关键参考 完整寄存器定义参见 [[RM0008 参考手册]]

寄存器核心块#

端口配置寄存器 (CRL/CRH)#

  • GPIOx_CRL:偏移 0x00,配置引脚 0-7
  • GPIOx_CRH:偏移 0x04,配置引脚 8-15

每个引脚占用 4 位:[CNF1:0 MODE1:0]

  • MODE:00=输入,01=输出(最高10MHz),10=输出(2MHz),11=输出(50MHz)

[!tips] 这里的MHz代表压摆率,也就是这个端口电平翻转/变化的快慢,只在需要变化电平时才能体现,可以看作变化曲线的斜率

  • CNF
    • 输入模式:00=模拟,01=浮空,10=上拉/下拉,11=保留
    • ==输出模式:00=推挽,01=开漏,10=复用推挽,11=复用开漏==

![[Pasted image 20260520161851.png]] ![[Pasted image 20260520161930.png]]

输入/输出数据寄存器 (IDR/ODR)#

  • GPIOx_IDR:偏移 0x08,只读,反映引脚电平状态
  • GPIOx_ODR:偏移 0x0C,可读写,当引脚为输出时设置电平 ![[Pasted image 20260520162053.png]] ![[Pasted image 20260520162117.png|697]]

位设置/清除寄存器 (BSRR/BRR)#

  • GPIOx_BSRR:偏移 0x10,只写
  • 低 16 位(BSy):写 1 使对应 ODR 位置位(高电平)
  • 高 16 位(BRy):写 1 使对应 ODR 位复位(低电平)
  • 原子操作!避免读-改-写错误,推荐用于安全代码。 ![[Pasted image 20260520162515.png]]

配置锁定寄存器 (LCKR)#

  • GPIOx_LCKR:偏移 0x18,可以冻结引脚配置直到下次复位。
  • 安全设计中用于防止意外重配置。

典型操作序列#

点亮 PC13 LED(寄存器版)#

// 1. 开启 GPIOC 时钟(RCC_APB2ENR 位4)
*(volatile uint32_t*)0x40021018 |= (1 << 4);
// 2. 配置 PC13 为推挽输出(GPIOx_CRH 高 4 位清空,MODE13=11,CNF13=00)
*(volatile uint32_t*)0x40011004 &= ~(0xF << 20); // 清空 PC13 配置位
*(volatile uint32_t*)0x40011004 |= (0x3 << 20); // MODE13=11,CNF13=00(推挽)
// 3. 输出低电平点亮(假设 LED 阴极接 PC13,阳极接 VDD)
*(volatile uint32_t*)0x40011010 = (1 << 13); // BR13 置位,PC13 输出低
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

GPIO(通用输入输出)STM32F103
https://caoyue.xin/posts/stm32/gpio/
作者
Colton/曹越
发布于
2026-05-20
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录