附件中是调试信息格式化输出的驱动文件
用户只需要先在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]);
附件中是源代码
说明: 这是我项目中的一个功能,可能与其他文件有部分关联,但稍作调整就能使用
-------------------------
恩,类似,只是比串口好用,区别在于
串口是片上外设资源,若是换了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核的高手遇到了,能够不吝赐教
一周热门 更多>