STM32單片機非常強大,大多數教程都是使用 keil 編譯器,keil 是收費的而 gcc 是開源免費的。這里介紹一些使用 gcc +?vscode?開發單片機程序的經驗。(這里不解釋 gcc 是什么)。
第一:環境準備
gcc
https://developer.arm.com/
我有個習慣:盡量使用免安裝版軟件,直接解壓到軟件安裝目錄中,添加環境變量即可使用,這樣即使重裝系統也不必重裝軟件。
把 arm-none-eabi-gcc 的 bin/ 目錄添加到環境變量 Path 中就算安裝完成了。打開命令行執行
?
?
arm-none-eabi-gcc -v
?
?
顯示出版本信息就說明 arm-none-eabi-gcc 可以使用了。
第二:make
我使用的 make 是從 mingw-w64 中復制出來的。
http://mingw-w64.yaxm.org/doku.php
方便單獨下載 make:
https://download.csdn.net/download/qq_33523299/33634450
下載的 make 工具同樣添加到環境變量 Path 中即可使用。
第三:vscode
vscode 僅僅是個文本編輯器,沒有它也能開發(txt 寫代碼,命令行編譯)。
https://code.visualstudio.com/#alt-downloads
又是免安裝版:
軟件目錄下新建文件夾 data/ 可以使 vscode 完全不使用 C 盤空間,所有的緩存文件都會生成在 data/ 內。
第四:編譯鏈接過程
Makefile 告訴 make 要干點什么,要編譯誰,具體怎么編譯;
make 生成相應的命令調用各個工具執行動作;
gcc 負責把 c 源文件編譯成匯編;
as 負責把 編譯器生成的匯編文件和禿頭程序員手擼的匯編文件都轉換成二進制指令,輸出到可重定位目標文件 ( *.o );
(gcc 也可以一次完成 編譯和匯編的動作, 直接用 .c 文件生成 .o 文件)
.ld 文件是鏈接腳本, 告訴鏈接器哪段地址是內存 RAM, 哪段地址是 Flash, 哪些 RAM 分配給了棧, 哪些地址分配給了堆...
鏈接器把所有 .o 文件組合起來, 靜態變量的地址, 函數的地址都會在這里確定, 調用函數的函數名會被替換成函數的地址...最后生成一個 elf 文件;
雖然 elf 是可執行文件, 但裸機是沒法解析 elf 文件的, 所以需要 objcopy 導出純二進制代碼, 這個二進制文件就可以直接燒錄到單片機運行了, 這一步也可以輸出 hex 文件;
如果有需要還可以用 objdump 反匯編二進制文件, 也可以反匯編 elf 文件, 反匯編 .o 文件, 幫助調試.
創建空工程
一個 ".vscode" 文件夾裝一些配置,"boot" 裝啟動單片機的匯編文件,"cmsis" 裝官方提供的源文件,"inc" 裝頭文件,"src" 裝源文件,"output" 裝輸出文件,再來一個 makefile 一個鏈接腳本就完成了。完全沒有多余的東西(txt 寫代碼,命令行編譯的話可以刪掉".vscode")。
在 makefile 所在的目錄執行 "make" 就編譯好了。
https://github.com/bfuxd/stm32f103EmptyProject
這是完整工程(去掉了空文件夾,去掉了輸出目錄),其中的 makefile 支持 windows 和 linux 。
https://github.com/bfuxd/stm32f1Template
是模板工程,添加了一些基本功能。
J-Link燒錄和調試
.vscode/launch.json 里寫入
?
?
{ // 使用 IntelliSense 了解相關屬性。 // 懸停以查看現有屬性的描述。 // 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Cortex Debug", "type": "cortex-debug", "cwd": "${workspaceRoot}", "executable": "${workspaceFolder}\output\template.elf", "request": "launch", "servertype": "jlink", "device": "STM32F103ZE", "interface": "swd", "preLaunchTask": "Compile" } ], }
?
?
.vscode/tasks.json 里寫入
?
?
{ "version": "2.0.0", //每次執行都不啟動一個新的控制臺 "presentation": { "reveal": "always", "panel": "shared", //"new", "echo": true }, //設置環境變量 "options": { "env": { //"Path": "%Path%;D:\ProgramFiles\MinGW64\bin", "LOCAL_SRC_HOME": "${workspaceRoot}" } }, //任務列表 "tasks": [ { "label": "Compile", "command": "make", "args": [], "group": { "kind": "build", "isDefault": true } } ] }
?
?
安裝 J-Link 驅動后,把 J-Link 添加到環境變量 Path 中,點擊 F5 就能仿真了。
還可以監視指定內存、變量、寄存器,反匯編指定函數 ……
仿真時點擊 " Ctrl + Shift + P " 輸入 Cortex-debug: Show disassembly 回車輸入函數名, 即可在匯編中執行指定函數,? " Ctrl + Shift + P " 輸入 Cortex-debug: View Memory 回車輸入起始地址和數據長度, 即可查看內存中指定區域的數據.
徹底告別 keil。
編輯:黃飛
?
評論