stm32 SWD printf SWD调试输出

http://www.keil.com/support/man/docs/jlink/jlink_trace_itm_viewer.htm

http://armcortexm.blogs.upv.es/stm32f4-discovery-and-printf-redirection-to-debug-viewer-in-keil/

当年实习面试时面试官考我机试,keil上面写代码,然后仿真在debug view上printf数据,我当时就觉得牛叉了,一直没搞懂怎么弄的。(ps:那公司在我入职其他公司了才叫我去上班,这不是搞笑么。。。)。这几天忽然对占用一个串口作调试口这一做法很不爽了,虽然我几乎不用printf调试,我是单步调试看内存党。。。

于是我花了半个晚上google,找到上面两个教程,然后花了半个晚上测试。OKl了。有个bug未解决。

闲话少说,上图:

红圈是需要注意的地方,使用的是stlin SW模式。

stm32 SWD printf SWD调试输出_第1张图片


需要添加以下代码:

 struct __FILE { int handle; /* Add whatever you need here */ };
    FILE __stdout;
    FILE __stdin;

int fputc(int ch, FILE *f)
{
	return ITM_SendChar(ch);
}
ITM_SendChar()是在core_m3.h中定义的,m4的芯片在core_m4.h,m7的板子懒得拿出来了。注意下我在f4discovery上试,不需要定义__FILE这个结构体也能跑,f103上不行,
看了下两个工程得stdio.h有些不同,其实都定义了__stdout,但f103工程上报未定义错误,可能我错过了啥。。。能跑就暂时没纠结这里了。
结果上图:

我的代码是这样的:
while(1) {
	static int i = 0;
	bsp_LedToggle(0);
		
	printf("SB:%d\n",i++);
	printf("SB:%d\n",i++);
	printf("SB:%d\n",i++);
	__nop();	
	vTaskDelay(100);
}
在freertos的一个进程上跑的,裸机试了也行。看着是不是好爽?开始我不是这样写的,开次如下:
 
  
while(1) printf("sb:%d\n", i++);


 这么就出问题了,也是我开头说的bug,Debug view上无输入,但我安F10单步调试是又正常的输出的,我用ST-LINK Utility试也是正常的输出的。 
  

这是什么鬼。。。。不上图以为我骗你。。好吧我姑且认为是MDK的问题了,不要全速的printf就好,全速printf的机会也比较少吧。。。

综上就3点:

1.设置trace;

2.定义fputc()函数;

3.不要全速执行printf() 。

你可能感兴趣的:(stm32,keil,swd,调试,printf,STM32)