OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 浅谈工程师的调试法宝(三)---SWO引脚的巧妙应用

共3条 1/1 1 跳转至

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

菜鸟
2017-08-24 08:01:00    评分

摘要

在上一篇文档中,我们向大家分享了如何使用IAR本身自带半主机(semihost)模式来调试程序,但是每10ms输出一个字符的速度实在让人难以接受。今天就向大家介绍一个输出速率更快的,使用同样方便的调试方法-SWO引脚的使用。

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

这次我们测试是基于飞思卡尔的FRDM-K64开发板,如图 1所示。

640.jpg

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

2.jpg

SWD接口


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


#include <stdio.h>


接下来为了能直接调用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.jpg

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

4.jpg

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

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

文章来自周立功单片机




关键词: ---SWO     巧妙     调试    

专家
2017-08-24 08:49:16    评分
2楼

谢谢楼主分享。


管理员
2017-08-25 08:05:08    评分
3楼

谢谢楼主


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]