浅谈工程师的调试法宝(三)---SWO引脚的巧妙应用

来源:互联网 发布:mac nice to meet you 编辑:程序博客网 时间:2024/05/16 01:35

在Cortex-M3\M4系列MCU中,内核的调试组件都有一个仪器化跟踪单元(ITM)。ITM的一个主要的用途,就是支持调试信息的输出(例如,printf格式输出)。ITM包含了32个刺激端口,允许不同的软件把数据输出到不同的端口,从而让调试主机可以把它们的信息分离开。每个端口都可以独立的使能/除能,还可以允许或禁止用户进程对它执行写操作。那么这些与MCU的SWO引脚有什么关系呢?刚才我们有说ITM包含了32个端口,其中SWO引脚,就是ITM模块的端口0,我们可以直接用它来输出一些调试信息。那么现在就看看如何使用它吧。


这次我们测试是基于飞思卡尔的FRDM-K64开发板,如图 1所示。关于飞思卡尔系列更多的开发板资料请访问http://www.zlgmcu.com/Freescale/。

图 1 K64开发板


把MCU的SWO引脚同J-link等调试工具连接在一起,因为K64开发板已经直接引出SWD接口了,所以我们就直接连接了J-Link。如图 2所示,第6脚就是SWO引脚。


图 2 SWD接口


当MCU连接好J-link之后,我们在工程中的主函数起始处添加stdio.h文件,如下所示。


#include


接下来为了能直接调用printf函数格式化输出,又需要用到我们之前提到的重定向技术了,只是这次不是重定向到串口,而是ITM模块的0通道,即SWO引脚。如程序清单 1所示。


程序清单 1 重定向代码

int fputc(int ch, FILE *f) {

ITM_SendChar(ch);

return(ch);

}


其中ITM_SengChar函数是core_cm4.h内核文件里定义的内联函数,我们可以直接调用。

完成重定向之后,我们写了个定时打印HelloWorld的程序。打开Keil工程的【Options for Target】->【debug】->【settings】->【Trace】,对Trace选项卡进行如图 3所示的配置。


图 3 Trace选项卡配置


点击确定之后,进入调试模式,打开【View】->【Serial Windows】->【Debug(printf) Viewer】,这时我们就可以看到MCU通过J-link向编译器输出的打印信息了,如图 4所示。打印速度还很快哦。


图 4 Debug Viewer窗口


到此我们算是学会了使用SWO引脚来调试输出了,是不是很酷哦。细心的网友可能会发现为什么Cortex-M0\M0+内核的MCU没有找到SWO引脚呢?这是因为它们采用的还是ARM-V6的老架构,内核的调试组件没有ITM模块。


又是一个遗憾,本来以为找到了最合适的调试方法,却对MCU的内核有限制。那么有没有一种调试方同时具有SWO的优点,并同时能在Cortex系列内核的MCU中使用呢?当然这些是难不住调试经验非常丰富的ZLG工程师的,敬请大家关注下一篇文档《浅谈工程师的调试法宝(4)之RTT的使用》。


原文出处:http://maker.zlgmcu.com/portal.php?mod=view&aid=1879


原创粉丝点击