zoukankan      html  css  js  c++  java
  • 010:请教STM32用JLINK V8 SWD输出调试信息到ITM Viewer的问题(转)

    作者: dhyana    时间: 2010-8-1 21:24
    标题: 请教STM32用JLINK V8 SWD输出调试信息到ITM Viewer的问题
    请教各位,我在用STM32F103VBT6 , RVMDK 3.9 ,J-LINK V8的SWD口。
    接线为VCC PA13 PA14 GND的四线SWD。程序中重定义了printf的fputc到ITM0.
    我想在调试时候,从SWO输出调试信息,参考了一下网上的用ULINK2输出到ITM viewer的例子,自己修改了一下。但是发现用J-LINK 有些问题。
    代码如下:

    //ITM reg
    #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
    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);
    }

    如果在调试器CortexM3 JLINK选项中打开Trace,那么会收到警告信息“Trace仅能从SWO输出,请选择SWD模式”,如果不开trace,那么在ITM viewer中看不到自己的输出信息。
    请问有怎么样才可以用printf输出调试信息到ITM viewer
    作者: dhyana    时间: 2010-8-1 21:31
    原始的参考信息链接是这个:http://bbs.21ic.com/icview-109178-1-1.html
    难道现在的J-LINK V8还是不能支持吗
    作者: dhyana    时间: 2010-8-2 11:04

    (原文件名:swd.jpg)
    上面是我原来连接用的电路,后来我按照下面的图,加入了SWO-PB3连接。但还是不能工作。
    一旦在cortexM3-JLINK中选择了 trace,就会遇到
    (原文件名:error1.jpg)
    这样的错误。
    如果去掉trace,那么在 ITM viewer中则没有任何信息出现。
    作者: dhyana    时间: 2010-8-2 11:08
    下面是我的设置方法和J-LINK信息。

    (原文件名:1.jpg)

    (原文件名:2.jpg)

    (原文件名:3.jpg)

    (原文件名:4.jpg)
    作者: dr2001    时间: 2010-8-2 11:19
    注意以下内容:
    - Keil MDK版本适当更新,过旧的版本对Jlink的支持可能不够好。该同步的DLL要同步。
    - Cortex M3的调试接口必须使用SWD,至少需要5线连接:Vref, SWDIO, SWCLK, SWO, GND。
    - 在Keil中确认调试模式选择的SWD。
    JLink设置没有什么问题。
    这种设置,应该是编译通过,程序能运行,但是不一定ITM能看到输出。
    STM32开ITM输出,有一个引脚功能需要手工设置,有一个寄存器。查一下手册就行了。
    作者: dhyana    时间: 2010-8-2 12:05
    楼上很专业哈~
    我现在已经连接了 Vref,SWDIO,SWCLK,SWO,GND
    更换了keil下JL2CM3.DLL,由1.8.0换成了1.5.7,开启  trace不会提示select sw port了。
    现在用ST的库,其中有ITM_SendChar,它已经设置了寄存器,但是我还是不能正常的看到我输出的信息。ITM Viewer中有时会看到一些hex的数据,但是不明白是什么,而且程序在运行到ITM_SendChar后,似乎就停止下来了。
      STM32Init();
      while (1)
      {
        ITM_SendChar(0xAB);
      }
    下面是那个函数的定义,来源于core_cm3.h
    static __INLINE uint32_t ITM_SendChar (uint32_t ch)
    {
      if (ch == '\n') ITM_SendChar('\r');
      if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA)  &&
          (ITM->TCR & ITM_TCR_ITMENA)                  &&
          (ITM->TER & (1UL << 0))  )
      {
        while (ITM->PORT[0].u32 == 0);
        ITM->PORT[0].u8 = (uint8_t) ch;
      } 
      return (ch);
    }
    运行到    while (ITM->PORT[0].u32 == 0); 停止
    作者: dhyana    时间: 2010-8-2 13:36
    如果用软件模拟,则在ITM Viewer 中,可以看到调试信息。
    作者: dhyana    时间: 2010-8-2 18:47
    现在的测试结果,用了jlink V7,V8两个编程器。在MDK 4.12下,调试中会在core_cm3.c中的
    static __INLINE uint32_t ITM_SendChar (uint32_t ch)
        while (ITM->PORT[0].u32 == 0);
    处死循环。
    如果不调试,断电上电运行,是正常的。但是都不能在ITM窗口看到调试信息。不明白了。。。
    现在我的SWO(PB3)连接到jlink的13脚的。
    作者: dr2001    时间: 2010-8-2 19:42
    我看了一下,可以用的配置和你是类似的,看看这些是不是正确:
    1、写个点LED的代码,确认程序下载到Flash了。(脱开JLink,应该能正常点灯)
    2、我的JLink设置:
    Debug的Cache Options是一个都没选。因为我要求数据是同步的。这个应该没影响。
    Debug的Download Options,两个都有。Verify应该可以不选;Download to Flash应该选上把……要不然咋用?
    Trace的Core Clock要按照你初始化代码初始化后的写。
    右边一竖列,就是TimeStamp,Trace Events,这个要求MCU集成ETM才好用。STM32好像是没有的,因此最好不要选。
    中间的Inst Trace也是什么都不要选的。
    ITM按图没问题。
    3、代码上,STM32F103C8T6需要DBGMCU_CR = 1 << 5;查一下手册具体的含义。总之就是需要允许一个引脚功能,否则SWO打不出来。
    4、用ITM之前,MCU的Core时钟一定要到和你在JLink Trace一样的频率,否则异步数据打出来都是乱的。(类似UART波特率匹配)
    写ITM就是这样的语句
    while((CM3_ITM_PORT[0] & 0x1) == 0x0)
    CM3_ITM_PORT[0] = _C
    就足够了。
    你参考一下,我用103C8T6在Jlink V7上非常正常。当然开始的时候因为初始化什么的略微折腾了两下。
    作者: dr2001    时间: 2010-8-2 19:55
    另外补充几句,可能有助于ITM调试。
    就我观察到的现象,Keil MDK的Jlink驱动,会根据在Settings页面的设置,在适当的时候设置Cortex M3相关的寄存器。这样用户就不用自行设置相关寄存器,而可以直接使用ITM。
    当然,此事不能保证一定在所有的Keil版本和JLink的驱动上复现。
    从CM3内核实现上来说,你就视SWO是一个UART就可以了(SWO好象是有两个实现,一个是曼彻斯特编码,一个是UART)。只不过它数据的数据是经过调试接口打包过的。ITM是数据报文的一部分而已。该UART是用CM3 Core的时钟驱动的。
    和串口一样,仿真器需要给定一个采样频率,然后你需要在ARM Core设置相应的分频数量。然后允许ITM相关的寄存器,并且让信号从引脚输出。最终ITM方可工作。
    ITM输出就是带有Buffer的串口那样。
    按串口的调试思路,比较容易搞定。
    作者: dhyana    时间: 2010-8-2 21:06
    非常感谢dr2001,刚才调试通过了。
    就是那个DBGMCU_CR的TRACE_IOEN位,需要在调试文件STM32DBG.INI中配置,默认是0,选为1即可。否则程序就会在while (ITM->PORT[0].u32 == 0);处死循环。
    补充一下,Download to Flash和verify不用选上,我没有发现选中和不选的差异。
    右边那些event,我选中后,有一些我看不明白的调试信息输出。研究中。
    SWO速度,好像按照一定的分频,就不会出错,就像usart的波特率,只要是和标准波特率没有过大的偏差,就可以自己适应。
    可怜网上的资源啊,之前只有一个德文论坛上有类似讨论,我怀疑网上资料大部分都仅仅是调试了软件模拟,没有真实硬件调试。
    调试功能中有一些好像JLINK不支持,准备去买一个ULINK2试一下。
    作者: lzyr    时间: 2010-8-2 21:31
    IAR 可以吗?
    作者: dr2001    时间: 2010-8-3 09:35
    回复【10楼】dhyana 
    -----------------------------------------------------------------------
    恭喜。搞定了就好。
    Download to Flash,主要是JLink自己能分辨目标是RAM还是Flash,然后调用对应策略搞定。所以Keil的有些选项究竟是什么作用,不太容易弄清楚。不影响使用的话,还是不选比较安全点。
    那些Event都会通过ETM打出来调试报文,Keil的调试界面不一定解析了这些东西。或者他的JLink驱动没去解析。谁知道呢。。。
    反正一般情况下用不到那些。
    具体报文结构在CM3的TRM里边貌似有线索,可能需要看ETM的手册才能知道报文格式。
    ITM是单向输出的,如果就是打印调试信息的话,是个很好用的东西。
    作者: dr2001    时间: 2010-8-3 09:37
    回复【11楼】lzyr 
    -----------------------------------------------------------------------
    IAR不太清楚,你可以查查。
    支持CortexM调试的话,我估计多少会支持一些的。
    作者: dhyana    时间: 2010-8-3 15:31
    IAR据说是支持的。
    dr2001很热心,我目前打印调试信息就可以了。之后准备花时间专门学习一下调试方面的东西。
    作者: rlogin    时间: 2010-8-3 23:54
    好贴啊,应该裤头
    作者: gamep    时间: 2010-8-18 19:48
    又见高人,学习
    作者: lileistone    时间: 2010-10-11 11:57
    最近在看trace方面的东西,mark一下~
    作者: twd3621576    时间: 2010-12-29 11:21
    UART 调试
    作者: sky412    时间: 2011-1-2 21:48
    请问楼主有没有在ULINK2下试验成功?
    作者: scsdwxj2005    时间: 2011-7-14 15:43
    发一个在ULINK2下可用的工程,红牛开发板例程。
    红牛开发板例程,可用于ULINK2仿真器。ourdev_657801UUTPRH.rar(文件大小:280K) (原文件名:ADC_test.rar)
    作者: YOYOPAOPAO    时间: 2011-7-17 09:47
    JLINKV8的USB驱动可以发一份给我么?
    作者: gamethink    时间: 2011-7-24 21:13
    简单来说,能不能认为ITM Viewer其实就是一个串口呢?
    只不过这个串口不占系统资源?(但实际上也要调用函数发送出去)
    作者: www1519    时间: 2011-7-24 21:22
    mark
    作者: hnsw    时间: 2011-8-6 19:12
    mark~~~
    作者: fengyin_kai    时间: 2011-8-11 11:10
    提示: 该帖被管理员或版主屏蔽
    作者: youke    时间: 2011-8-17 22:00
    反正发现用ULINK2  根本 就不行  让费了 我5天时间  官方的例子不行  看到隔壁一个哥们 用TI的CCS开发环境能采样到AD的波形在开发平台上显示出来  羡慕中!
    MDK  官方说 用硬件 看逻辑分析仪只能看 4路   结果一个都不行  害得让费我几天时间.
    作者: youke    时间: 2011-8-17 22:03
    请问  【20楼】 scsdwxj2005  兄弟 有没有 把硬件AD采样的 波形在 MDK  逻辑分析仪上显示正确过??
    作者: gaoup1986    时间: 2011-8-17 22:29
    楼主的问题我遇见过,后来找了FAE解决的
    1.我用的是IAR5.1版本的,后来FAE给装了6.2版本,据说低版本的用SWD用一些文件冲突;
    2.VCC GND SWDIO SWDLK一个都不用上拉,FAE给出的解释是,盗版的JLINK内部19脚有5V输出,而正版的没有5V,所以接口上拉,有很多不必要的麻烦;
    作者: alan8918    时间: 2012-4-10 17:20
    Mark SWD调试
    作者: adwinter    时间: 2012-6-29 17:09
    写的很好 解决了很多疑问 学习了  
    作者: alan_yzh    时间: 2012-10-10 10:34
    不错,原来这个问题这么复杂的,学习了!
    作者: yuhui    时间: 2012-11-15 21:56
    好资料,学习。
    作者: automaticdai    时间: 2012-11-16 09:05
    学习一下,非常想实现这个先进的调试功能。
    作者: lovelywwei    时间: 2012-11-16 09:21
    这个功能很实用。学习了。
  • 相关阅读:
    关于架构,关于系统,关于合作,我也得问问我们自己
    vs2013 无法打开 源 文件 "SDKDDKVer.h"
    视频基础知识汇总
    python gRPC接口调用
    python多线程同时执行2个函数任务之threading
    git基本操作_快速查询
    pycharm激活码 我是搬运工
    CodeReview的一些原则
    python多线程执行同一个函数任务之threading、ThreadPoolExecutor.map
    python程序超时处理 timeout_decorator
  • 原文地址:https://www.cnblogs.com/afeibfp/p/2857268.html
Copyright © 2011-2022 走看看