请教各位,我在用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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
就我观察到的现象,Keil MDK的Jlink驱动,会根据在Settings页面的设置,在适当的时候设置Cortex M3相关的寄存器。这样用户就不用自行设置相关寄存器,而可以直接使用ITM。
当然,此事不能保证一定在所有的Keil版本和JLink的驱动上复现。
从CM3内核实现上来说,你就视SWO是一个UART就可以了(SWO好象是有两个实现,一个是曼彻斯特编码,一个是UART)。只不过它数据的数据是经过调试接口打包过的。ITM是数据报文的一部分而已。该UART是用CM3 Core的时钟驱动的。
和串口一样,仿真器需要给定一个采样频率,然后你需要在ARM Core设置相应的分频数量。然后允许ITM相关的寄存器,并且让信号从引脚输出。最终ITM方可工作。
ITM输出就是带有Buffer的串口那样。
按串口的调试思路,比较容易搞定。
一周热门 更多>