4.将Jtag设置为SW模式,并设置ITM的Port 0 获取信息。
STM32中重定向printf到SWO口
printf在命令行编程的时候是非常常用的,虽然是个老函数,但是功能强大,经久不衰
51等8位单片机由于RAM比较小,栈就比较小,跑printf比较吃力,
但是STM32这种32位单片机跑printf就很容易了,而作为一种调试手段,printf十分方便、直观。
比较常见的方法是把printf重定向到串口,不过这需要外接一个串口线,比较麻烦。
其实STM32自带的SWO口是能够异步输出数据的,而且不需要外接什么设备,
ST-LINK/J-Link等带SWO口的调试器都支持。
下面以STM32F4Discovery
开发板+GCC为例说明。
根据这里的方法,也可以把printf定位到其他外设。
PS:IAR在编译选项里自带了printf via SWO的功能,就不需要外加设置了。
首先来说说怎么把信息输出到SWO口,一句话搞定。
ITM_SendChar(ch);
这是在core_cm4.h(如果是F1系列的那就是core_cm3.h)中定义的内联函数。
不过不需要特意去include这个头文件,通过#include "stm32f4xx.h"就间接地将core_cm4.h包含进来。
不过说起来,ITM这个东西其实严格来说是Cortex-M提供的一个特性,而不是STM32。
利用这个函数把信息输出到SWO口之后再打开St-Link Utility,
在菜单里找到ST-LINK→Printf via SWO Viewer就会弹出一个窗口,
设置System Clock为单片机内核频率,点Start就能看到输出的信息了。
接下来就是把printf函数输出的字符串重定向过去了。
由于单片机的外设功能是根据需求变化的,编译器不可能确定printf需要用到的外设资源,
于是乎它就干脆留了个接口,也就是_write函数,
当然除了_write函数之外还有_read等其他函数,不过这里我们用不到。
其声明为 int _write(int fd, char* ptr, int len);
关于_write函数,说简单点,就是所有涉及到输出字符串的函数,
比如printf和putchar(),最终都会跑到_write函数,这里fd是文件标识符,说开来就比较复杂了,
这里我们用得到的就只有STDOUT_FILENO跟STDERR_FILENO,
其中前一个是标准输出的文件标识符的预定义变量,后一个是错误输出的文件标识符预定义变量。
第二个变量ptr是需要输出的字符串首地址,len就是输出长度。
当我们调用printf函数后,C运行库会把输入变量转换为最终需要输出的字符串,
然后调用_write函数,将结果输出。我们的工作就是实现一个_write函数。
新建一个_write.c文件,内容如下:
加了个#ifdef _DEBUG 的效果是未加 _DEBUG 定义的时候就忽略下面的东西,
因为这东西主要是用在调试阶段,RELEASE版本里面都用不到了,而且多少还是会影响速度。
其他东西就很简单了- -不需要多说明了吧。
直接编译能通过,但是链接会报错,提示无法找到_read之类的一堆函数。
在链接脚本的下面libgcc.a ( * )后面加上libnosys.a ( * ),就不会报错了。
具体原因涉及到Cortex-M3使用的newlib库的实现,就不具体展开了。
好吧好吧,其实我也不知道。
如果想把信息定位到串口,可以直接把ITM_SendChar改成相应的串口函数,
也可以利用DMA,先把数据拷贝到DMA缓冲区,让DMA自动传数据,提高响应速度。
STM32片内外设--DBG之Keil SWO输出
1) 加入stdio.h,这样你就可以调用printf函数了
2) 使能SWO输出
使能SWO输出。最简单的办法就是将如下的函数拷贝到你的工程里面,并且在mian函数初始化之后调用该函数
。
3) 配置Keil的工程选项
打开Keil的工程配置,选择Debug页面,选择
仿真器为Cortex-M/R J-Link/J-Trace, 并点击仿真器选项边上的setting选项,打开具体的设置窗口。
在打开的窗口中,切换到Trace页面,选中Enable,并且设置Core Clock为14MHz,分频选项为Core Clock/16。详情如下:
4) 在初始化SWO函数之后的地方,使用printf函数进行输出。例如printf("Hello world")。
5) 在你的工程里面,需要添加如下的函数:
6) 编译你的代码,并且进入Debug状态
7) 打开Keil的printf-view窗口, 通过 View -> Serial Windows -> Debug(printf) View
8) 点击运行之后,在Debug (printf) View里即可查看