在SWO打印调试信息,由于过高的波特率,导致Keil MDK 的Debug (printf) Viewer中出现乱码或者接收不到。但是在jlink SWO中又能正常接收。
一、问题描述
HCLK频率为100Mhz。(SWO在不进行手动配置的情况下,保持和HCLK频率一致)
使用调试器:Jlink
硬件平台:STM32F411CE

二、问题分析
Keil 的 Debug Viewer在速率高时,会处理不过来。高速情况下,错误会累积,容易出现乱码。低速的话,Keil 的 Debug Viewer能够反应过来,错误会少一些。
而且由于我们手上的Jlink是盗版的,质量参差不齐,所以我们的SWO频率设置慢一些,和SWD下载波特率一样,按照下面的方式修改波特率。
三、解决办法
(1)降低SWO波特率
软件配置:
将Trace界面中的Autodetect取消,手动配置分频系数,他会自动算出时钟为2Mhz。如果没自动算出,看Core Clock配置是否与时钟树HCLK设置一致。

(2)使用待缓冲的串口接收软件,如Jlink SWO

四、番外
重定向fputc,勾选Microlib,实现对printf重定向。
这样,我们就能print打印工作日志。

// 重定向printf到ITM Port 0(放在SWO_ITM_Init后)
int fputc(int ch,FILE *f)
{
ITM_SendChar(ch);
return ch;
}

浙公网安备 33010602011771号