STM32 复用功能(AF)配置的常见误区

问题

USART 配好了、SPI 也配好了,代码调了 HAL_UART_Transmit 但引脚没波形,示波器量是 0V 或 3.3V 不动。

大概率:GPIO 没有配置成对应的复用功能(AF)。

什么是复用功能

STM32 的每个 GPIO 引脚可以干很多事:

复制代码
PA9 可以是:
- 普通 GPIO 输出
- 普通 GPIO 输入
- USART1_TX(复用 AF7)
- TIM1_CH2(复用 AF1)
- SPI2_SCK(复用 AF5)

想让引脚做 USART 的 TX,需要在 GPIO 寄存器中选择对应的复用号。

典型错误

错误一:配成了普通输出

复制代码
// ❌ CubeMX 里 PA9 选 GPIO_Output
// 然后代码里 HAL_UART_Transmit...
// 引脚只能手动高低,UART 外设控制不了它

错误二:复用号选错了

CubeMX 自动配对的,不会错。但如果你手写寄存器:

复制代码
// ❌ 想配 USART1_TX(AF7),却写成了 AF1(TIM)
GPIOA->AFR[1] |= (0x01 << 4);  // AFRH 的 bit 4~7 = 0001 → AF1
// 实际上应该写 0111(AF7)
// ✅ 正确做法——先清零再赋值:
GPIOA->AFR[1] &= ~(0x0F << 4);   // 先清零目标字段
GPIOA->AFR[1] |= (0x07 << 4);    // 再写入 AF7

CubeMX 里的操作

选中 PA9 → 选 USART1_TX(不是 GPIO_Output)→ CubeMX 自动配好 AF。

验证:在 Pinout 视图里,PA9 旁边会显示 USART1_TX 字样,引脚颜色也会变成复用功能的绿色。

常用复用功能速查

外设 引脚 AF 号 AF 名称
USART1_TX PA9 AF7 AF7_USART1
USART1_RX PA10 AF7 AF7_USART1
SPI1_SCK PA5 AF5 AF5_SPI1
SPI1_MOSI PA7 AF5 AF5_SPI1
I2C1_SCL PB6 AF4 AF4_I2C1
I2C1_SDA PB7 AF4 AF4_I2C1
TIM2_CH1 PA0 AF1 AF1_TIM2
TIM3_CH3 PB0 AF2 AF2_TIM3

每个引脚的可用 AF 怎么看:

方法一:CubeMX 点中引脚,弹出的菜单只显示可用的功能。

方法二:查 STM32F407 的 datasheet(不是参考手册)→ Pinouts 章节 → 那几张巨大的引脚功能表。

代码层面验证

初始化后检查寄存器:

复制代码
// 检查 PA9 的 MODER
uint32_t moder = (GPIOA->MODER >> (9 * 2)) & 0x03;
printf("PA9 MODER = %lu (2=Alternate)\r\n", moder);
​
// 检查 PA9 的 AFRH
uint32_t afr = (GPIOA->AFR[1] >> ((9 - 8) * 4)) & 0x0F;
printf("PA9 AF = %lu (7=USART1)\r\n", afr);

如果 MODER 不是 2(Alternate Function)或者 AF 不是 7,引脚就起不到 USART1_TX 的作用。

总结

一句话
GPIO 要做外设功能,必须配成 Alternate Function + 正确的 AF 编号
CubeMX 会自动配好,不要手动改成 GPIO_Output/Input
如果怀疑引脚功能不对,读 MODER 和 AFR 寄存器确认
相关推荐
zhangrelay5 小时前
新版|-|单片机原理与接口技术-2026持续改进优化-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈
笔记·单片机·嵌入式硬件·学习
comyccccc6 小时前
STM32F103C8T6最小系统板设计全解析学习笔记
单片机·1024程序员节
Industio_触觉智能6 小时前
把NPU检测直接嵌进采集终端|RK3576 AI采集终端全链路拆解教程-下
嵌入式硬件·ai·硬件架构·npu·ai视觉·rk3576·采集终端
en.en..7 小时前
STM32 GPIO ODR 与 BSRR 寄存器完整对比详解
单片机·嵌入式硬件
HQB20269 小时前
EG1182|屹晶微电子 60V 内置高压管异步降压 DC‑DC
嵌入式硬件·硬件工程
LCG米11 小时前
STM32硬件SPI驱动SSD1306 OLED实测:上电黑屏排查、页寻址模式与取模扫描方向陷阱
stm32·单片机·嵌入式硬件·嵌入式
深圳老胡11 小时前
STM32C5A3ZG 网络调试总结:从启动失败到连续 Ping 稳定
笔记·stm32·单片机·代码规范
qq_4017004112 小时前
100 个 IoT 小项目,给 ESP32 入门补上实操
前端·网络·stm32
硅基造物主12 小时前
STM32 从 0 到 1 做智能家居(八):PWM 控制风扇、加热片与 SG90 窗帘
stm32·嵌入式硬件·智能家居·hal库·pwm
简单电磁炮12 小时前
关于adc采集
stm32·单片机