Ping
ITM,(英文:Instrumentation Trace Macrocell,指令跟踪宏单元),是一种针对MCU进行跟踪调试的新方法,与打断点(Breakpoint)不同,ITM方法不需要暂停程序运行,可以在程序全速运行的过程中实时输出变量的数值以便观察,即Trace功能。Cortex-M3,M4,M7内核的单片机都支持ITM(M0,M0+内核是不支持的),在代码调试过程中,它与Jlink或者ST-LINK等结合,可以实时跟踪MCU的运行状态,查看数据等。ITM只支持SWD接口,不支持JTAG接口,而且相比于一般的SWD调试接口需要SWDIO和SWCLK两根线,ITM则额外需要一个SWO端口。
以GR551x为例,GPIO2可以配置为SWO功能:
GPIO2连接到JLINK的SWO接口,以常用的JLINK仿真器为例,对应PIN13:
(1) 使能trace功能;
(2) 设置当前芯片系统时钟频率;
(3) 分频可以自动,但是要看clock频率有没有超过当前SWD的频率,否则就自己输一个分频;
(4) Port建议选0即可,全选也可以;
Debug模式下打开View -> Serial Windows -> Debug(printf) Viewer窗口,当CPU执行到ITM_SendChar指令的时候,就会把内容输出到窗口中。
以GR551x V2.0.2 SDK ble_app_template_freertos例程为例,修改步骤如下:
(1) 修改custom_config.h,使能日志打印并配置方法为ITM
// <o> Eanble APP log module
// <0=> DISABLE
// <1=> ENABLE
#ifndef APP_LOG_ENABLE
#define APP_LOG_ENABLE 1
#endif
// <o> APP log port type
// <0=> UART
// <1=> RTT
// <2=> ITM
#ifndef APP_LOG_PORT
#define APP_LOG_PORT 2
#endif
(2) 配置GPIO2 MUX SWO
io_init.pin = APP_IO_PIN_2;
io_init.mode = APP_IO_MODE_MUX;
io_init.pull = APP_IO_NOPULL;
io_init.mux = APP_IO_MUX_2;
app_io_init(APP_IO_TYPE_NORMAL, &io_init);
(3) 修改board_SK.c中的bsp_itm_send函数,增加如下一行代码,修复Trace功能被关闭的BUG;
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
void bsp_itm_send(uint8_t *p_data, uint16_t length)
{
for(uint16_t i = 0; i < length; i++)
{
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
ITM_SendChar(p_data[i]);
}
}
测试结果如下:
Ping
有任何疑问可在本帖下直接回复~
打开微信,使用“扫一扫”即可关注