用SWO代替串口实现printf打印功能,是个很高效的调试手段。
但在实际应用中遇到一个问题。
用法
参考以下文章:
SWO打印输出配置
https://blog.csdn.net/ybhuangfugui/article/details/94378265
使用SWO代替UART,实现Printf打印功能
问题现象
使用仿真器调试时,在运行过程中死机。
原因分析
1,停止运行,发现程序死在这里:
2,查阅STM32参考手册,找到ITM->PORT[0]的地址:
查看该外设地址的值,一直为0:
3,查看SystemViewer=>DBG,发现CR寄存器中的TRACE_IOEN为0.
4,手动勾选TRACE_IOEN后,0xE0000000开始的32个字的值都变成为0x00000001,即可跳出while循环,继续正常运行。
5,进一步分析,原因是没有选择Trace Enable:
解决措施
为了防止忘记选择Debgu->Setting->Trace->Trace Enable,导致运行中进入死循环,于是,在初始化时设置TRACE_IOEN为1.
在初始化时添加以下代码:
// 使能跟踪引脚分配
DBGMCU->CR |= DBGMCU_CR_TRACE_IOEN;
同时,使能激励端口:
// 使能激励端口1
ITM->TER = 0x0001;
ITM->TPR = 0x0001;