一个好用的技能|没有串口,如何输出打印调试信息?

💡 原文中文,约8600字,阅读约需21分钟。
📝

内容提要

本文介绍了在嵌入式开发中常用的日志输出方法。首先是将日志输出到SRAM中,然后通过仿真器查看。其次是通过SWO输出日志,避免被覆盖。然后是通过串口输出日志,使用DMA搬运数据以减轻对系统的影响。最后是使用IO模拟串口输出日志。这些方法都可以帮助开发者在调试过程中更好地定位问题。

🔎

延伸解读

调试日志输出方法的选择依据

文章针对嵌入式开发中无串口或串口被占用等场景,提供了多种日志输出方案。选择时需权衡实时性、对系统的影响以及可用硬件资源。例如,SRAM缓冲适合临时调试但可能覆盖;SWO适合大数据量且不占用串口;串口+DMA适合长期使用且影响小;IO模拟串口则作为备用方案。开发者应根据具体调试需求和硬件条件灵活选用。

SRAM日志缓冲的局限与应对

将日志输出到SRAM的环形缓冲区,可以在不占用串口的情况下通过仿真器查看。但缓冲区大小有限(如1kB),若日志产生速度快于读取速度,旧日志会被覆盖。因此,这种方法更适合短时间、小数据量的调试,或配合断点使用。对于数据量大的情况,文章建议改用SWO输出以避免覆盖。

SWO与串口DMA的适用场景对比

SWO通过ITM输出日志,不占用串口,且不易丢失,适合数据量大的调试,但需要仿真器支持。串口输出则更适合长期运行,但直接输出可能影响时序。使用DMA搬运日志数据到串口,能减少CPU干预,平衡实时性与系统影响,是实际开发中最常用的方式。两者可根据是否需要连接仿真器及对实时性的要求来选择。

IO模拟串口的注意事项

当串口不可用时,可用普通IO模拟UART协议输出日志。实现时需用定时器产生精确延时,并确保在输出一个字节期间关闭中断,否则波形会因中断打断而乱码。这种方法会占用一个定时器和IO,且输出期间CPU被占用,因此仅建议作为临时调试手段,不适合高频或长期使用。

❓

Q&A

嵌入式开发中,没有串口时如何输出调试信息?

可以将日志输出到SRAM中,通过仿真器查看;或者使用SWO输出日志;也可以使用IO模拟串口输出日志。

如何将日志输出到SRAM并查看?

定义一个环形缓冲区结构体,分配一段SRAM作为log buffer,重定向fputc函数,将日志写入缓冲区,然后通过仿真器查看内存中的日志。

SWO输出日志有什么优势?

SWO输出日志可以避免日志被覆盖,适合数据量大的情况,并且可以通过IDE或STM32 ST-LINK Utility查看。

串口输出日志时如何减少对系统的影响?

可以使用DMA搬运日志数据到串口输出,这样CPU可以同时处理其他任务,减少对系统运行的影响。

没有串口或串口被占用时,如何用IO模拟串口输出日志?

找一个空闲的普通IO,使用定时器产生精确延时,模拟UART协议输出波形,注意输出前要关闭中断以避免乱码。

这些日志输出方法分别适用于什么场景?

SRAM输出适合临时调试;SWO适合数据量大且不想被覆盖;串口输出适合长期使用,结合DMA可减少影响;IO模拟串口适合无串口或串口被占用的情况。

🏷️

标签

➡️

继续阅读