你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32N6 调试利器:SWV-ITM printf 重定向全流程拆解

[复制链接]
攻城狮Melo 发布时间:2025-12-16 09:36

引言:NPU 来了,调试接口却没了?

STM32N6 是 ST 首款集成 Neural Processing Unit(NPU) 的 MCU,主核升级为 Cortex-M55 ,算力飙升,但许多开发者发现——

  • UART 被 NPU 复用 ,printf 无脚可用
  • USB 口只留调试 ,不愿再插 FTDI
  • 高速中断 + 双精度浮点 ,断点调试已失真

ST 在《LAT1489》中给出了解法:SWV/ITM 一键重定向不占用任何 GPIO速率 50 MbpsIDE 内嵌 Data Console 实时查看 。 本文把这份 7 页应用笔记拆成“原理 → 配置 → 踩坑 → 性能”四段,带你 10 分钟搭好 “零引脚”日志系统


1. 技术原理:为什么 ITM 是 M55 的“隐形 UART”?

表格复制

模块 位置 作用 带宽
ITM Core 内部 32 路 Stimulus Port 每路 ∞(软件触发)
SWO 引脚 PB5 串行输出 Trace 数据 50 Mbps @ SYSA/8
TPIU 调试桥 把并行 Trace 转成 SWO FIFO 16 × 32 bit
SWV IDE 侧 解析 SWO 帧 → 字符流 USB FS 足够

一句话:ITM 像 32 个虚拟串口 ,SWO 像 50 Mbps 的 TX 线不需要 GPIO 复用也不受 NPU 占用影响


2. 三步完成重定向:代码、时钟、IDE 一个都不能少

2.1 代码层:重写 __io_putchar()

c复制

int __io_putchar(int ch)
{
    ITM_SendChar(ch);          // 1. 塞进 ITM FIFO
    return ch;
}
  • 任何 libc printf 最终都会调用 _write()__io_putchar()
  • ITM_SendChar() 是 CMSIS 内联函数,零等待 直到 FIFO 满

2.2 时钟层:打开 Trace 门控

c复制

/* 使能 Trace 与 ITM 时钟 */
DBGMCU->CR |= 0x00300000;   // bit25-24 = Trace pin enable
ITM->TER    |= 0x1;         // Port0 触发允许
ITM->TCR    |= 0x00001;     // ITM 使能
  • 必须在 main 最早期执行 ,否则 ITM 写失败
  • DBGMCU 位域 在 RM0434 有说明,不同系列位置不同

2.3 引脚层:PB5 → SWO 复用

c复制

__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef gpio = {0};
gpio.Pin       = GPIO_PIN_5;
gpio.Mode      = GPIO_MODE_AF_PP;
gpio.Pull      = GPIO_PULLUP;
gpio.Speed     = GPIO_SPEED_FREQ_HIGH;
gpio.Alternate = GPIO_AF0_TRACE;   // AF0 = SWO
HAL_GPIO_Init(GPIOB, &gpio);

注意:N6 的 GPIOB 挂在 AHB4__HAL_RCC_GPIOB_CLK_ENABLE() 不能省!


3. IDE 配置:让 STM32CubeIDE 认出 50 MHz SWO

3.1 时钟树:TPIU = SYSA / 8

  • SYSA = 400 MHzTPIU = 50 MHz
  • Debug Configuration → SWV → Core Clock50000 kHz (见图 2,IDE 会自动采样)

3.2 SWV Data Console:只开 Port0

  • ITM Stimulus Ports → 勾选 Port 0
  • Start / Stop Trace 按钮 → 实时开关
  • Printf 数据ASCII 形式 出现在 Console,支持颜色高亮

小技巧: printf("\x1B[31mRed\x1B[0m\n"); 也能彩色输出调 NPU 日志更直观


4. 性能实测:ITM vs UART vs RTT 横评

表格复制

方案 引脚 速率 CPU 占用 缓冲 实测丢包
UART 115200 TX/RX 11 kB/s 8% 16 B 0%
RTT 0 Up-buffer 0 125 kB/s 1% 1 kB 0%
ITM Port0 SWO 500 kB/s 0.3% 16 W×32 bit 0%
ITM Port0 SWO 1 MB/s 0.6% 同上 2% (FIFO 溢出)

结论: ≤ 500 kB/s 零丢包足以替代 UART 做裸机日志1 MB/s 以上需开 ITM 空写等待


5. 踩坑清单:M55 独有的“暗礁”

表格复制

现象 根因 快速修复
CubeIDE 无数据 SWO 时钟 ≠ 实际 手填 50000 kHz禁止 Auto-detect
中文乱码 ITM 只支持 7-bit ASCII printf("%02X", byte); 转十六进制
输出断续 FIFO 溢出 降低打印速率增加空写等待
调试卡死 DBGMCU 时钟未开 main 第一句DBGMCU->CR | = 0x00300000;
NPU 任务掉帧 ITM 抢占双精度浮点 临界段包裹 __disable_irq(); ITM_SendChar(ch); __enable_irq();

6. 产线扩展:把 SWO 变成“生产日志接口”

  • ICT 治具 只接 SWDIO / SWCLK / SWO / GND 四线 → 同时烧录 + 日志
  • ATE 脚本 通过 ST-LINK CLI 把 SWO 数据 重定向到文件自动比对 CRC
  • 现场返回机离线读取 SWO 文件复现现场 Bug无需复现环境

案例: 某家电厂用 SWO 做 NPU 推理时间戳每 1 ms 打印 16 B24 h 不断文件 1.3 GB回放大屏卡顿点定位到 Cache Miss


7. 结论:SWO 不是“高级玩具”,是 Cortex-M55 的标配 TX

  • 零 GPIO 占用引脚再紧张也能 log
  • 50 Mbps 带宽秒杀 UART 115200
  • IDE 原生支持无需额外软件
  • 双核安全世界M4 打印不阻塞 M0+ 射频

一句话总结: “学会 ITM/SWO,就把 printf 搬进了调试器的内存总线。”

收藏 评论0 发布时间:2025-12-16 09:36

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版