STM32開發之 VS Code + gcc環境編譯
寫在前面:
本文章旨在總結備份、方便以後查詢,由於是個人總結,如有不對,歡迎指正;另外,內容大部分來自網路、書籍、和各類手冊,如若侵權請告知,馬上刪帖致歉。
在完成上一篇的 STM32開發之 VS Code + gcc環境編譯後,那麼就可以根據以下的環境搭建實現下載及線上除錯了。
目錄
一、軟體下載
OpenOCD:https://gnutoolchains.com/arm-eabi/openocd/
一個開源的片上偵錯程式(Open On-Chip Debugger)。在其他平臺上,OpenOCD是要自己 Configure並且自己編譯的,但是 Windows平臺上提供了編譯好的二進位制檔案,所以只需要下載下來後隨便解壓出來就好了。安裝完成後新增系統環境變數,可以利用 cmd命令:openocd -v測試。
二、搭建除錯連結
在這裡需要說明的是,OpenOCD資料夾下的 share/openocd/scripts
裡面放的就是 openocd在執行時所需要用到的各種配置檔案,其中 interface資料夾下放的是關於偵錯程式的配置檔案,而 target資料夾放的是目標平臺的配置檔案,這裡我們需要的是 interface/stlink.cfg
和 target/stm32l1.cfg
,不過不需要複製出來。注:stm32l1.cfg是要選擇你的目標晶片對應的檔案,可以進入 …\OpenOCD-20200729-0.10.0\share\openocd\scripts\target路徑下查詢。
連線好 STLink和板子,如果板子的除錯介面正常的話;然後在終端控制檯裡鍵入命令:openocd -f interface/stlink.cfg -f target/stm32l1.cfg
三、下載配置
當你能正確實現以上操作時,那麼,關閉終端顯示的視窗,使之退出搭建的 GDB Server連結;然後回到 tasks.json檔案裡,在原本的 “tasks” 任務標籤裡再追加以下內容:
{ "dependsOn":"Build", // 任務依賴 "label": "Build and Download", "type": "shell", "command": "openocd", "args": [ "-f", "interface/stlink.cfg", "-f", "target/stm32l1.cfg", "-c", "program ./build/${workspaceFolderBasename}.elf verify reset exit" ], "problemMatcher": [] }
最後變成:
這個任務要求先進行 Build任務,然後通過命令開啟 openocd,載入兩個配置檔案(-f interface/stlink.cfg
和 -f target/stm32l1.cfg
),同時,這個 -c
的選項後面跟著的就是openocd成功載入後執行的內建命令,這裡我們讓它下載、驗證、reset,然後直接退出,這樣就實現了一條龍式的下載。執行這個任務的方法就跟 Build一樣,在此就不過多介紹了,最後執行該任務你會發現,這小破板跑起來。
這裡其實是經過了進入除錯處理的操作,只不過我們讓它自動退出了除錯模式而已;因為下載和除錯的區別是,下載只是把程式碼載入到晶片裡,而不進行除錯,也不會切換到除錯頁面,其實除錯就已經會將程式碼下載到板子上了,所以這裡所設定的下載,其實並不是單純的下載,而是經過了進入除錯,退出除錯這樣的操作,使我們人為的覺得是下載操作。
四、除錯配置
在窗口裡點選 執行 -> 新增配置:
接著,如果根據上一篇安裝了 Cortex Debug外掛,就會出現如下選項(ps:如果視窗開啟的是 .c檔案或者 .h檔案,只會顯示前面兩個選項,不知道是我電腦問題還是咋的,可以試著切換開啟到 .json檔案或者開啟 makefile檔案):
點選框選的選項,在 .vscode檔案裡會建立一個 launch.json檔案,然後把裡面的內容修改成以下樣子:
{
// 使用 IntelliSense 瞭解相關屬性。
// 懸停以檢視現有屬性的描述。
// 欲瞭解更多資訊,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceRoot}", // 輸出路徑
"executable": "./build/${workspaceRootFolderName}.elf", // 要除錯的程式
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd", // 偵錯程式選擇
"device": "STM32L151CB", // 使用J-link GDB Server時必須;其他GBD Server時可選(有可能幫助自動選擇 SVD檔案)。支援的裝置見 https://www.segger.com/downloads/supported-devices.php
//"svdFile": "./STM32L15xC.svd", // svd檔案,有這個檔案才能檢視暫存器的值,每個微控制器都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下載
"interface": "swd",
"configFiles": [
//"${workspaceRoot}/openocd.cfg", // *可以通過載入該檔案來配置
"interface/stlink.cfg",
"target/stm32l1.cfg"
],
"runToMain": false,
"preLaunchTask": "Build", // 在除錯前預先執行的任務,此處是tasks.json中的
//"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin" // 如果沒有把 arm工具鏈路徑新增到系統環境變數,則需要這條指令新增你的路徑
}
]
}
這裡主要就是指定 preLaunchTask
,顧名思義就是先執行某個任務後再啟動除錯,我們這裡要先執行前面配置的 Build
任務,意為先編譯再進行除錯操作;servertype
偵錯程式這裡,我們就使用 openocd
就好了,因為它支援各種不同的偵錯程式,若是僅使用Jink,不用其他的偵錯程式,那麼,你可以改成 jlink,然後參考:https://zhuanlan.zhihu.com/p/163771273;device
是指定 STM32的晶片型號,如果支援,則可以幫助偵錯程式顯示外設暫存器的值;configFiles
就是前面說到需要載入的那兩個配置檔案了(類似於鍵入命令:openocd –f interface/jlink.cfg –f target/stm32f4.cfg
);runToMain
就是選擇程式是從 main函式開始載入,還是從彙編程式碼開始載入,stm32啟動都是從 startup_stm32xxx.s開始的,所以這裡得選擇 false
。
然後在這裡說一下,在configFiles
中,註釋了一行,在正常情況下,如果我們不帶引數啟動(即所謂的單純鍵入命令:openocd
),openocd就會預設自動查詢當前目錄下有沒有名為 openocd.cfg的檔案,並把它作為配置檔案來啟動。若是你想在利用 openocd.cfg來載入配置,那麼就要在工程路徑下(對應你在 configFiles
所填的路徑檔案)建立一個 openocd.cfg檔案,並新增以下內容:
# 選擇偵錯程式為JLink or CMSIS-DAP or STlink
#source [find interface/jlink.cfg]
#source [find interface/cmsis-dap.cfg]
source [find interface/stlink.cfg]
# 選擇介面為SWD,jlink下開啟
#transport select swd
# 選擇目標晶片
source [find target/stm32l1.cfg]
實際上並不推薦這種方式,因為又要建立,又把 launch.json的配置分開了,當整體移植 .vscode資料夾並更換目標晶片時容易出現漏改引數。
五、DEBUG除錯
在配置完成以上的 launch.json除錯引數後,點選視窗 執行 -> 啟動除錯(或者直接按 f5),就可以進入 debug模式了: