最近发现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配置
- 在sys的debug中选Trace Asynchronous Sw
2. 选完后自动配置SWO到PB3
四,SWO的Keil中配置
1,启用Trace
2,勾选Micro LIB,这个是为了使用printf
五,添加重定向的函数(此方法来自网上,据网友说不够严谨和规范)
#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');
}
}
Trace:Data Overflow捕获了太多的跟踪数据,跟踪端口太忙导致跟踪数据丢失.好像不影响使用具体原因有待后续继续研究;