用SWO代替printf打印时的注意事项

用SWO代替串口实现printf打印功能,是个很高效的调试手段。

但在实际应用中遇到一个问题。

 

用法

参考以下文章:

SWO打印输出配置

https://blog.csdn.net/ybhuangfugui/article/details/94378265

 

使用SWO代替UART,实现Printf打印功能

https://www.cnblogs.com/wanban/p/11789160.html

 

 

问题现象

使用仿真器调试时,在运行过程中死机。

 

原因分析

1,停止运行,发现程序死在这里:

用SWO代替printf打印时的注意事项_第1张图片

 

2,查阅STM32参考手册,找到ITM->PORT[0]的地址:

查看该外设地址的值,一直为0:

用SWO代替printf打印时的注意事项_第2张图片

3,查看SystemViewer=>DBG,发现CR寄存器中的TRACE_IOEN为0.

用SWO代替printf打印时的注意事项_第3张图片

4,手动勾选TRACE_IOEN后,0xE0000000开始的32个字的值都变成为0x00000001,即可跳出while循环,继续正常运行。

用SWO代替printf打印时的注意事项_第4张图片

 

5,进一步分析,原因是没有选择Trace Enable:

用SWO代替printf打印时的注意事项_第5张图片

 

解决措施

为了防止忘记选择Debgu->Setting->Trace->Trace Enable,导致运行中进入死循环,于是,在初始化时设置TRACE_IOEN为1.

 

在初始化时添加以下代码:

	// 使能跟踪引脚分配
	DBGMCU->CR |= DBGMCU_CR_TRACE_IOEN;

同时,使能激励端口:

	// 使能激励端口1
	ITM->TER = 0x0001;
	ITM->TPR = 0x0001;

 

你可能感兴趣的:(嵌入式软件开发)