STM32N6 平台下,通过 SWV-ITM(Serial Wire Viewer/Instrumentation Trace Macrocell)实现 printf 重定向,可避免占用 UART 等外设 IO,适配资源紧张的调试场景。核心实现逻辑是:重写__io_putchar函数绑定 ITM 发送接口,配置 SWO 引脚与时钟,再通过 CubeIDE 调试配置启用 SWV 跟踪,即可在控制台输出打印信息。本文基于 LAT1498 文档,拆解分步实现方案与关键注意点。
资料获取:STM32N6平台STM32CubeIDE下printf IO重定向到SWV-ITM
1. 核心优势与适用场景
- 无 IO 占用:无需占用 UART、SPI 等通信外设,释放硬件资源;
- 调试高效:打印信息与调试断点同步,无需额外串口工具;
- 适配场景:STM32N6 全系列(如 STM32N657X0H3),STM32CubeIDE 环境(兼容≥v1.14 版本)。
2. 代码修改:三步完成底层配置
需在工程中修改main.c,实现 ITM 发送、时钟使能与 SWO 引脚配置,核心代码直接复用即可。
2.1 重写__io_putchar 函数(绑定 ITM 发送)
printf最终会调用__io_putchar函数,重写该函数将字符通过 ITM 发送到 SWV:
2.2 使能 Trace/Debug 时钟与 ITM 模块
在main函数的USER CODE BEGIN Init段添加代码,启用相关时钟与 ITM 功能:
2.3 配置 SWO GPIO 引脚(STM32N6 专属)
STM32N6 的 SWO 引脚为 PB5(复用功能 AF0_TRACE),需启用 GPIOB 时钟并配置引脚:
3. CubeIDE 调试配置:两步启用 SWV 跟踪
代码修改完成后,需配置 IDE 调试参数,确保 SWV 能接收 ITM 数据。
3.1 配置 SWV 核心时钟
- 点击 IDE 菜单栏「Run→Debug Configurations」,选中当前工程的调试配置;
- 切换到「Debugger」标签页,勾选「Enable Serial Wire Viewer (SWV)」;
- 「Core Clock (MHz)」设置为TPIU 时钟(STM32N6 默认 SYSA=400MHz,TPIU=SYSA/8=50MHz,故填写 50.0);
- 其他保持默认(接口选择 SWD,复位方式为 Connect under reset),点击「Apply」。
3.2 启用 ITM 数据控制台
- 启动调试(Debug As→STM32 C/C++ Application),待程序暂停在 main 函数;
- 打开 IDE 底部「SWV ITM Data Console」窗口(若无则通过「Window→Show View→Other→SWV→SWV ITM Data Console」调出);
- 点击窗口左上角「Configure Trace」(齿轮图标),勾选「ITM Stimulus Ports」的 Port 0(与代码中 ITM->TER |= 0x1 对应);
- 点击「Start Trace」(红色圆点图标),运行程序(F8),即可在控制台看到 printf 输出。
4. 验证与关键注意事项
4.1 快速验证
在 main 函数循环中添加printf("STM32N6 SWV-ITM Test: %dn", i++);,运行后控制台应周期性输出数字,说明重定向成功。
4.2 避坑要点
- 引脚不可错:STM32N6 的 SWO 固定为 PB5(AF0_TRACE),其他型号需查数据手册,但 N6 系列统一此配置;
- 时钟必使能:GPIOB 的 AHB4 时钟未启用会导致 SWO 无输出,代码中
__HAL_RCC_GPIOB_CLK_ENABLE()不可省略; - 核心时钟匹配:必须设置为 TPIU 时钟(SYSA/8),否则数据传输异常(如乱码、无输出)。
阅读全文
215