MDK上使用 ULINK2设备上的SW调试 实现STM32 的 trace功能 (二)

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. 

下期继续。。。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liwei271828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值