使用VSCode編譯除錯IAR的stm32工程

相對於IAR和Keil上世紀水平的程式碼編輯器,巨硬出品的VSCode簡直就是太香了,可惜畢竟不是專門為嵌入式開發設計的,不一翻折騰也就只能噹噹程式碼編輯器用,要編譯除錯軟體還是得開啟IAR,每次寫stm32還得在兩個軟體直接來回切換,多少有點麻煩,於是這幾天花點時間好好研究了下VSCode的各種外掛,總算可以只依靠VSCode實現撰寫+編譯+除錯的一條龍服務了,我覺得有必要寫這篇文章整理一下,一方面是可能能為有相同需求的人提供點參考幫助,另一方面就是我這個人實在記性不怎麼樣,指不定哪天就要靠這篇文章來自己教自己了(笑~,這才是主要原因)。

筆者假設看到這篇文章的人已經在電腦上裝好了VSCode、IAR、STM32CubeMX、STLink驅動這些東西,並且有基本的使用經驗,如果沒有裝好,可以參考下別人的部落格先把他們裝好,並且查查基本用法,再回過頭來看這篇文章。

一、解決程式碼撰寫和編譯問題

首先需要解決的是怎麼在VSCode下愉快的寫程式並且把除錯用的目標檔案編譯出來。這個還是比較簡單的。

首先給VSCode安裝兩個外掛:

  • C/C++,這個外掛主要提供對C/C++語言的自動補全、函式跳轉、動態語法檢查等功能,一般使用VSCode寫C/C++程式碼的開發者都會裝它。
  • IAR For Visual Studio Code,這個外掛用於解決編譯問題,它會根據IAR工程內的設定檔來自動生成VSCode的相關設定檔,同時還可以在VSCode內呼叫IAR的編譯工具來編譯開啟的工程。

接下來這些步驟,是每次使用VSCode開啟新工程時需要做的,只需要在第一次開啟新工程時配置就好了。直接在使用STM32CubeMX生成的IAR工程資料夾右鍵使用VSCode開啟。

第一次開啟工程時, IAR For Visual Studio Code 外掛會自動掃描工程內的IAR設定檔,並自動在.vscode目錄內生成c_cpp_properties.json以及iar-vsc.json這兩個設定檔,前者主要是定義了各種IAR特有的巨集以及工程的標頭檔包含目錄,使得C/C++外掛的程式碼補全、函式跳轉等功能可以正常工作;後者主要配置了IAR編譯工具鏈所在的目錄以及工程的ewp設定檔所在目錄,保證編譯工作的正常進行。如下圖所示:


一般來說是不會出問題的,謹慎點的話可以檢查下iar-vsc.json下的對應各個目錄是不是正確。

按Ctrl+Shift+P快速鍵調出命令視窗,配置下生成任務,如下圖所示:



此時會在.vscode目錄下生成tasks.json,裡面是編譯相關的配置,如下圖所示:


一般來說,這之後直接按Ctrl+Shift+B快速鍵就可以編譯當前工程了,如果沒有報錯的話,此時工程就已經編譯好了,編譯結果如下所示:


此時在工程的編譯結果目錄下(STM32CubeMX生成的工程為 工程目錄EWARM工程名Exe)就可以找到生成的.hex與.out檔案了,前者可以直接序列埠燒錄到stm32,後者在之後的除錯會用到。

如果不幸編譯失敗了(一般不會),一般是由於機碼訊息或者系統環境變數PATH有問題,導致找不到IAR編譯工具鏈的位置,此時可以手動配置下,按照如下圖配置 iar-vsc.json檔案 :


對於只是想要使用VSCode編輯程式碼以及編譯,並不需要線上除錯的人來說,到這就可以了,如果希望使用STLink或者Jlink進行除錯,請繼續往下看。

二、解決線上除錯問題(STLink)

一般在VSCode下,是透過GCC工具鏈的GDB除錯器配合對應的GDB Server來進行程式碼除錯。我們可以簡單理解為GDB Server負責透過除錯器驅動跟底層做硬體除錯的除錯器打交道,然後VSCode再透過GDB跟GDB Server打交道,所以解決線上除錯問題要分兩步走:首先要解決GDB,之後解決GDB Server。

1、安裝GDB

首先是安裝GNU Arm Embedded Toolchain這套開源的ARM平台編譯工具鏈,當然,這裡不用它編譯工程,只是為了使用其中的GDB來進行除錯。點選我跳轉到下載地址

下載好安裝包後一路下一步,不過最後記得勾選上更新PATH,因為VSCode的 IAR For Visual Studio Code 外掛要靠這個環境變數來識別GDB所在的位置。下載和安裝參考下圖:




2、安裝GDB Server

我們需要找個東西來提供GDB Server,它將會接收GDB下發的指令,然後負責實際操作STLink進行硬體除錯。在進行其後的操作前,請先確保你已經安裝好了STLink的USB驅動以及STM32 ST-LINK Utility,這些安裝流程都很簡單,這裡不贅述,自行搜尋參考官方的檔案或者其他部落格。插好你的STLink,連接好硬體,然後繼續。

STLink有一個很麻煩的地方,其沒有提供官方的GDBServer程式,然後網上比較多人用的是OpenOCD,可惜這個玩意兒,筆者從來沒有成功用它連接上板子過,這裡有一個可以用,但不是很好的方法,如果你的STLink韌體版本在V2.J31.M21以上,可以使用這個方法。

我們需要從一個叫做TrueSTUDIO的IDE內選取出它的STLink GDB Server來用作除錯伺服器,檔案筆者已經選取好了,這裡給出百度網盤的下載連結:

連結:https://pan.baidu.com/s/1kaNeLoPYJc0CEsKli2qx2A
選取碼:nl5q

將下載好的壓縮包解壓到你想放的地方,之後確定自己硬體連接沒問題後,進入其中的ST-LINK_gdbserver資料夾,執行其中的ST-LINK_gdbserver.bat批處理檔案來啟動GDB Server,以後每次除錯前,都需要先啟動這個檔案方可。這時你可能會遇到三種情況:

  • 情況1:檢測不到STLink,這是需要檢查STLink到電腦,以及要除錯的硬體到STLink的連接是否正確,當然也可能是當前硬體的除錯引腳被配置為了其他模式導致,這個只能序列埠燒錄一個啟用了SWD除錯連接埠的hex韌體,然後再試、提示如下圖:

  • 情況2:STLink版本太低,這時可以嘗試去升級STLink韌體版本到V2.J31.M21以上再試 ,在同一目錄下提供了升級軟體ST-LinkUpgrade.exe,可以嘗試使用它升級試試,提示如下圖所示:

情況3:一切正常,這正是我們需要的,提示會如下圖,有些關鍵的引數已經在圖中標記:


成功搞定伺服器後,我們還需要配置一個工程中的除錯設定檔,在工程的.vscode資料夾下新建一個名為launch.json的檔案,然後複製下面內容填入,之後。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

{

"version": "0.2.0",

"configurations": [

{

"name": "\提示:這裡填自己喜歡的名字",

"type": "cppdbg",

"request": "launch",

"targetArchitecture": "arm",

"program": "\提示:填編譯生成的.out檔案的絕對路徑",

"stopAtEntry": false,

"cwd": "${workspaceFolder}",

"environment": [],

"externalConsole": true,

"MIMode": "gdb",

"miDebuggerPath": "\提示:填gdb工具的絕對路徑",

"setupCommands": [

{

"text": "file \提示:填編譯生成的.out檔案的絕對路徑"

},

{

"text": "target remote localhost:\提示:填GDBServer的監聽埠號"

},

{

"text": "monitor reset"

},

{

"text": "load"

}

]

}

]

}

以下給出筆者自己配置的範例,可以作為參照:


這時就可以開始除錯了,每次除錯前,連接好JLink與目標裝置,先 Ctrl+Shift+B編譯一下工程,之後在除錯介面選擇自己的除錯設定檔執行就可以進行除錯了。程式會在執行後自動停留在main函式的入口處。啟動流程如下圖所示:


這裡可能是有個bug,停留後會報異常,不過不影響正常使用。


如果你手頭有JLink,筆者強烈建議參照第三章使用JLink進行除錯,STLink在VSCode下使用起來還是沒有具有官方GDB Server支援的JLink用起來舒心的。

三、解決線上除錯問題(JLink)

如果手頭有JLink,那VSCode下的除錯將會比STLink愉快輕鬆太多,因為JLink的官方工具自帶GDBServer。在這裡,筆者使用的是基於STLink V2.1刷成的JLink-OB。其他JLink的使用方法應該是一致的,在開始往下之前,請先確保已經安裝好了JLink的相關驅動與工具( J-Link Software and Documentation pack for Windows )安裝地址點我。安裝過程很簡單,這裡不贅述。連接好除錯硬體繼續往下。

首先同樣需要參考第二章的第1節來安裝GDB,之後開始配置JLink GDB Server,JLink的官方套件自帶兩個GDB Server工具,JLinkGDBServer.exe以及JLinkGDBServerCL.exe,後者是前者的命令列工具,我們這裡主要使用後者。

按下圖所示在.vscode目錄下生成並配置VSCode的除錯設定檔launch.json




如果配置過程中沒有.out檔案,直接Ctrl+Shift+B編譯一下就能生成了。

解決完設定檔後,開啟左上角選單:檔案->首選項->配置,檢查以下IAR外掛的配置引數是否正確,一般保持預設即可,需要注意,裝置名稱可能需要手動修改。這個裝置名稱應該設定成與IAR工程選項下的target名稱一樣。


這時就可以開始除錯了,每次除錯前,連接好JLink與目標裝置,先 Ctrl+Shift+B編譯一下工程,之後在除錯介面選擇自己的除錯設定檔執行就可以進行除錯了。程式會在執行後自動停留在main函式的入口處。第一次執行可能會跳出JLink的確認訊息,勾選不再跳出並確認即可。




如果啟動除錯時報錯找不到.out檔案,請檢查 launch.json 內的.out檔案目錄配置或者嘗試重新編譯工程以生成.out檔案。找不到.out檔案一般的報錯訊息如下:


四、一些缺陷

目前這套方法,在涉及到工程檔案的新增與刪除,或者修改IAR工程的一些編譯配置時(例如編譯調校等級、包含目錄等),還是需要開啟IAR進行配置,如果對IAR的工程設定檔.ewp檔案比較熟悉,也可以直接透過修改檔案的方式在VSCode中進行(這是筆者當前的方法)。不過以上操作畢竟不用頻繁進行,所以這套方法目前還是比較實用的。