1. 程式人生 > 其它 >STM32開發之 VS Code + GDB下載除錯

STM32開發之 VS Code + GDB下載除錯

寫在前面:
本文章旨在總結備份、方便以後查詢,由於是個人總結,如有不對,歡迎指正;另外,內容大部分來自網路、書籍、和各類手冊,如若侵權請告知,馬上刪帖致歉。

在完成上一篇的 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.cfgtarget/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,連通了硬體偵錯程式和 GDB,通過 USB和硬體偵錯程式連線,並且通過 TCP和 GDB連線:


三、下載配置

當你能正確實現以上操作時,那麼,關閉終端顯示的視窗,使之退出搭建的 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/163771273device 是指定 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模式了: