STM32單片機(jī)非常強(qiáng)大,大多數(shù)教程都是使用 keil 編譯器,keil 是收費(fèi)的而 gcc 是開源免費(fèi)的。這里介紹一些使用 gcc +?vscode?開發(fā)單片機(jī)程序的經(jīng)驗(yàn)。(這里不解釋 gcc 是什么)。
第一:環(huán)境準(zhǔn)備
gcc
https://developer.arm.com/



我有個(gè)習(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
方便單獨(dú)下載 make:
https://download.csdn.net/download/qq_33523299/33634450
下載的 make 工具同樣添加到環(huán)境變量 Path 中即可使用。
第三:vscode
vscode 僅僅是個(gè)文本編輯器,沒有它也能開發(fā)(txt 寫代碼,命令行編譯)。
https://code.visualstudio.com/#alt-downloads
又是免安裝版:


軟件目錄下新建文件夾 data/ 可以使 vscode 完全不使用 C 盤空間,所有的緩存文件都會(huì)生成在 data/ 內(nèi)。

第四:編譯鏈接過程

Makefile 告訴 make 要干點(diǎn)什么,要編譯誰,具體怎么編譯;
make 生成相應(yīng)的命令調(diào)用各個(gè)工具執(zhí)行動(dòng)作;
gcc 負(fù)責(zé)把 c 源文件編譯成匯編;
as 負(fù)責(zé)把 編譯器生成的匯編文件和禿頭程序員手?jǐn)]的匯編文件都轉(zhuǎn)換成二進(jìn)制指令,輸出到可重定位目標(biāo)文件 ( *.o );
(gcc 也可以一次完成 編譯和匯編的動(dòng)作, 直接用 .c 文件生成 .o 文件)
.ld 文件是鏈接腳本, 告訴鏈接器哪段地址是內(nèi)存 RAM, 哪段地址是 Flash, 哪些 RAM 分配給了棧, 哪些地址分配給了堆...
鏈接器把所有 .o 文件組合起來, 靜態(tài)變量的地址, 函數(shù)的地址都會(huì)在這里確定, 調(diào)用函數(shù)的函數(shù)名會(huì)被替換成函數(shù)的地址...最后生成一個(gè) elf 文件;
雖然 elf 是可執(zhí)行文件, 但裸機(jī)是沒法解析 elf 文件的, 所以需要 objcopy 導(dǎo)出純二進(jìn)制代碼, 這個(gè)二進(jìn)制文件就可以直接燒錄到單片機(jī)運(yùn)行了, 這一步也可以輸出 hex 文件;
如果有需要還可以用 objdump 反匯編二進(jìn)制文件, 也可以反匯編 elf 文件, 反匯編 .o 文件, 幫助調(diào)試.
創(chuàng)建空工程

一個(gè) ".vscode" 文件夾裝一些配置,"boot" 裝啟動(dòng)單片機(jī)的匯編文件,"cmsis" 裝官方提供的源文件,"inc" 裝頭文件,"src" 裝源文件,"output" 裝輸出文件,再來一個(gè) makefile 一個(gè)鏈接腳本就完成了。完全沒有多余的東西(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)有屬性的描述。
// 欲了解更多信息,請(qǐng)?jiān)L問: 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í)行都不啟動(dòng)一個(gè)新的控制臺(tái)
"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ū)動(dòng)后,把 J-Link 添加到環(huán)境變量 Path 中,點(diǎn)擊 F5 就能仿真了。

還可以監(jiān)視指定內(nèi)存、變量、寄存器,反匯編指定函數(shù) ……
仿真時(shí)點(diǎn)擊 " Ctrl + Shift + P " 輸入 Cortex-debug: Show disassembly 回車輸入函數(shù)名, 即可在匯編中執(zhí)行指定函數(shù),? " Ctrl + Shift + P " 輸入 Cortex-debug: View Memory 回車輸入起始地址和數(shù)據(jù)長(zhǎng)度, 即可查看內(nèi)存中指定區(qū)域的數(shù)據(jù).
徹底告別 keil。
編輯:黃飛
?
電子發(fā)燒友App









評(píng)論