作者: 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
这个功能很实用。学习了。