目前JLINK的功能越來越強大,為了解放UART,在調試的時候友善printf列印所需要的資訊,下面說下SWO的使用方法以及步驟。
以STM32F103C8T6為例:SWO接口即為JLink的TDO接口。
實作下圖的功能
第一步:按照下圖設定
在Project裡會生成Compiler菜單
第二部:在設定選項裡操作如下選項
第三步:在代碼裡添加下列指令,進行printf的重定向。
#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA 0x01000000
struct __FILE { int handle; };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
if (DEMCR & TRCENA) {
while (ITM_Port32(0) == 0);
ITM_Port8(0) = ch;
}
return(ch);
}
與下圖一樣
第四步:在main函數裡,就可以直接printf列印了。
第五步:對程式進行編譯下載下傳,然後開始你debug的swo輸出之旅
在debuge調試框裡添加printf視窗
調試列印資訊如下所示
問題總結:
使用stm32cubemx生成的代碼debug不能正常運作
STM32F103出現CPU could not be halted問題的解決方案
解決辦法:
将HAL_MspInit()的__HAL_AFIO_REMAP_SWJ_DISABLE();注釋掉,換成
__HAL_AFIO_REMAP_SWJ_NOJTAG();