转载 【教程】摆脱UART,仅用JLink也能实现printf功能!! /*更新scanf*/ (amoBBS 阿莫电子论坛) 需要使用SWO
【教程】摆脱UART,仅用JLink也能实现printf功能!! /*更新scanf*/ (amoBBS 阿莫电子论坛)
2014-03-11 戴维图书馆 阅 6345 转 34
![]() /**************写在前面**************/ 1、 该教程的原理由ARM官网得到,经过本人的进一步测试与细化,以确保更高的可靠性 2、 本方法已在STM32F103芯片上测试通过,仿真工具分别使用了JLink V8及JLink ARM-OB STM32,均可以正常使用。理论上该方法适用于所有Cortex-M内核的IC 3、 该方法仅限在Debug环境中使用,不能完全取代UART(例如需要与上位机进行通讯时),但在一般的调试过程中,肯定是够用的 4、 笔者水平有限,教程编写无法做到面面俱全,如有考虑不周的地方还望各位多多指点 /**************硬件连接*************/ 必须使用SW模式,并且必须连接SWO!很多精简版的JLink只保留了GND、SWC、SWD,若想使用此功能,必须将SWO(即JTAG模式下的TDO)管脚引出,管脚分布及对应的JTAG接口如下图: <ignore_js_op> ![]() 由此可见,若想实现Debug模式下的printf函数功能,JLink最少需要4根连接线,不过跟串口比起来,硬件开销明显更小! /**************代码编写*************/ //代码部分非常简单,分三步走! // 1、添加ITM寄存器定义
注:由于本人没有安装IAR环境,因此仅能提供MDK下的配置,相关的配置项我会尽量列举并讲解详细,以便大家在IAR中能够完成 1、 打开工程配置 <ignore_js_op> ![]() 2、 在Debug分栏下选择调试器为JLink,并打开Setting <ignore_js_op> ![]() 3、 在Port下拉栏中选择SW模式 <ignore_js_op> ![]() 4、 切换至Trace分栏,在CoreClock中输入当前芯片工作的主频(根据不同的IC,不同的配置,这里的数据会有所不同,需要注意),并在ITM Stimulus Ports中按照下图所示进行配置,以便让ITM Port0能够捕获信息: <ignore_js_op> ![]() 5、 进入Debug模式,并在菜单中依此选择View — Serial Windows – Debug(printf) Viewer,此时窗口右下角会出现相应的窗口 <ignore_js_op> ![]() 6、 运行程序,此时就会看到文中第一幅图片中那样打印出的信息了! 附上ARM网站的原文连接: http://www.keil.com/support/man/ ... race_itm_viewer.htm 2013.1.19 更新scanf功能,尚有缺陷,请大家帮助测试与完善 代码取自网络,经测试可以满足基本需求 目前缺陷缺陷: 1、输入的字符不会实时显示出来 2、第一次执行会默认输入一个‘0’ 代码:
<ignore_js_op> ![]() <ignore_js_op>
<ignore_js_op>
<ignore_js_op>STM32的官方手册中就有:
ITM是一应用驱动的跟踪源,它支持printf类的调试手段来跟踪操作系统(OS)和应用事件,并发布判定的系统信息。ITM以包的形式发布跟踪信息,它由以下部分组成: ● 软件跟踪:软件可以通过直接写ITM激发寄存器来发布包信息。 ● 硬件跟踪:ITM会发布由DWT产生的信息包。 ● 时间戳:时间戳被发布到相应的包上。ITM包含一个21位的计数器以产生时间戳。Cortex-M3的时钟或串行线观测器(Serial Wire Viewer)的位时钟率给计数器提供时钟。 由ITM发送的信息包输出到TPIU(Trace Port Interface Unit),TPIU再添加一些额外的包(参考TPIU),然后输出完整的包序列给调试器。 用户在设置或使用ITM之前,必需先使能异常调试和监视控制寄存器(Debug Exception and Monitor Control Register)的TRCEN位。 |