天天看點

JLink的SWO調試設定方法

目前JLINK的功能越來越強大,為了解放UART,在調試的時候友善printf列印所需要的資訊,下面說下SWO的使用方法以及步驟。

以STM32F103C8T6為例:SWO接口即為JLink的TDO接口。

實作下圖的功能

JLink的SWO調試設定方法

第一步:按照下圖設定

JLink的SWO調試設定方法

在Project裡會生成Compiler菜單

JLink的SWO調試設定方法

第二部:在設定選項裡操作如下選項

JLink的SWO調試設定方法

第三步:在代碼裡添加下列指令,進行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);

}

與下圖一樣

JLink的SWO調試設定方法

第四步:在main函數裡,就可以直接printf列印了。

JLink的SWO調試設定方法

第五步:對程式進行編譯下載下傳,然後開始你debug的swo輸出之旅

在debuge調試框裡添加printf視窗

JLink的SWO調試設定方法

調試列印資訊如下所示

JLink的SWO調試設定方法

問題總結:

      使用stm32cubemx生成的代碼debug不能正常運作

      STM32F103出現CPU could not be halted問題的解決方案

JLink的SWO調試設定方法

解決辦法:

将HAL_MspInit()的__HAL_AFIO_REMAP_SWJ_DISABLE();注釋掉,換成

__HAL_AFIO_REMAP_SWJ_NOJTAG();

繼續閱讀