點(diǎn)擊上方藍(lán)色“混說Linux”,選擇“設(shè)為星標(biāo)”

對(duì)于單片機(jī)開發(fā),使用比較多的就是Keil,但它是一個(gè)收費(fèi)軟件,雖然可以Po解,但是很多公司也害怕收到**函,如果公司準(zhǔn)備上市,那就更不能使用Keil開發(fā)了。
一直都比較喜歡VSCode的這種黑色主題,還能安裝各種插件,免費(fèi)又好用,于是決定搭建一個(gè)用VSCode + 開源 arm 工具鏈 + OpenOCD開發(fā)STM32的環(huán)境。

?
VS Code下載地址:https://code.visualstudio.com/
2. 下載 LLVM :用于代碼補(bǔ)全,其實(shí)可以理解為 Clang。因?yàn)閂S Code 中“C/C++”插件的自動(dòng)補(bǔ)全功能不太好用。STM32中好多庫函數(shù)都補(bǔ)全不出來。記得按照好之后,將路徑添加到環(huán)境變量里。
Git下載地址:https://gitforwindows.org/
3. 下載安裝 Git for Windows:提供Git支持和MINGW64指令終端。
Git下載地址:https://gitforwindows.org/
正常安裝后,記得需要將軟件的安裝目錄下的bin文件夾設(shè)置進(jìn)入環(huán)境變量PATH中。
arm-none-eabi-gcc下載地址:https://launchpad.net/gcc-arm-embedded/+download
一個(gè)開源的片上調(diào)試器(Open On-Chip Debugger)。
在Windows下自己編譯可能有問題 。所以,我們選擇編譯好的。
OpenOCD下載地址:http://gnutoolchains.com/arm-eabi/openocd/
6. STM32CubeMX:用于生成帶 makefile 的工程。
這樣我們就可以不用自己寫MakeFile了。套用他的模板,然后修改為自己的目錄就可以。
STM32CubeMX鏈接:http://www.stm32cube.com/
?
1. 用STM32Cube創(chuàng)建工程

需要選擇“help -> updater settings ->Connection Parameters"設(shè)置好網(wǎng)絡(luò)后,才能下載固件包。



不過,如果你要采用標(biāo)準(zhǔn)庫開發(fā)的話,就修改為標(biāo)準(zhǔn)庫的Driver.


這里將我們上面安裝的 Git for Windows 設(shè)置為VScode 的內(nèi)置終端。
文件–首選項(xiàng)–設(shè)置,搜索terminal,設(shè)置內(nèi)置終端的Shell為Bash(安裝VS Code的時(shí)候它會(huì)推薦你安裝Git,里面有這個(gè)Bash)。
或者打開 Settings.json添加下面兩句。
? ??/*?終端在Windows上使用的shell的路徑?*/
????"terminal.integrated.shell.windows":?"D:\\Program?Files\\Git\\bin\\bash.exe",
????"terminal.external.windowsExec":?"D:\\Program?Files\\Git\\bin\\bash.exe"
前面我們安裝了 LLVM 用它來實(shí)現(xiàn)智能補(bǔ)全,與糾錯(cuò),自然就需要一個(gè)路徑去尋找這些文件。因此我們需要一個(gè)。c_cpp_properties.json文件的配置文件。
我們?cè)诋?dāng)前目錄的.vscode文件夾下創(chuàng)建c_cpp_properties.json配置文件,用來告訴VS Code我們定義的宏與文件的路徑。
{
????"configurations":?[
????????{
????????????"name":?"Win32",
????????????"browse":?{
????????????????"path":?[
????????????????????"${workspaceFolder}/",
????????????????????"${workspaceFolder}/Drivers/CMSIS",
????????????????????"${workspaceFolder}/Drivers/FWlib/inc",
????????????????????"${workspaceFolder}/Drivers/CMSIS/startup",
????????????????????"${workspaceFolder}/User/inc",
????????????????????"${workspaceFolder}/User",
????????????????????"${workspaceFolder}/ThirdParty/crclib/include"
????????????????],
????????????????"limitSymbolsToIncludedHeaders":?true
????????????},
????????????"includePath":?[
????????????????"${workspaceFolder}/",
????????????????"${workspaceFolder}/",
????????????????"${workspaceFolder}/Drivers/CMSIS",
????????????????"${workspaceFolder}/Drivers/FWlib/inc",
????????????????"${workspaceFolder}/Drivers/CMSIS/startup",
????????????????"${workspaceFolder}/User/inc",
????????????????"${workspaceFolder}/User",
????????????????"${workspaceFolder}/ThirdParty/crclib/include"
????????????],
????????????"defines":?[
????????????????"_DEBUG",
????????????????"UNICODE",
????????????????"_UNICODE",
????????????????"__CC_ARM",
????????????????"USE_STDPERIPH_DRIVER",
????????????????"STM32F10X_HD"
????????????],
????????????"compilerPath":?"C:\\Program?Files\\LLVM\\bin\\clang-format.exe",
????????????"cStandard":?"c11",
????????????"cppStandard":?"c++17",
????????????"intelliSenseMode":?"clang-x64"
????????}
????],
????"version":?4
}注意:如果提示variable “uint32_t” is not a type name不是一個(gè)type類型。
則需要 添加宏定義__CC_ARM,如果沒有該宏定義,則uint32_t類型會(huì)報(bào)錯(cuò)。并且結(jié)構(gòu)體中使用了 uint32_t定義的成員,也會(huì)補(bǔ)全不了。
arm-none-eabi-gdb 使用 .elf 文件 進(jìn)行debug



注意:由于我安裝了 Qt. Qt中自帶了 mingw32-make.exe。我把這個(gè)文件復(fù)制了一份,重命名為make.exe。并且添加進(jìn)了環(huán)境變量中。因此我可以直接使用 make。

如果改了source code,需要重新編譯程序,那就得先執(zhí)行make clean指令去刪除之前build好的所有東西。然后重新執(zhí)行make指令即可。
?
1.配置openocd
用什么仿真器?(J-link, ST-link…)
用什么接口?(JTAG, SWD…)
目標(biāo)芯片是什么?(STM32F4x, tm4c123g…)

target里存放目標(biāo)芯片的配置文件,例如stm32f4.cfg
interface里存放仿真器相關(guān)的配置文件,例如 jlink.cfg,stlink.cfg.
當(dāng)我們啟動(dòng)openocd時(shí),可以用-f參數(shù)來指定一個(gè)配置文件。例如:
? ? openocd?–f?interface/stlink.cfg?–f?target/stm32f4.cfg【注】配置仿真器的參數(shù)必須在配置目標(biāo)MCU的參數(shù)之前,否則將報(bào)錯(cuò)。

我們選擇使用ST-link,SWD接口,目標(biāo)芯片為stm32f1x。
(PS:這里注釋掉了SWD接口,如果采用Jlink 則需要SWD接口)。

openocd運(yùn)行時(shí),這個(gè)shell終端就被占用了,我們一會(huì)要新開一個(gè)終端。

前面已經(jīng)說過openocd留給gdb的TCP/IP端口是3333,因此輸入:
? ? target?remote?localhost:3333
注意,在連接openocd的時(shí)候,一定需要先運(yùn)行 openocd 服務(wù)才能通信上,否則一直出現(xiàn) taget remote 錯(cuò)誤。

后面就和普通的gdb一樣操作了,加斷點(diǎn),單步運(yùn)行什么的,網(wǎng)上可以搜到很多教程。
【注】最后記得輸入q來退出gdb,以免影響后面的配置。
為了避免每次都在終端輸入 make 和 make clean ,與 openocd 。我們可以在VSCode 中,建立一個(gè) Task 來幫我們完成這個(gè)任務(wù),



注意上面是兩個(gè)任務(wù),一個(gè)是openocd.用于連接st-link調(diào)試。一個(gè)是 build 用于編譯。
它相當(dāng)于是創(chuàng)建了一個(gè)名為build的任務(wù),任務(wù)的內(nèi)容是在shell里面執(zhí)行 python build.py這個(gè)命令。只是不用我們手動(dòng)輸入而已。
使用VS Code,肯定是圖方便,圖好看。所以我肯定不會(huì)讓大家靠敲命令來調(diào)試,這樣豈不是開倒車,還不如用keil。因此,這里要配置VS Code的調(diào)試功能,相當(dāng)于對(duì)gdb的一個(gè)圖形化吧。
在VS Code內(nèi)選擇debug(就是左邊那個(gè)蟲子圖標(biāo)),選擇“添加配置”,類型為GDB。就會(huì)在.vscode文件夾下生成launch.json配置文件。
按照下面來配置:
{
????//?使用 IntelliSense 了解相關(guān)屬性。?
????//?懸停以查看現(xiàn)有屬性的描述。
????//?欲了解更多信息,請(qǐng)?jiān)L問:?https://go.microsoft.com/fwlink/?linkid=830387
????"version":?"0.2.0",
????"configurations":?[
????????{
????????????"name":?"ARM?Debug",
????????????"type":?"cppdbg",
????????????"request":?"launch",
????????????"program":?"${workspaceFolder}/Build/STM32F103RC_Template.elf",//?要調(diào)試的程序(在下面的參數(shù)中指定了,這里的沒有意義)
????????????"args":?[],
????????????"stopAtEntry":?false,
????????????"cwd":?"${workspaceFolder}",
????????????"environment":?[],
????????????"externalConsole":?false,?//?調(diào)試時(shí)是否顯示控制臺(tái)窗口
????????????"MIMode":?"gdb",
????????????"miDebuggerPath":?"C:\\Program?Files?(x86)\\GNU?Tools?ARM?Embedded\\5.4?2016q3\\bin\\arm-none-eabi-gdb.exe",//調(diào)試工具原始路徑
????????????"targetArchitecture":?"arm",?//目標(biāo)架構(gòu),此參數(shù)必須要有
????????????"setupCommands":?[//?進(jìn)入GDB以后,自動(dòng)執(zhí)行的一些配置??
????????????????{
????????????????????"description":?"選擇調(diào)試文件(.elf)到gdb",
????????????????????"text":?"file?E:/VScode/STM32_VSCode/stm32f103_temp/Build/STM32F103RC_Template.elf",
????????????????????"ignoreFailures":?false
????????????????},
????????????????{
????????????????????"description":?"連接GDB?Server",
????????????????????"text":?"target?remote?localhost:3333",?????????????????????????????????
????????????????????"ignoreFailures":?false
????????????????},
????????????????{
????????????????????"description":?"Reset?MCU",
????????????????????"text":?"monitor?reset",??????????????????????????????????????????????
????????????????????"ignoreFailures":?false
????????????????},
????????????????{
????????????????????"description":?"Halt",
????????????????????"text":?"monitor?halt",??????????????????????????????????????????????????
????????????????????"ignoreFailures":?false
????????????????},
????????????????{
????????????????????"description":"下載代碼到MCU",
????????????????????"text":?"load"?,??????????????
????????????????????"ignoreFailures":?false??????????????????????????????????????
????????????????}
????????????],
????????????"preLaunchTask":?"build",?//?在調(diào)試前預(yù)先執(zhí)行的任務(wù),此處是tasks.json中的
????????}
????]
}
可以看到,setupCommands里面就是我們之前試用gdb時(shí)操作過的流程:連接GDB Server——reset——halt——下載代碼。
而preLaunchTask中是我們之前在tasks.json中配置的build任務(wù)。它可以讓我們每次調(diào)試時(shí)都先編譯一遍。


因?yàn)檎{(diào)試,需要連接st-link進(jìn)行調(diào)試,而openocd任務(wù)是開啟st-link的服務(wù)。這樣客戶端才能連接上。
否則會(huì)一直出現(xiàn) target remote localhost:3333 的錯(cuò)誤。
【注】這里有一個(gè)問題我一直沒有解決,就是setupCommands里,用file選擇調(diào)試用的elf文件時(shí),必須用文件的絕對(duì)路徑。我試過用${workspaceFolder}/build/xxx.elf和./build/xxx.elf都不行,都找不到文件,不知道是不是windows路徑分割符是”\”導(dǎo)致的。具體的后續(xù)再完善。
原文:http://t.csdn.cn/89MOD
版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

往期推薦