使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn)
近兩年,微軟越來(lái)越擁抱開(kāi)源支持跨平臺(tái),win10搭載Linux子系統(tǒng),開(kāi)源VSCode作為跨平臺(tái)編輯器,VS2017官方支持了Linux和嵌入式開(kāi)發(fā)功能。
ST也是,近兩年開(kāi)發(fā)的軟件工具基本都是跨平臺(tái)(基于Java)的,比如STM32CubeMX,MCUFinder,STM32CubeProgrammer等。17年年底收購(gòu)了truestudio的開(kāi)發(fā)公司-Atollic。這個(gè)公司的IDE就是基于Eclipse使用GNU套裝的。
官方都支持了,那我們有必要了解一下。要是好用,說(shuō)不定就可以淘汰老舊的Keil了。
必要軟件
VSCode或者VS2017。
GNU ARM Embedded Toolchain。JLink或者STLink。
STM32CubeMX。這個(gè)一般開(kāi)發(fā)STM32的都會(huì)裝。
使用思路
編譯就不說(shuō)了,有makefile,有g(shù)cc就可以了。
調(diào)試的話,整體的流程圖如下:

- 前端 。這里VSCode和VS2017就是封裝了GDB的圖形前端,這樣我們使用GDB調(diào)試的時(shí)候就不需要再在命令行窗口敲指令了。
- GDB Client。arm-none-eabi-gdb
- GDB Server。JLink官方SEGGER提供了一個(gè)GDB server。STLink在github也有一個(gè)開(kāi)源的項(xiàng)目。這里演示使用JLink。如果不嫌麻煩的話,也可以使用openOCD。
- 調(diào)試器這里使用JLink,接口使用SWD。
- 目標(biāo)板芯片型號(hào)為STM32F103RCT6
VS2017
這里使用VSCode舉例,但是VS2017實(shí)際上也是支持的,可以參考官方博客。這里本人做了一下嘗試,發(fā)現(xiàn)官方還未完善。文檔有多處錯(cuò)誤,所以暫不考慮。

VSCode基本配置
這個(gè)現(xiàn)代化的編輯器,好處就不多說(shuō)了,對(duì)比keil誰(shuí)用誰(shuí)知道,網(wǎng)上也能搜到一堆的關(guān)于它的介紹。
必要插件
C/C++為必要插件,否則無(wú)法調(diào)試。
建議安裝插件
- crustify。用來(lái)格式化代碼, shift+alt+f,非常方便。缺點(diǎn)是代碼中有Unicode可能會(huì)導(dǎo)致亂碼,然后配置文件有點(diǎn)多。
- Bracket Pair Colorizer。不同顏色高亮顯示匹配括號(hào),愛(ài)護(hù)視力必備。
- C/C++ Clang Command Adapter。用來(lái)補(bǔ)全和診斷,需要同時(shí)安裝Clang,參考官方文檔。
JLink安裝
安裝完成后,目錄下應(yīng)該有下列文件

GNU ARM Embedded Toolchain安裝
下載后,安裝或者解壓即可。目錄下有一個(gè)bin的文件夾,可以看到有下列文件:

安裝完成后,將bin文件夾路徑添加到環(huán)境變量。不過(guò)這不是必要的,只是方便在命令行中使用,在vscode中使用是不需要的。
使用cube生成代碼以及makefile
這里需要注意,cube的版本至少要是4.23.0。否則沒(méi)有生成makefile的選項(xiàng),這里使用4.24.0。在配置完成后,設(shè)置選項(xiàng)需要選擇Makefile,如下圖:

點(diǎn)擊生成后文件目錄如下:


在main.c中添加兩行閃燈的代碼:
while (1)
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
HAL_Delay(500);
Counter++;
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
至此,整個(gè)工程就搭建好了。
編譯
官方生成了makefile,那么只要執(zhí)行make就可以了。makefile的語(yǔ)法,網(wǎng)上可以找到很多的教程,這里不細(xì)說(shuō)。
就目前的工程,想要make成功,改一句話即可使用,即指定gcc的路徑。我的路徑如下:
BINPATH = D:/GNU_ARM_TOOLS/2016q3_Version_5_6/bin
修改后,打開(kāi)命令行,輸入make即可。如果,提示make不是內(nèi)部或者外部命令,那你還需要安裝GNU make,這個(gè)可自行搜索下載。
如果配置成功,應(yīng)該能看到下面的畫(huà)面:

這樣,在build目錄下面可以找到blink.hex,blink.elf,blink.bin這幾個(gè)文件。至此,編譯成功。
其實(shí),即使不使用cube生成Makefile,我們也可以自己寫(xiě)一個(gè),或者使用CMake。但是,使用官方的文件,會(huì)統(tǒng)一大家的程序結(jié)構(gòu),以后移植或者開(kāi)源也更容易。
而且,官方的Makefile結(jié)構(gòu)比較清晰,熟悉Keil工程配置的人,其實(shí)很容易接受。
下載
可以使用JFlash直接燒錄

如果沒(méi)什么問(wèn)題的話,復(fù)位之后,目標(biāo)板的led應(yīng)該已經(jīng)開(kāi)始閃爍了。
調(diào)試
這里是重點(diǎn)。
1.運(yùn)行GDB server
我這里是在windows平臺(tái)下,JLink提供的GDB server有一個(gè)圖形客戶(hù)端。Linux平臺(tái)下使用命令行版本,也是一樣的。
打開(kāi)JLinkGDBServer.exe,配置連接好后,應(yīng)該看到下面的界面

這個(gè)server一直開(kāi)著就行,注意上面的端口號(hào)2331,后面要用到。
2.測(cè)試GDB
由于VSCode的配置文件中使用了較多的GDB指令,這里使用命令行先演示一下,方便理解,也剛好測(cè)試GDB是否正確安裝。
在命令行輸入arm-none-eabi-gdb,應(yīng)該看到如下畫(huà)面,否則你的GNU套裝沒(méi)安裝好,或者沒(méi)添加到環(huán)境變量

繼續(xù)輸入下面的指令:

此時(shí),應(yīng)該也看到led燈在閃爍了。
簡(jiǎn)單解釋這幾個(gè)指令,詳細(xì)的可以自行搜索gdb的教程,或者查看GNU套件安裝目錄下的文檔。
target remote :2331:連接到GDB server。file: 載入目標(biāo)文件到gdb。load: 下載文件到目標(biāo)板。c: 運(yùn)行到下一個(gè)斷點(diǎn),如果沒(méi)有斷點(diǎn),會(huì)一直運(yùn)行monitor reset: 傳遞命令reset給JLink GDB server。
monitor 后面的參數(shù)不是gdb的指令,而是gdb server的(這里就是JLink Server的),這里參考JLink的文檔(在安裝目錄下有),可以接受如下指令

常用的也就是reset了。
3.配置VSCode調(diào)試
在vscode的窗口按下F5,彈出來(lái)的窗口選擇gdb

官方給了默認(rèn)配置,需要修改成我們自己的。這里改動(dòng)比較多,具體的配置參數(shù)需要參考兩個(gè)地方,一個(gè)是vscode的官網(wǎng)
,一個(gè)是cpp插件的github文檔
最終我們的配置如下:
{
// 使用 IntelliSense 了解相關(guān)屬性。
// 懸停以查看現(xiàn)有屬性的描述。
// 欲了解更多信息,請(qǐng)?jiān)L問(wèn): https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "blink Launch",
"type": "cppdbg",
"request": "launch",
"targetArchitecture": "arm",//雖然官方說(shuō)棄用了,但實(shí)際上必須指明
"program": "blink", // 采用了自定義的設(shè)置,這里沒(méi)啥用了
"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后,效果如圖:

這個(gè)配置中,最重要的就是customLaunchSetupCommands中的設(shè)置,有了上面gdb再命令行的演示,就很容易理解了。
總結(jié)
這里只是搭建了一個(gè)最簡(jiǎn)單的功能,使用上確實(shí)比Keil繁瑣很多,而且有些實(shí)用功能沒(méi)有實(shí)現(xiàn),比如說(shuō)live watch,比如說(shuō)查看寄存器內(nèi)容。如果有人專(zhuān)門(mén)針對(duì)VScode或者VS2017開(kāi)發(fā)一個(gè)插件,那么最終的調(diào)試功能就和Keil一樣強(qiáng)大了。
加上VScode強(qiáng)大的編輯能力,那么Keil除了ARMCC還可以讓人留戀一下,其他部分就都可以拋棄了。
提升
想要在實(shí)際工程中使用vscode + GNU的組合,還需要提升幾部分:
- makefile。需要增加更多功能,比如下載,比如分開(kāi)release和debug等,比如增量編譯等。
- 使用task。vscode的task功能是很強(qiáng)大的,不用浪費(fèi)。
- 開(kāi)發(fā)插件。如上所提,調(diào)試功能還是差keil不少。
在github上已經(jīng)有了一個(gè)插件的開(kāi)源項(xiàng)目,實(shí)現(xiàn)了類(lèi)似keil的部分功能,名字叫做cortex-debug,不過(guò)功能還不夠完善,先關(guān)注著。
到此這篇關(guān)于使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)VSCode和VS2017編譯調(diào)試STM32內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
編寫(xiě)C語(yǔ)言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問(wèn)題實(shí)例
這篇文章主要介紹了編寫(xiě)C語(yǔ)言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問(wèn)題實(shí)例,文中附錄了一個(gè)各種進(jìn)制間的轉(zhuǎn)換程序代碼,需要的朋友可以參考下2015-08-08
java實(shí)現(xiàn)任意四則運(yùn)算表達(dá)式求值算法
這篇文章主要介紹了java實(shí)現(xiàn)任意四則運(yùn)算表達(dá)式求值算法,實(shí)例分析了基于java實(shí)現(xiàn)表達(dá)式四則運(yùn)算求值的原理與技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
C++ Boost PropertyTree示例超詳細(xì)講解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)2022-11-11
深入解析Radix Sort基數(shù)排序算法思想及C語(yǔ)言實(shí)現(xiàn)示例
基數(shù)排序和桶排序、計(jì)數(shù)排序共同是三種最常用的線性排序算法,這里我們就來(lái)深入解析Radix Sort基數(shù)排序算法思想及C語(yǔ)言實(shí)現(xiàn)示例,需要的朋友可以參考下2016-07-07

