Debugging 无法在STM32H7上正确设置Cortex M7 ITM

Debugging 无法在STM32H7上正确设置Cortex M7 ITM,debugging,embedded,stm32,Debugging,Embedded,Stm32,我正在使用STM32CubeIDE开发STM32H753(STM32H753I-EVAL2板),我正在尝试设置ITM 首先,我在调试器设置中启用了SWV(当然我选择了SWD),核心时钟为400MHz(我的CPU时钟),SWO时钟为2MHz 然后在我的代码中定义了以下宏: #define ITM_Port(n) (*((volatile unsigned long *)(0xE0000000 + 4*n))) 然后按如下方式调用这个宏,在我的代码的位置,在那里我想要得到一个时间戳 ITM_Por

我正在使用STM32CubeIDE开发STM32H753(STM32H753I-EVAL2板),我正在尝试设置ITM

首先,我在调试器设置中启用了SWV(当然我选择了SWD),核心时钟为400MHz(我的CPU时钟),SWO时钟为2MHz

然后在我的代码中定义了以下宏:

#define ITM_Port(n) (*((volatile unsigned long *)(0xE0000000 + 4*n)))
然后按如下方式调用这个宏,在我的代码的位置,在那里我想要得到一个时间戳

ITM_Port(20) = 0x10;
最后,在调试会话中,我启用ITM刺激端口号20和Timerstamp,并启动SWV跟踪日志

但是,我不理解输出:

如果我删除对
ITM\U端口的调用
,则跟踪为空

我检查了寄存器ITM_TCR和ITM_TER,它们看起来是正确的。刺激端口20确实在TER中启用。在TCR中,设置位ITMENA、TSENA、SYNCENA和TXENA

我查看了汇编级别(看起来是正确的),注意到应该将0x10写入ITM_STIM20的存储指令无效,寄存器没有修改。是否有要解锁/启用的内容

我还为GPIO PB3配置了备用功能SWO

有什么想法吗

[…]我注意到本应将0x10写入ITM_STIM20的存储指令无效,寄存器未修改

请在中重新检查此寄存器的读/写语义 ,第3222页:

Write data is output on the trace bus as a software event packet. When reading, bit 0 is a
FIFOREADY indicator:
  0: Stimulus port buffer is full (or port is disabled)
  1: Stimulus port can accept new write data
因此,我不认为这个寄存器一定有错误

问题中的跟踪日志屏幕截图显示了其他端口(24、25、26、28、29、30、31)的大量ITM跟踪数据包。 请注意不要过度创建ITM跟踪数据包: 该问题涉及SWV跟踪日志,因此不同ITM端口的跟踪数据包必须全部通过同一SWO线路。 该接口不是很快(STM32H7的CPU当然是!),因此软件触发的ITM数据包创建很容易堵塞这个瓶颈,从而丢弃数据包。 问题不包括创建跟踪数据包的周围代码,但我的猜测是,在分析过程中,在更精细的级别(在循环内部等)插入额外的ITM数据包触发器会增加端口流量,直到丢失的数据包不明显为止

最简单的解决方法可能是移除部分ITM触发器(或者,一次只激活几个ITM通道,在通过SWO传输之前过滤ITM中的数据包),并一次测量不同方面,使用不同的ITM通道选择重复测量

第二种最简单的方法是在支持同步跟踪端口的调试适配器上花费几k$。此功能仅由高端适配器变体(如J-Trace、Lauterbach等)支持。它通常针对ETM跟踪,但您也可以使用并行TPIU接口以更高的速率输出ITM数据。
这种策略在描述的情况下不是最优雅的——请先考虑另一种方式! 为什么设置ITM?你想要什么?另外,请修复
此线程
链接。“设置ITM的目的是什么?”如前所述,“在我想要获取时间戳的代码位置”。我还想用ITM计算指令数,“数据”字段中的数据有一些模式。也许这是跟踪包内容?我想这是主机软件的问题。我想通过SWO上的逻辑分析仪嗅探数据