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