末尾帶全部工具,代碼工程打包,直接一步搞定.
- 本文主題: ARM-GCC 套件 + VScode + OpenOCD + CMSIS-Debug = 開源 IDE

上圖為最終作業環境演示.
為何使用GCC+VScode
在嵌入式開發程序中, 之前都是用的是Keil-MDK, IAR, 等商業集成開發環境(IDE) .
- Keil MDK


MDK被ARM收購以后,AC6 AC6 編譯器的性能越來越給力.在官網的說明里,運行效率和代碼體積都比開源編譯器ARM-GCC好20%以上.
-
IAR SYSTEMS

IAR system(瑞典)的商業編譯器在STM8,MSP430,CortexM下的表現非常棒. 代碼運行效率也非常不錯,IDE軟體集成度高,編譯,下載,Debug都很流暢. -
SEGGER Embedded Studio

可供選擇的還有來自出品J-link公司SEGGER的Embedded Studio. 非商業用途是免費使用. 缺點是僅支持自家的JLINK,Embedded Studio也是采用GCC和CLANG,其中CLANG是個趨勢,現在MDK的AC6也是用的CLANG.
以上這三個都是商業編譯器/ IDE. 咨詢過是MDK的國內代理公司米er科技,一年的授權費用是幾w元. 聽聞不少同行也收到了來自MDK的警告郵件.
當產品仍然在評估階段,還沒有預算時, 可以選擇開源的GCC編譯器.
GCC是 GNU C /C++ Compiler 的簡稱


在開源編譯器中,可供選擇的有GCC 和 LLVM-Clang(MacOS系統采用), Linux系統默認安裝了GCC編譯套裝, 可以自己編譯自己的內核,驅動,程式. 我們要給單片機編程, 在電腦上編譯別的芯片的指令這叫做交叉編譯.
交叉編譯使用的編譯器是:gcc-arm-none-eabi,
- arch - 體系架構,如ARM,MIPS
- verdor - 工具鏈提供商, 是gcc
- os - 目標作業系統,none代表裸機開發
- eabi - 嵌入式應用二進制介面,Application binary interface (ABI), EABI中的E,表示“Embedded”,是一種新的ABI,支持軟體浮點和硬體實作浮點功能混用.
目前版本是 GCC 10 2020-q4, gcc-arm-none-eabi ,由自由軟體基金會和ARM進行維護, 由 C /C++ Compiler ,Binutils, GDB,NewLib 四個部分,這些我們都會用上,

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm
- C /C++ Compiler: 編譯器生成機器代碼 .o 檔案
- Binutils: 工具套裝,包含ld,ar,objdump等, 例如用于生成Bin檔案,Hex檔案.
- GDB: 用于打斷點除錯,運行時讀取記憶體資料. 找Bug.
- NewLib: 面向嵌入式系統的C運行庫, 主要有libc,libm, 比如常用的math.h數學函式, std標準庫, printf() 列印功能.
最新的優化和編譯器技術,兼容最新的芯片,需要及時升級版本.
本人在2016年GCC5.x版本的時候,由于Cortex-M7剛剛推出,.
編譯STM32F7的芯片的時候就會出現兼容性問題.
現在在上面網頁可以看到: Cortex-M7以及2019推出的M0+/M23/M33內核的單片機都已經支持好了.
- VSCode

不多介紹, Stack Overflow對2018年的IT生態調查顯示:Visual Studio Code超過Visual Studio一躍成為榜首,成為“最受歡迎的開發環境”, 前端后端全堆疊程式員必備. 當然嵌入式工程師也不能少.
一 .安裝軟體
1. Mingw-w64 GCC for Windows 64 & 32 bits
第一步, 安裝Mingw-w64, 推薦使用離線安裝包安裝,其實就是解壓到方便找到的目錄
推薦不要使用Online Installer, 會比較慢,雖然整個軟體只要10MB,非常小,
注意我們使用軟體要在官方提供的地址進行下載,警惕百du網盤(除非明確知道來源)和其他下載站. 官方鏈接一般是
官方專案主頁,SourceForge ,或者官方專案Github release頁面進行下載. SourceForge
是全球最大的開放源代碼軟體開發平臺和倉庫,它集成了很多開放源代碼應用程式,為軟體開發提供了整套生命周期服務
下面紅框里任選, 都是可以用,區別是Windows下實作的系統呼叫細節不一樣.
我選的是i686-posix-dwarf,可能是最佳兼容性,這個是在線下載器默認安裝的版本.
下載地址:
https://sourceforge.net/projects/mingw-w64/files/

上圖不同版本區別的參考文章 :
https://blog.csdn.net/AMDDMA/article/details/111600238
Mingw-w64 包含了Windows下的本機GCC編譯器套件, 編譯產物一般是原生 Windows 應用, 學習C/C++語言,不使用微軟的VC的話,就可以使用GCC進行編譯windows下的程式.
安裝(或解壓縮)完畢, 會得到一個bin目錄(后面要放入系統環境變數里面Path), 里面有很多exe,都是是windows系統的GCC軟體套裝.

記住這個bin檔案夾,這個是我們make安裝目錄
為了方便以后在命令列執行make指令,而不是輸入較長的"mingw32-make", 要把mingw32-make.exe 復制為make.exe.
一些題外話:
在嵌入式開發上,我們只要用到Mingw-w64提供的make.exe程式,make是用于決議Makefile檔案的軟體,可以認為Makefile檔案是自動呼叫gcc,把目錄里一個個*.c .*h檔案喂給gcc去編譯的一個自動腳本檔案,用戶可以自由決定那些檔案是需要編譯的,哪些是不用編譯的,還可以設定編譯的選項,比如"編譯優化等級",“宏定義”,"警告等級"等等.
更多Makefile相關資料,參考: GNU Make 使用手冊(中譯版),
內容較多僅作查閱,實際使用時我們只要輸入make這四個字母就行.
https://blog.csdn.net/weixin_40535588/article/details/89336051
到此make安裝完畢.
2. 安裝 ARM-GCC 交叉編譯器
進入ARM開發者官網下載編譯器安裝包,下面一個是壓縮包,另外一個是安裝包,本文章軟體都是不需要"安裝"的,都是win32可執行二進制檔案,是一個解壓的動作即可.
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

安裝解壓完成后,可以找到一個bin檔案夾,這個就是我們編譯器安裝目錄.

到此GCC交叉編譯器安裝完畢
3. 安裝 Debug 除錯工具 openocd 0.10.0
有了以上兩個工具, 已經可以編譯出Bin 或者 Hex檔案, 但是撰寫程式遇到Bug,就免不了使用Debug功能, 實時加入斷點,獲取某個記憶體的數值, 或者查看系統Hardfault前的呼叫,快速找到出錯代碼. 可以大大加快排除Bug的速度.
Debuger 的硬體可以是: CMSIS-DAP / STlink V2 / Jlink OB V8 V9 , 這里更加推薦ARM官方開源的CMSIS-DAP. 介面速度和兼容的型號上是超過了Jlink V8, 本身軟硬體也是開源的,可以直接上網購買別人做好的模塊, 實際CMSIS-DAP硬體上就是一片帶usb的stm32而已,價格30元以內,帶介面隔離或者無線除錯的可能貴一些.

官網 http://openocd.org
最新版本是2017年發布的 OpenOCD 0.10.0, 加入ARM Cortex-M7 支持,以及當年推出的STM32F7等一些列的支持, 這個開源專案更新比較慢 一般2-3年一更.
有了硬體,使用openocd (Open On-Chip Debugger/) 可以驅動CMSIS-DAP硬體,最終實作GDB服務,這樣借助IDE的圖形界面發送指令給GDB server, 我們就可以一鍵獲得芯片內部的記憶體,一鍵操作代碼的流程,打斷點, 同時也支持燒寫Flash到指定地址.
下載地址
找到sysprogs公司網站上(是賣一個叫做VisualGDB軟體的 )提供的win系統編譯版本,版本新,下載速度比較快:
https://sysprogs.com/getfile/1364/openocd-20201228.7z


解壓到想要安裝的地方, 記住bin檔案夾得目錄. 后面我們設定環境變數的時候需要用到.
4. Visual Studio Code

https://code.visualstudio.com/
直接點擊下載exe安裝即可
二. 配置Path 環境變數
以上有三個工具是需要設定到Win系統得環境變數里面, 在Ubuntu / Linux 里面也是一樣的操作,是需要在用戶bash腳本內寫入Path變數.
win10下也是寫入Path,但是比較方便一些. 如下操作:

在 桌面"此電腦"圖示, 右鍵 - >屬性 -> 高級系統設定 -> 環境變數 -> Path ->編輯, 增加 3條我們的bin目錄,分別是:
- 執行 make腳本的 mingw32 的bin目錄
- 交叉編譯器 GNU-ARM-… 下的 bin目錄
- 除錯器 openOCD 的 bin 目錄
完畢, 運行cmd , 或者在vscode界面下面的終端, 就可以直接輸入指令查詢這些工具的版本.
查詢make版本
make -v
查詢交叉編譯器版本
arm-none-eabi-gcc -v
查詢openOCD版本
openocd -v
如果顯示諸如: “不是內部或外部命令,也不是可運行的程式或批處理檔案” , 說明環境變數不正確, 系統無法在環境變數的路徑串列里找到我們需要的工具. 就需要回到上面步驟進行檢查. 在Linux下也是如此是Path路徑的問題.

上圖三個命令都已經可以在cmd內呼叫,回應-v引數回傳自己版本號.

在VScode內使用 Ctrl + ~快捷鍵, 打開內置的power shell終端, 也可以順利看到命令回傳版本.
VScode的終端顯示效率高,支持代碼高亮. 建議以后就在專案內直接使用, 不再使用 Win10 那個黑色cmd.
到此我們的Win10 已經擁有了和Linux下交叉編譯一樣的環境, 可以編譯任意arm-gcc ,makefile 的工程了.
甚至可以撰寫本機電腦執行的C++程式
只要輸入:gcc main.x -o main.exe一句代碼即,0.1秒 一瞬間可完成編譯得到可以直接執行的exe檔案.
接下來我們編譯一個STM32 CubeMX生成的makefile工程. 直接編譯單片機程式.
三. 編譯STM32代碼
1.獲取STM32CubeMX工具,直接生成模板
也可以不使用,直接下載文章最后我提供的模板
STM32CubeMX是目前單片機界最強配置工具, 支持Mac,Linux,Win 系統, 可以查詢型號, 配置引腳和外設,直接生成代碼. 其他廠家還有非常長的路要追趕.
下載地址:
https://www.st.com/zh/development-tools/stm32cubemx.html#get-software


2.生成 STM32F103的Makefile工程
( 熟悉CubeMX兄臺的請略過)
在起始頁面, 點擊MCU SELECTOR


選擇芯片后, 如是第一次選擇F1的芯片的話, ,需要一點時間下載F1芯片的支持包,彈框點擊YES下載 ,下載速度還可以.

(上圖) 然后可以根據需要配置一下時鐘,引腳外設, 接下來就找到: Project Manager, 進行設定.
注意要選擇:Mekefile環境,否則是生成Keil或者IAR工程, 最后點擊生成即可.

生成完畢, 可以自動打開目錄, 看到生成結果如上. 右鍵選擇Open with Code. 打開VScode 進行查看.
3.編譯代碼

先不細看, 直接編譯, 按 Crtl + ~, 調出命令列, 輸入: make -j

1秒后, 編譯完成, 生成了 .hex 檔案 和 bin檔案. 位于自動生成的./Build檔案夾內.

由于使用了-j 指令, 會使用多執行緒編譯. 編譯速度非常快只要一瞬間就完成了HAL庫和main檔案的編譯并生成 Bin 和 Hex檔案.

如果要清理Build目錄, 只要運行make clean 命令, 由于這個Makefile檔案只考慮到Linux系統, 我們需要把clean的命令 -rm -fR $(BUILD_DIR) 改為Windows下的-del /q $(BUILD_DIR).
至此STM32工程編譯完成.,STM32工程的芯片
4.下載 Bin檔案到目標板
方法1: 使用STLink v2 硬體,SWD介面,用官方STM32 ST-LINK Utility軟體下載Bin檔案.
方法2: 使用Jlink OB/V8/V9 使用J-flash下載Bin檔案.
方法3. 使用芯片內置的ISP功能,手動把BOOT0腳拉高,使用mcu-isp軟體,uart1串口燒寫.
方法4(推薦). 使用OpenOCD, 硬體使用CMSIS-DAP/STLink v2.
命令列執行:
用CMSIS-DAP:
openocd -f cmsis-dap.cfg -f stm32f1x.cfg -c init -c halt -c "program my_gcc_test.bin 0x8000000" -c reset -c shutdown
用STLink v2:
openocd -f stlink-v2.cfg -f stm32f1x.cfg -c init -c halt -c "program my_gcc_test.bin 0x8000000" -c reset -c shutdown
需要先把介面配置,和芯片組態檔從openocd安裝目錄/拷貝到工程目錄下,
cmsis-dap.cfg 或 stlink-v2.cfg 位于 : 安裝目錄\share\openocd\scripts\interface
stm32f1x.cfg位于 : 安裝目錄\share\openocd\scripts\target
參考
https://blog.csdn.net/u011011827/article/details/102643360
芯片 Debug 單步除錯步驟參照下面步驟的Debug部分.
四. 編譯GD32工程, 并使用OpenOCD進行Debug.
2020年的特殊情況, 導致ST芯片的缺貨潮的到來, ST單片機芯片一片難求, 上面舉例的STM32F1系列的價格由原先的8-10元直接飆升到30-100元,某些型號甚至2021年全年無貨.
以下以GD32單片機為例,MM32 ,AT32,APM32類似, 選用一個ST替代芯片進行Debug部分記錄.
1 . 關于獲取GD32工程模板.
在英文/中文官網查找,GD32官方韌體庫只提供了韌體庫的C源代碼以及MDK/IAR工程, 沒有提供GCC工具鏈需要的鏈接腳本.ld檔案,以及.s檔案匯編格式啟動檔案.
- 方案1: 直接沿用上面STM32的工程, 把HAL庫替換為GD32的標準庫,再修改makefile檔案即可.
- 方案2: 找到一份可用的GD32 GCC工程.已經寫好makefile以及匹配好GD32的庫,可以不需要相同的芯片型號,我們可以自己替換庫檔案.
先選方案2: 在Github搜索GD32 + GCC, 果然有識訓
https://github.com/blueskull/GD32F3x0-gcc , 下載下來,發現makefile更加簡潔(只要30行),好就它了.

(同樣我做了一些本地化修改, 把make clean時要用的洗掉檔案的rm命令換成了del命令)
2 .GD32工程編譯.
可以看到makefile編譯分為 make app 和make driver兩個編譯目標. make driver把整個官方庫檔案生成driver.a檔案, make app 會編譯app/*.c , 并鏈接剛剛的庫 driver.a 得到最終bin檔案.
所以先輸入 make driver, 再輸入 make app , 即可看到編譯出bin檔案.

這樣設計有個好處,driver.a 一旦生成, 就是一個lib檔案, 不需要進行反復編譯,后面的開發階段編譯會更加的快,很多時候我們不需要編譯lib部分了,但如果我們改動了Lib庫的部分的代碼,就需要執行一次make driver.
我們也可以添加一個 make all, 自動完成先洗掉所有編譯, 重新編譯Lib, 再編譯app.

如上圖增加 all: clean driver app , all這個目標會順序自動執行clean, driver ,app. 整個程序也是非常快.
為什么使用all 這個名稱 ? 因為只輸入make, 等同于輸入了make all, 這個是makefile的規則.
由于程序有先后順序,就不能使用-j選項進行多執行緒加速了, 但在make app 和make driver兩個編譯目標是支持 -j 選項加速的.
插入一個題外話: 在GCC編譯下, 涉及到幾萬個檔案的工程高級加速,可以使用ccache進行進一步的加速.
如果使用Ninja編譯腳本替換Makefile進行編譯,還可以獲得50%的編譯加速. 讓原本小時級別大工程的編譯進入若干分鐘以內.
3 .GD32工程的Debug.
參考: https://blog.csdn.net/qq_40833810/article/details/106713462
安裝VScode插件 Cortex-debug.
內建了不輸于Keil-mdk 的界面,包括暫存器,watch,外設,反匯編等功能.

點擊VScode左邊插件圖示,搜索cotrex-debug,點擊install安裝.
在 Debug 界面,點擊 “add configuration”, 添加以下內容:
launch.json檔案關鍵點是設定:
- 正確的elf檔案, elf檔案是帶有除錯資訊的編譯結果,可以告訴gdb那一句匯編對應哪個檔案,類似MDK環境下的axf檔案.
- 正確的openocd 的2個組態檔.
- servertype,type型別填對. 這樣才能啟動openocd.

同下載步驟, 需要先把介面配置,和芯片組態檔從openocd安裝目錄/拷貝到工程目錄下,
cmsis-dap.cfg 或 stlink-v2.cfg 位于 : 安裝目錄\share\openocd\scripts\interface
stm32f1x.cfg(我改名為了openocd_target)位于 : 安裝目錄\share\openocd\scripts\target
stm32f1x.cfg, 我改名為了openocd_target,且通用于國產m3 m4,因為里面主要是寫了一個debug暫存器( DBGMCU_CR 0xE0042004)的地址,配置了一下芯片,這點都是一樣的,不一樣的話可以找芯片datasheet來改stm32f1x.cfg內容就可以了.GD32等各種32是一模一樣的.
下一部點擊左邊瓢蟲, 開始dubug環境,

全文完
上文所有用的的軟體, 代碼模板:
鏈接:https://pan.baidu.com/s/1K5C6x6krvdmLUaYjrB3Mvw
提取碼:1pe2
如有幫助,支持1c幣: https://download.csdn.net/download/cqy1028/15493896
更多關于嵌入式,編程歡迎關注,持續更新
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264888.html
標籤:其他
上一篇:[Springboot][STM32]Springboot+STM32+ESP8266 使用HTTP的GET與POST發送請求向Springboot專案上傳資料并展示
