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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在STM32H7上正确设置Cortex M7 ITM相关的知识,希望对你有一定的参考价值。

我正在使用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跟踪日志。

但是我不明白输出:

enter image description here

如果删除对ITM_Port的呼叫,则跟踪为空...

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

我查看了汇编级别(看上去正确),并且我注意到应该将0x10写入ITM_STIM20的存储指令无效,该寄存器未修改。有什么要解锁/启用的吗?

我还用替代功能SWO配置了GPIO PB3。

任何想法?

答案

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

请重新检查该寄存器的读/写语义。Reference Manual,第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通道选择进行测量。

第二种最简单的方法是在支持同步跟踪端口的调试适配器上花费几千美元。仅高端适配器变体(例如J-Trace,Lauterbach等)支持此功能-通常针对ETM跟踪,但是您也可以使用并行TPIU接口以更高的速率输出ITM数据。在描述的情况下,这种策略并不是最优雅的方法-请先考虑采用其他方法!

以上是关于无法在STM32H7上正确设置Cortex M7 ITM的主要内容,如果未能解决你的问题,请参考以下文章

STM32H7时钟树RCC分析---原理讲解

BSP视频教程STM32H7视频教程第1期:初识STM32H7准备工作,了解Cortex-M7内核及MDK,IAR,Embedded Studio,STM32CubeIDE和VS Code简单比较

BSP视频教程STM32H7视频教程第13期:系统讲解Cortex-M7内核MPU和Cache,理解通透(2022-04-17)

STM32H7 SPI通信:FIFO管理问题

FMC 比 STM32H7 上的 QSPI 慢?

STM32H7 FPU 中未设置除零异常标志