• 正文
  • 相关推荐
申请入驻 产业图谱

STM32N6 CubeIDE 实战:printf重定向SWV-ITM全流程(无占用 UART)

22小时前
215
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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:

// 直接添加在main.c文件开头或用户代码区
int __io_putchar(int ch)
{
  ITM_SendChar(ch);  // ITM核心发送函数,需包含CMSIS头文件(默认工程已包含)
  return ch;
}

2.2 使能 Trace/Debug 时钟与 ITM 模块

main函数的USER CODE BEGIN Init段添加代码,启用相关时钟与 ITM 功能:

/* USER CODE BEGIN Init */
// 1. 使能Trace Clock和Debug Clock(DBGMCU寄存器配置)
DBGMCU->CR |= 0x00300000;  
// 2. 使能ITM端口0(printf输出绑定端口0)
ITM->TER |= 0x1;  
// 3. 使能ITM全局功能(TCR寄存器使能)
ITM->TCR |= 0x00001;  
/* USER CODE END Init */

2.3 配置 SWO GPIO 引脚(STM32N6 专属)

STM32N6 的 SWO 引脚为 PB5(复用功能 AF0_TRACE),需启用 GPIOB 时钟并配置引脚:

/* USER CODE BEGIN Init */
// 接上面的代码继续添加
// 1. 使能GPIOB时钟(AHB4总线,STM32N6专属)
__HAL_RCC_GPIOB_CLK_ENABLE();  
// 2. 配置PB5为AF0_TRACE复用模式
GPIO_InitTypeDef gpio_init;
gpio_init.Mode = GPIO_MODE_AF_PP;    // 复用推挽输出
gpio_init.Pull = GPIO_PULLUP;        // 上拉
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;  // 高速
gpio_init.Pin = GPIO_PIN_5;          // SWO对应PB5
gpio_init.Alternate = GPIO_AF0_TRACE;    // 复用为TRACE功能
HAL_GPIO_Init(GPIOB, &gpio_init);
/* USER CODE END Init */

 

3. CubeIDE 调试配置:两步启用 SWV 跟踪

代码修改完成后,需配置 IDE 调试参数,确保 SWV 能接收 ITM 数据。

3.1 配置 SWV 核心时钟

  1. 点击 IDE 菜单栏「Run→Debug Configurations」,选中当前工程的调试配置;
  2. 切换到「Debugger」标签页,勾选「Enable Serial Wire Viewer (SWV)」;
  3. 「Core Clock (MHz)」设置为TPIU 时钟(STM32N6 默认 SYSA=400MHz,TPIU=SYSA/8=50MHz,故填写 50.0);
  4. 其他保持默认(接口选择 SWD,复位方式为 Connect under reset),点击「Apply」。

3.2 启用 ITM 数据控制台

  1. 启动调试(Debug As→STM32 C/C++ Application),待程序暂停在 main 函数;
  2. 打开 IDE 底部「SWV ITM Data Console」窗口(若无则通过「Window→Show View→Other→SWV→SWV ITM Data Console」调出);
  3. 点击窗口左上角「Configure Trace」(齿轮图标),勾选「ITM Stimulus Ports」的 Port 0(与代码中 ITM->TER |= 0x1 对应);
  4. 点击「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),否则数据传输异常(如乱码、无输出)。

相关推荐