在单片机的开发过程中,打印信息是调试过程中非常重要的手段。通常打印信息是通过单片机的串口外设进行的。最近学到了一种通过SWD/JTAG调试接口来打印调试信息的方法,可以在串口资源紧张的时候减少一个调试串口资源占用。

本文基于Keil + STLink和原子的STM32学习板进行演示

首先我们基于原子开发板的串口教程实现printf 串口格式输出打印的方法,然后对fputc 这个函数实现做一些简单修改,代码工作就结束了。

int fputc(int ch, FILE *f)
{      
    ITM_SendChar(ch);   //SWO输出字符的方法
    while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
    return ch;
}

部分情况下需要在工程选项中选择Use MicroLib这个选项

ijpYbhXYshodiTmz8drw0fjmalrz0Bt6oiEnM3m4frw.png

确保代码正确编译,能够在串口获得打印信息后,再对调试器进行设置

4pZwak47ndT8OL60WCBQPvyJuEaU3MiZ1k5z_CrF5ZI.png

转到调试器的Trace 选项卡,依次设置核心时钟、追踪使能,并使能SWO时钟自动检测

再ITM端口中需要选择端口0,因为从STM32 的标准库实现中可以看到ITM_SendChar 使用的是端口0

0VkD_FB845QgEawRfQXnb_NQp8xFaEZCXutImPqYsQE.png

进入调试模式,然后在视图菜单中打开调试输出查看器即可

6VaNueBaicw4vQM5gE2S7Ey0hXTRFM05QpvdYWJK8q0.png

View => Trace => Debug (printf) Viewer

Bu0QsAwbzQFBCP8m0br2OdKbi7l8Got3zrBNj-9h5c8.png

参考文献

  1. STM32中重定向printf到SWO口[通俗易懂]
  2. printf系列教程03\_SWO打印输出配置,基于Keil『Debug(printf)Viewer』
  3. 如何在 Keil µVision 中通过 SWO 显示 printf 输出。