眾所周知,Keil是一款收費軟件,雖然可以Po解使用,但很多公司還是有點害怕,想必有不少讀者都收到過**函。
之前,開發單片機項目,可以說 Keil 是最佳選擇之一,但VSCode橫空問世之后,這種格局被打破。
因為 VSCode 免費且好用,可以安裝各種插件,很多工程師逐漸從Keil 轉向了 VSCode。而且,VSCode還能實現 Keil 不能實現的一些功能。
下面就給大家分享一下 VSCode 搭建 STM32 開發環境的一些常規且使用的功能。
一、需要的軟件和工具
下載最新版VS Code: 安裝好插件,具有良好的代碼補全與調試功能。
VS Code下載地址:https://code.visualstudio.com/
下載 LLVM:用于代碼補全,其實可以理解為 Clang。因為VS Code 中“C/C++”插件的自動補全功能不太好用。STM32中好多庫函數都補全不出來。記得按照好之后,將路徑添加到環境變量里。
LLVM下載地址:http://releases.llvm.org/download.html
下載安裝 Git for Windows: 提供Git支持和MINGW64指令終端。
Git下載地址:https://gitforwindows.org/
下載安裝 arm-none-eabi-gcc:選擇gcc-arm-none-eabi-5\_4-2016q3-20160926-win32.exe (md5)這里是一個2016年的,我目前也是用的這個,好像還有其他的新版的下載,GNU Arm Embedded Toolchain。正常安裝后,記得需要將軟件的安裝目錄下的bin文件夾設置進入環境變量PATH中。
arm-none-eabi-gcc下載地址:https://launchpad.net/gcc-arm-embedded/+download
下載 OpenOCD for Windows:一個開源的片上調試器(Open On-Chip Debugger)。在Windows下自己編譯可能有問題 。所以,我們選擇編譯好的。下載后的文件不是安裝包,把程序文件夾放入自己的軟件安裝目錄下,將軟件的bin文件夾路徑加入用戶環境變量PATH中。
OpenOCD下載地址:http://gnutoolchains.com/arm-eabi/openocd/
STM32CubeMX:用于生成帶makefile的工程。這樣我們就可以不用自己寫MakeFile了。套用他的模板,然后修改為自己的目錄就可以。
STM32CubeMX鏈接:http://www.stm32cube.com/
二、搭建編譯環境
1. 用STM32Cube創建工程。
STM32CubeMX生成的是用HAL庫開發的項目,具體怎么配置這里就不介紹了,只介紹與主題有關的部分。 (1)STM32CubeMx芯片包(固件庫)下載,注意事項:
需要選擇help -> updater settings ->Connection Parameters設置好網絡后,才能下載固件包。 (2)生成工程。選擇MakeFile選項。 注意: 4.18.0以下的版本是沒有Makefile這個選項的。最后下載一個中間版本,因為5.0以上的版本界面很亂。我選擇的是 4.27.0.
2.配置VS Code
(1)打開工程所在的文件夾。在右鍵“用VS Code打開工程文件夾”,
你將會看到這樣的目錄結構
.ioc文件是STM32Cube的工程文件,Inc和Src是供用戶修改的源碼,Driver里是STM32和ARM CMSIS的庫,最好不要修改。 不過,如果你要采用標準庫開發的話,就修改為標準庫的Driver.
(2)安裝VS Code插件,需要這幾樣:
(3)配置VS Code內置終端
這里將我們上面安裝的 Git for Windows 設置為VScode 的內置終端。 文件–首選項–設置,搜索terminal,設置內置終端的Shell為Bash(安裝VS Code的時候它會推薦你安裝Git,里面有這個Bash)。或者打開 Settings.json添加下面兩句。
? "terminal.integrated.shell.windows":?"D:\Program?Files\Git\bin\bash.exe", "terminal.external.windowsExec":?"D:\Program?Files\Git\bin\bash.exe" 然后按Ctrl+` 就可以打開終端,看到Bash了
?
?
(4)配置智能補全、智能感知插件。
前面我們安裝了 LLVM 用它來實現智能補全,與糾錯,自然就需要一個路徑去尋找這些文件。因此我們需要一個。c\_cpp\_properties.json文件的配置文件。 我們在當前目錄的.vscode文件夾下創建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不是一個type類型。 則需要 添加宏定義\_\_CC\_ARM,如果沒有該宏定義,則uint32\_t類型會報錯。并且結構體中使用了uint32\_t定義的成員,也會補全不了。
(5)編譯程序
gcc下編譯過程如下圖所示:
.c文件 經過 arm-none-eabi-gcc 編譯成 .o文件
.s文件 經過 arm-none-eabi-as 編譯成 .o文件
.o文件 和 .a文件 經過 arm-none-eabi-ld 鏈接成 .elf文件
.elf文件 經過 arm-none-eabi-objcopy 和 arm-none-eabi-objdump 轉換成 hex文件/dis文件
arm-none-eabi-gdb 使用 .elf文件 進行debug
在Terminal下輸入make指令,即會開始build程序
編譯完成后,生成的所有文件都會放在Build文件夾下.
注意: 由于我安裝了 Qt. Qt中自帶了 mingw32-make.exe。我把這個文件復制了一份,重命名為make.exe。并且添加進了環境變量中。因此我可以直接使用 make。 如果你沒有 make 的環境。可以下載一個choco包管理器,它類似于linux下的apt,只不過是windows下使用的。然后用choco安裝make即可:
如果改了source code,需要重新編譯程序,那就得先執行make clean指令去刪除之前build好的所有東西。然后重新執行make指令即可。
三、搭建調試環境
1.配置openocd。
要運行openocd這個gdb server,需要配置如下幾個參數:
用什么仿真器?(J-link, ST-link…)
用什么接口?(JTAG, SWD…)
目標芯片是什么?(STM32F4x, tm4c123g…)
首先我們打開openocd的安裝目錄,打開share/openocd/scripts,里面有很多提前寫好的配置文件。
target里存放目標芯片的配置文件,例如stm32f4.cfg interface里存放仿真器相關的配置文件,例如jlink.cfg,stlink.cfg. 當我們啟動openocd時,可以用-f參數來指定一個配置文件。例如:
?openocd?–f?interface/stlink.cfg?–f?target/stm32f4.cfg 【注】配置仿真器的參數必須在配置目標MCU的參數之前,否則將報錯。 如果我們不帶參數啟動,openocd就會自動查找當前目錄下有沒有名為openocd.cfg的文件,并把它作為配置文件來啟動。因此,我們就在當前工程下創建一個名為openocd.cfg的文件。
我們選擇使用ST-link,SWD接口,目標芯片為stm32f1x。 (PS:這里注釋掉了SWD接口,如果采用Jlink 則需要SWD接口)。 這樣,我們連好板子上好電,直接在終端里敲openocd,即可啟動。
openocd運行時,這個shell終端就被占用了,我們一會要新開一個終端。
2.用gdb連接上openocd
(1)直接啟動gdb,參數為編譯好的調試文件(.elf)
(2)使gdb連接上openocd 前面已經說過openocd留給gdb的TCP/IP端口是3333,因此輸入:
target?remote?localhost:3333
?
?
注意,在連接openocd的時候,一定需要先運行 openocd 服務才能通信上,否則一直出現 taget remote 錯誤。 (3)下載代碼.
后面就和普通的gdb一樣操作了,加斷點,單步運行什么的,網上可以搜到很多教程。 【注】 最后記得輸入q來退出gdb,以免影響后面的配置。
3.配置openocd任務與build任務
為了避免每次都在終端輸入 make 和 make clean ,與 openocd 。我們可以在VSCode 中,建立一個 Task 來幫我們完成這個任務,
(1)在當前目錄下創建build.py的文件。
(2)在VSCode界面下,單擊“任務”,選擇“配置任務”
按 F1,選擇"配置任務" .vscode目錄下就會創建一個tasks.json配置文件.
打開 tasks.json ,修改內容如下:
注意上面是兩個任務,一個是openocd.用于連接st-link調試。一個是 build 用于編譯。 它相當于是創建了一個名為build的任務,任務的內容是在shell里面執行 python build.py這個命令。只是不用我們手動輸入而已。
4.配置VS Code的調試功能
使用VS Code,肯定是圖方便,圖好看。所以我肯定不會讓大家靠敲命令來調試,這樣豈不是開倒車,還不如用keil。因此,這里要配置VS Code的調試功能,相當于對gdb的一個圖形化吧。 在VS Code內選擇debug(就是左邊那個??蟲子圖標),選擇“添加配置”,類型為GDB。就會在.vscode文件夾下生成launch.json配置文件。 按照下面來配置:
{ ????"version":?"0.2.0", ????"configurations":?[ ??????
??{ ????????????"name":?"ARM?Debug", ?????
???????"type":?"cppdbg", ?????
???????"request":?"launch",
????????????"program":?"${workspaceFolder}/Build/STM32F103RC_Template.elf", ??????
??????"args":?[], ??????????
??"stopAtEntry":?false, ?????
???????"cwd":?"${workspaceFolder}", ??????????
??"environment":?[], ?????
???????"externalConsole":?false,? ?????????
???"MIMode":?"gdb", ?????????
???"miDebuggerPath":?"C:\Program?Files?(x86)\GNU?Tools?ARM?Embedded\5.4?2016q3\bin\arm-none-eabi-gdb.exe", ???
?????????"targetArchitecture":?"arm",? ??
??????????"setupCommands":?[ ??????
??????????{ ??????????????
??????"description":?"選擇調試文件(.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",? ?????
???} ????] } 可以看到,setupCommands里面就是我們之前試用gdb時操作過的流程:連接GDB Server——reset——halt——下載代碼。 而preLaunchTask中是我們之前在tasks.json中配置的build任務。它可以讓我們每次調試時都先編譯一遍。 保存后,隨便打幾個斷點,按下F5,就可以快樂調試了。可以看到功能還是很齊全的。
?
?
【注意】:在進行調試的時候,需要先 按 F1 --> 任務:運行任務里選擇 openocd 任務運行。
因為調試,需要連接st-link進行調試,而openocd任務是開啟st-link的服務。這樣客戶端才能連接上。 否則會一直出現 target remote localhost:3333 的錯誤。 ? 看到這里,基本就差不多了,開發STM32完全沒問題了。
編輯:黃飛
?
評論
查看更多