在STM32中使用SWO

3,840 阅读1分钟

最近发现SWO真是一个调试利器,特此记录:

这里补充说明一下KEIL MDK-ARM 推出了社区版,可以非商业情况下正常使用;

一,软件开发测试环境:

  • STM32CubeMX:6.4.0;
  • KEIL MDK-ARM:Community 5.37.0.0;
  • STM32CubeF4 Firmware Package:1.27.0;
  • STM32CubeProgrammer:2.10.0;

二,硬件开发平台:

  • STM32F4-Discovery(STM32F407VGT)

三,SWO的STM32CubeMX配置

  1. 在sys的debug中选Trace Asynchronous Sw

image.png 2. 选完后自动配置SWO到PB3

image.png

四,SWO的Keil中配置

1,启用Trace

image.png 2,勾选Micro LIB,这个是为了使用printf

image.png

五,添加重定向的函数(此方法来自网上,据网友说不够严谨和规范)

#include "stdio.h"
/*
-------------------------------------------------------------------------------
实现printf定向到SWO打印的功能,这个要勾选MicroLIB和引入stdio.h
-------------------------------------------------------------------------------
*/
int fputc(int Character,FILE *f)
{
	ITM_SendChar(Character);
	return Character;
}

六,SWO的使用以及其他相关调试方法

代码:

/*
*************************************************************
*	函 数 名:AppTaskStart
* 功能说明:启动任务
* 形    参:thread_input 是在创建该任务时传递的形参
* 返 回 值:无
* 优 先 级:2
 ************************************************************
*/
uint32_t uiCount = 0;
void AppTaskStart(ULONG thread_input)
{

	(void)thread_input;
	
	while(1)
	{
		uiCount++;
		HAL_GPIO_TogglePin(LD3_GPIO_Port,LD3_Pin);
		tx_thread_sleep(500);
		printf("uiCount: %d\n",uiCount);
//		ITM_SendChar('3');
	}
}

image.png

Trace:Data Overflow捕获了太多的跟踪数据,跟踪端口太忙导致跟踪数据丢失.好像不影响使用具体原因有待后续继续研究;

七,用STM32CubeProgramer来取代KEIL查看SWO,这个方法在实际量产中大有用处.

image.png

八,使用建议:据别人说printf仅在调试时使用,使用完后就取消,不要在量产产品中使用,可能会带来一些莫名其妙的问题(来自MicroLIB).网上也有不使用MicroLIB的方法