MDK上使用 ULINK2设备上的SW调试 实现STM32 的 trace功能 (二)
配置Trace功能
Trace功能包括:Core Clock、Trace Port 以及定义Trace Events等。它们的设置对Trace HW的正确执行非常重要。连接上
Target Debugger以后,选择Options for Target -> Debug -> Settings –> Trace Tab或者Peripherals –> Target
Settings–> Trace Tab 进入Setup。
这些功能将在后面作介绍。
注意:目前,ULINK2仅支持Serial Wire Output - UART/NRZ跟踪端口。
详情另见ULINK2用户手册中 Trace Port。
以下是允许STM32 Driver功能和Target Driver功能的两个必要步骤:
1. 选中TRACE_ION功能,并在文件STM32DBG.ini中设置TRACE_MODE为异步方式。
2. 在Cortex-M Target Driver Setup窗口中选择Trace Enabled功能,并设置正确的Core Clock值。
将Core Clock的值设置为常用的CPU Core Clock(可以在μVision Status Bar和μVision Status Bar中获得准确值)。选中
Trace Enable功能,这样才可以获得Serial-Wire Output (SWO)的正确跟踪信息。选择Trace Enable还可以通过SWO重新获得
跟踪信息。
Core Clock和VTReg CORE_CLK相对应。在目标调试过程中,通过VTReg CORE_CLK值可以调整Core Clock的
值。在调试器脚本中也可以调整Core Clock的值。
详情另见ULINK2用户手册中 Trace Configuration。
μVision状态栏信息
μVision状态栏显示的是实时跟踪信息。在目标调试过程中,状态栏显示在屏幕底部,实时跟踪当前的状态(运行还是停止)并将跟
踪信息显示出来。
跟踪信息有: 在状态栏中可能显示如下的Trace信息:
Ø Trace: Communication Error,表示Cortex-M3和μVision之间通信出现错误,原因是Core Clock设置出错或者Trace
硬件有问题;
Ø Trace: HW Buffer Overrun,表示ULink2缓冲超出,ULink2无法给μVision提供足够快的数据通信;
Ø Trace: SW Buffer Overrun,发生μVision内部软件缓冲超出;
Ø Trace: No Synchronization,未受到同步包,原因是配置错误或者未连接跟踪硬件;
Ø Trace: Data Stream Error,检测到跟踪数据流;
Ø Trace: Data Overflow,捕获了太多的跟踪数据,跟踪端口太忙导致跟踪包丢失;
Ø Trace: Running …,表示目标板和实时跟踪允许正确;
Ø :表示目标板和实时跟踪停止,之前未发生任何错误。
注意:
通常,在运行期过程中改变CPU时钟,会显示Trace: Communication Error。
原因是在Cortex-M3启动时,系统会按晶振时钟频率运行,进入主程序以后才切换到配置好的时钟频率。而实时跟踪会预期CPU
时钟和配置好的Core Clock时钟相同。如果配置的时钟与实际的CPU时钟不同,就会显示出错信息。因此,在CPU启动的时候,
先将Core Clock的值配置为晶振频率,等CPU改变了时钟频率后,再将Core Clock设置为正确的时钟频率。
使用Peripherals - > Target Settings可以在目标调过程中重置Core Clock的值。
Core Clock对应于VTReg CORE_CLK,在目标调试过程中,可以通过VTReg CORE_CLK来调整Core Clock的值。
在调试器脚本文件中也可这样调整。
ITM观测器
ITM是一个应用驱动跟踪源,支持应用事件跟踪和printf类型的调试。通过激励端口0传送数据,ITM观测器窗口显示的数据为ASCII码
或十六进制码。
要使用ITM观测器,首先需要在源代码中加入如下关于ITM端口寄存器的定义:
#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA 0x01000000
然后,在源代码中添加fputc函数,它用于向ITM的激励端口0寄存器写数据。
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
if (DEMCR & TRCENA) {
while (ITM_Port32(0) == 0);
ITM_Port8(0) = ch;
}
return(ch);
}
printf("ITM Output Debug Trace message");
有了fputc函数之后,就可以用printf函数做为ITM调试输出。ITM的激励端口0与ITM Viewer窗口之间的连接是固定关系的,因此还
需要在下图中的选中Port 0。
在目标调试过程中,选择μVision-> View -> Serial Window -> ITM Viewer,打开ITM Viewer窗口。
完成以上设置以后,就可以在目标调试期间通过ITM Viewer窗口查看到调试跟踪信息。
注意:ITM窗口显示的数据只能通过ITM激励端口0传送。其他ITM端口在Trace Records 窗口中可以监测到,但其显示的数据
仍然是通过激励端口0传送。
逻辑分析器
使用实时调试,可以通过逻辑分析器观测至多4个变量值的变化。
通过以下步骤可以将变量添加到逻辑分析器中。
在Cortex-M Target Driver Setup窗口允许Timestamps(时间戳)功能,以获得ITM的时间戳数据,并选择合适的
Prescaler值。
更多详情请查看ULINK2用户手册中的 Timestamps。
在逻辑分析仪中添加希望观测的变量。
更多详情请查看ULINK2用户手册中Logic Analyzer。
在目标调试过程中仔细观测变量值的变化。
约束:
最多只能观测4个变量。
在同一时间内使用其他观测点,会减少观测的变量数量。
观测不到定义在函数内部的局部变量值。 应选择全局变量进行观测。
跟踪运行过程中必须没有任何错误。丢失跟踪包会导致数据不完整。请参阅 μVision Status Bar Info.
下期继续。。。