歡迎您光臨本站 註冊首頁

使用VSCode和VS2017編譯調試STM32程序的實現

←手機掃碼閱讀     kyec555 @ 2020-05-08 , reply:0

近兩年,微軟越來越擁抱開源支持跨平臺,win10搭載Linux子系統,開源VSCode作為跨平臺編輯器,VS2017官方支持了Linux和嵌入式開發功能。
ST也是,近兩年開發的軟件工具基本都是跨平臺(基於Java)的,比如STM32CubeMX,MCUFinder,STM32CubeProgrammer等。17年年底收購了truestudio的開發公司-Atollic。這個公司的IDE就是基於Eclipse使用GNU套裝的。
官方都支持了,那我們有必要了解一下。要是好用,說不定就可以淘汰老舊的Keil了。
必要軟件
VSCode或者VS2017。
GNU ARM Embedded Toolchain。JLink或者STLink。
STM32CubeMX。這個一般開發STM32的都會裝。
使用思路
編譯就不說了,有makefile,有gcc就可以了。
調試的話,整體的流程圖如下:
前端 。這裡VSCode和VS2017就是封裝了GDB的圖形前端,這樣我們使用GDB調試的時候就不需要再在命令行窗口敲指令了。
GDB Client。arm-none-eabi-gdb
GDB Server。JLink官方SEGGER提供了一個GDB server。STLink在github也有一個開源的項目。這裡演示使用JLink。如果不嫌麻煩的話,也可以使用openOCD。
調試器這裡使用JLink,接口使用SWD。
目標板芯片型號為STM32F103RCT6
VS2017
這裡使用VSCode舉例,但是VS2017實際上也是支持的,可以參考官方博客。這裡本人做了一下嘗試,發現官方還未完善。文檔有多處錯誤,所以暫不考慮。
VSCode基本配置
這個現代化的編輯器,好處就不多說了,對比keil誰用誰知道,網上也能搜到一堆的關於它的介紹。
必要插件
C/C++為必要插件,否則無法調試。
建議安裝插件
crustify。用來格式化代碼, shift+alt+f,非常方便。缺點是代碼中有Unicode可能會導致亂碼,然後配置文件有點多。
Bracket Pair Colorizer。不同顏色高亮顯示匹配括號,愛護視力必備。
C/C++ Clang Command Adapter。用來補全和診斷,需要同時安裝Clang,參考官方文檔。
JLink安裝
安裝完成後,目錄下應該有下列文件
GNU ARM Embedded Toolchain安裝
下載後,安裝或者解壓即可。目錄下有一個bin的文件夾,可以看到有下列文件:
安裝完成後,將bin文件夾路徑添加到環境變量。不過這不是必要的,只是方便在命令行中使用,在vscode中使用是不需要的。
使用cube生成代碼以及makefile
這裡需要注意,cube的版本至少要是4.23.0。否則沒有生成makefile的選項,這裡使用4.24.0。在配置完成後,設置選項需要選擇Makefile,如下圖:
點擊生成後文件目錄如下:
在main.c中添加兩行閃燈的代碼:
while (1) { HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); HAL_Delay(500); Counter++; /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }
至此,整個工程就搭建好了。
編譯
官方生成了makefile,那麼只要執行make就可以了。makefile的語法,網上可以找到很多的教程,這裡不細說。
就目前的工程,想要make成功,改一句話即可使用,即指定gcc的路徑。我的路徑如下:
BINPATH = D:/GNU_ARM_TOOLS/2016q3_Version_5_6/bin
修改後,打開命令行,輸入make即可。如果,提示make不是內部或者外部命令,那你還需要安裝GNU make,這個可自行搜索下載。
如果配置成功,應該能看到下面的畫面:
這樣,在build目錄下面可以找到 blink.hex,blink.elf,blink.bin 這幾個文件。至此,編譯成功。
其實,即使不使用cube生成Makefile,我們也可以自己寫一個,或者使用CMake。但是,使用官方的文件,會統一大家的程序結構,以後移植或者開源也更容易。
而且,官方的Makefile結構比較清晰,熟悉Keil工程配置的人,其實很容易接受。
下載
可以使用JFlash直接燒錄
如果沒什麼問題的話,復位之後,目標板的led應該已經開始閃爍了。
調試
這裡是重點。
1.運行GDB server
我這裡是在windows平臺下,JLink提供的GDB server有一個圖形客戶端。Linux平臺下使用命令行版本,也是一樣的。
打開JLinkGDBServer.exe,配置連接好後,應該看到下面的界面
這個server一直開著就行,注意上面的端口號2331,後面要用到。
2.測試GDB
由於VSCode的配置文件中使用了較多的GDB指令,這裡使用命令行先演示一下,方便理解,也剛好測試GDB是否正確安裝。
在命令行輸入 arm-none-eabi-gdb ,應該看到如下畫面,否則你的GNU套裝沒安裝好,或者沒添加到環境變量
繼續輸入下面的指令:
此時,應該也看到led燈在閃爍了。
簡單解釋這幾個指令,詳細的可以自行搜索gdb的教程,或者查看GNU套件安裝目錄下的文檔。
target remote :2331 :連接到GDB server。
:連接到GDB server。 file : 載入目標文件到gdb。
: 載入目標文件到gdb。 load : 下載文件到目標板。
: 下載文件到目標板。 c : 運行到下一個斷點,如果沒有斷點,會一直運行
: 運行到下一個斷點,如果沒有斷點,會一直運行 monitor reset : 傳遞命令reset給JLink GDB server。
monitor 後面的參數不是gdb的指令,而是gdb server的(這裡就是JLink Server的),這裡參考JLink的文檔(在安裝目錄下有),可以接受如下指令
常用的也就是reset了。
3.配置VSCode調試
在vscode的窗口按下F5,彈出來的窗口選擇gdb
官方給了默認配置,需要修改成我們自己的。這裡改動比較多,具體的配置參數需要參考兩個地方,一個是vscode的官網
,一個是cpp插件的github文檔
最終我們的配置如下:
{ // 使用 IntelliSense 瞭解相關屬性。 // 懸停以查看現有屬性的描述。 // 欲瞭解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "blink Launch", "type": "cppdbg", "request": "launch", "targetArchitecture": "arm",//雖然官方說棄用了,但實際上必須指明 "program": "blink", // 採用了自定義的設置,這裡沒啥用了 "args": [""], "stopAtEntry": true, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "D:/GNU_ARM_TOOLS/2016q3_Version_5_6/bin/arm-none-eabi-gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "launchCompleteCommand": "None", "miDebuggerServerAddress": "localhost:2331", "customLaunchSetupCommands": [ { "text": "target remote :2331", "description": "connect to server", "ignoreFailures": false }, { "text": "file F:/STM32/led/blink/build/blink.elf", "description": "load file to gdb", "ignoreFailures": false }, { "text": "load", "description": "download file to MCU", "ignoreFailures": false }, { "text": "monitor reset", "description": "reset MCU", "ignoreFailures": false }, { "text": "b main", "description": "set breakpoints at main", "ignoreFailures": false }, ] } ] }
再次按下F5後,效果如圖:
這個配置中,最重要的就是 customLaunchSetupCommands 中的設置,有了上面gdb再命令行的演示,就很容易理解了。
總結
這裡只是搭建了一個最簡單的功能,使用上確實比Keil繁瑣很多,而且有些實用功能沒有實現,比如說live watch,比如說查看寄存器內容。如果有人專門針對VScode或者VS2017開發一個插件,那麼最終的調試功能就和Keil一樣強大了。
加上VScode強大的編輯能力,那麼Keil除了ARMCC還可以讓人留戀一下,其他部分就都可以拋棄了。
提升
想要在實際工程中使用vscode + GNU的組合,還需要提升幾部分:
makefile。需要增加更多功能,比如下載,比如分開release和debug等,比如增量編譯等。
使用task。vscode的task功能是很強大的,不用浪費。
開發插件。如上所提,調試功能還是差keil不少。
在github上已經有了一個插件的開源項目,實現了類似keil的部分功能,名字叫做cortex-debug,不過功能還不夠完善,先關注著。


[kyec555 ] 使用VSCode和VS2017編譯調試STM32程序的實現已經有339次圍觀

http://coctec.com/docs/vscode/show-post-233301.html