cortex-m3的ITM功能:调试信息格式化输出(SWD调试时的SWO引脚输出调试信息,JTAGSWOViewer.exe接收数据)

2019-07-21 02:26发布

附件中是调试信息格式化输出的驱动文件

用户只需要先在cm3_fw_self_config.h中配置好调试组件的功能,再调用void cm3_debug_init(void)函数和void ITM_init(void)来初始化cm3的调试组件后,就可以使用void debug_printf(uint32_t port_n, uint8_t *p_string, ...)函数来将数据输出到ITM的任意激励端口(0~31)
debug_printf()函数和printf()函数的用法完全一样,仅是多出了uint32_t port_n这个选择端口的参数


用法:
1. 在cm3_fw_self_config.h中配置调试组件
2. 初始化cm3调试组件
    cm3_debug_init();   //初始化halt_debug和monitor_debug
    ITM_init();    //初始化ITM的格式化输出功能
3. 打开JLinkSWOViewer.exe 做如下修改
    
    
4. 格式化输出
    debug_printf(10,"ITM test : %d  %u  %c  %s ",13243,56745,'A',&string[0]);

附件中是源代码

说明: 这是我项目中的一个功能,可能与其他文件有部分关联,但稍作调整就能使用


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
kinkun
2019-07-21 11:07
回复【2楼】正点原子:
-------------------------
恩,类似,只是比串口好用,区别在于
串口是片上外设资源,若是换了MCU,则需要重写串口的驱动;ITM是cm3核内资源,所有使用了cm3的MCU都通用
串口至少需要2个pin(Tx,Rx),并只能输出数据到一个端口(Tx);ITM只需要一个端口(SWD调试模式时的SWO引脚)就可以向32个端口分别输出数据,相当于有了32个串口

JTAG-V8有2个调试协议:JTAG,SWD.这两个协议只是接口不同而已,到了cm3内核调试命令和数据的格式又调整成了一样.就像不论使用USB,SPI,CAN都可以传输同样的数据.
MDK本身就有接收ITM发出的数据的功能,只是只能接收端口0,所以不太好用; 在target options->debug->选择j-link/j-trace->点击setting->在debug栏中选择SW模式->在trace栏中勾选enable,auto detect max SWO clk,port_0,在core clock中填入你的目标系统的HCLK频率.就完成了设置.  在项目代码中重定向fputc()到ITM的port_0.  在调试模式时,在view->serial window->debug(printf)viewer中打即可使用

我们都使用JTAG-V8,是因为其功能相对强大,价格便宜.  其实还有JTRACE,只是太贵了(2000多?,我也买不起);JTAG只能实现停机调试,而JTRACE能够实现实时调试;cm3核只是部分实现了trace的功能, ITM,ETM都是trace的功能,我们仔细翻阅STM32F103XX的手册(100pin一下的没有trace功能引脚)就会发现有traceswo,traceck,trace0~3引脚只是我们的JTAG中内置的SWD调试协议只能支持traceswo功能,其余的要靠JTRACE.

这些内容都在cortex-m3的手册中,<<cortex-m3权威指南>>是中文版的,容易读懂. 我也只了解了这么多,还有好多其他的我也不懂,希望精通cm3核的高手遇到了,能够不吝赐教

一周热门 更多>