Jlink/STLink自带一个SWO接口,使用这个接口配合keil可以输出一些简单的调试信息,在没有串口可以使用的时候,SWO也可很方便的打印一些信息,比如F303RE这个板子在我的电脑上一直没法安装虚拟串口的驱动,所以我可以用这个SWO输出调试信息。论坛送的STM32F303RE上自带的stlink正好有这个SWO口,而且也接到了MCU上,所以正好可以使用,好像有的ST的板子也带了这个接口,但是其中桥接电阻并没有贴到板子上,如果要使用的话,就要自己连接起来(比如STM32F429DISCO好像就没有接上)。
对于stlink的驱动好像也有一些要求,我使用keil4带的有点旧的stlink驱动就会提示驱动不支持,后来使用keil5带的stlink驱动据可以了。
如果硬件和软件都没有问题了,还需要设置下kei:
首先打开Micro LIB
然后打开keil的Trace功能,具体设置如下:
然后就是一些重定向printf的函数了,如果之前将printf重定向了串口,那么要修改并添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#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 needed */ }; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; } return(ch); } |
打开调试即可得到调试信息:
输出调试信息
测试代码:
F303RE_SWO.rar (394.54 KB, 下载次数: 271)
*******************************************一天过去了***************************************
上面说了输出的功能,其实如果需要的话,重定向下scanf()函数即可完成从Debug Viewer向程序输入参数的,这在调试某些需要动态调整参数的程序里面应该有帮助,比如按下某个按键,激活输入功能,重新配置下参数,然后继续运行程序。
调试的时候有个变量在一直检测是否有数据输入,如果有数据输入,那么输入的数据就传到这个变量,这个接口在内核的头文件有相关的定义,我们只需要定义这个变量即可。
将下面的main.c代码完整的替换掉上面的mian.c就可以使用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#include "main.h" #include "string.h" //SWV test //2015-6-15 //by creep #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 needed */ }; FILE __stdout; FILE __stdin; volatile int32_t ITM_RxBuffer=ITM_RXBUFFER_EMPTY; int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; } return(ch); } int fgetc(FILE *f) { while(ITM_CheckChar() == 0) { } return ITM_ReceiveChar(); } u8 Write_buff[30] = "\n\r\n\rPlease enter your name:\n\r"; u8 read_buff[50]= ""; u8 name[100]="\n\rYour name is : "; int main(void) { static u8 led_sta = ON; LED_Init(); delay_init(); delay_ms(1000); while(1) { //将数据发送到Debug Viewer printf((const char*)Write_buff); memset(read_buff,0,50); //等待输入 scanf("%s",read_buff); //将姓名输出 printf((const char*)name); printf((const char*)read_buff); LED(led_sta); led_sta = !led_sta; delay_ms(1000); } } |
直接在debug viewer窗口输入内容然后回车即可,输入的内容不会回显在窗口中,输入也支持中文。运行结果如下:
http://www.stmcu.org/module/forum/thread-602205-1-1.html
转载请注明:徐自远的乱七八糟小站 » [STM32F3] 【STM32F303开发】+ 使用SWO输出调试信息到Debug Viewer窗口