[STM32] 教你在vscode下用stm32+makefile+gcc實(shí)現(xiàn)編譯仿真下載一條龍服務(wù)
網(wǎng)站:bbs.21ic.com
生命在于運(yùn)動,技術(shù)在于折騰,你是否厭倦了在keil、iar下孜孜不倦的寫代碼、debug,是否玩累了在外部編輯器下寫代碼,然后在轉(zhuǎn)到ide下進(jìn)行仿真、下載等操作呢?
這個教程將介紹下如何在vscode下實(shí)現(xiàn)這些操作,真正實(shí)現(xiàn)一個vscode可以吃天、實(shí)現(xiàn)編譯仿真下載一條龍服務(wù),而你只需要在vscode下的終端敲幾個命令而已。。。
本教程以阿波羅開發(fā)板stm32f429igt6為例,先瞅瞅最終界面
最終可以用的功能如下:
1,vscode終端下執(zhí)行make指令,即可在build文件下編譯出.hex .bin .elf文件,中間文件放在build/Obj/文件夾下
2,執(zhí)行make clean,可清除build文件夾
3,執(zhí)行make download,可一鍵下載hex到目標(biāo)板子并讓板子復(fù)位運(yùn)行,相當(dāng)于keil的一鍵下載按鈕
4,執(zhí)行make reset,可以讓板子復(fù)位運(yùn)行一下
5,執(zhí)行make commit,可一鍵推送到你的github或者giteee遠(yuǎn)程服務(wù)器上去,但前提是你自己創(chuàng)建了這個工程的git
教程如下:
環(huán)境:
1,下載vscode及必要插件,令需要一個插件Cortex_debug
2,Windows下安裝arm-none-eabi-gcc工具鏈,推薦q4版本
下載及安裝教程:https://blog.csdn.net/qq_35333978/article/details/110398968
3,Windows下安裝Jlink最新版驅(qū)動(V6.88a)
附件上傳不上去,故分享個網(wǎng)盤永久鏈接
鏈接:加HTTP加斜杠pan.baidu.com/s/11YnBjWtl9L9V7YCQABC60Q
提取碼:ysgp安裝、下載的教程也在上面的鏈接。
4,GNU make
百度網(wǎng)盤鏈接和安裝教程、添加環(huán)境變量教程也在上邊的鏈接。。。
5,git bash
這個不用說,大家都會有的吧,然后需要把vscode的終端換成git bash。百度一下,太容易了。
好了,環(huán)境就搭好了,不要嫌麻煩,現(xiàn)在越麻煩,你用起來越方便!
編譯:編譯只需在vscode終端中執(zhí)行make指令就行,如下圖:
仿真:仿真的話需要vscode下的插件cortex debug,這個教程我粘貼上我之前寫的國產(chǎn)芯片fm33lc02x的教程,大家只要把芯片名字換成STM32F429就行
(1) vscode下載插件cortex debug插件
![[STM32] 教你在vscode下用stm32+makefile+gcc實(shí)現(xiàn)編譯仿真下載一條龍服務(wù)](/images/21ic_nopic.gif)
![[STM32] 教你在vscode下用stm32+makefile+gcc實(shí)現(xiàn)編譯仿真下載一條龍服務(wù)](/images/21ic_nopic.gif)
![[STM32] 教你在vscode下用stm32+makefile+gcc實(shí)現(xiàn)編譯仿真下載一條龍服務(wù)](/images/21ic_nopic.gif)
![[STM32] 教你在vscode下用stm32+makefile+gcc實(shí)現(xiàn)編譯仿真下載一條龍服務(wù)](/images/21ic_nopic.gif)
然后實(shí)現(xiàn)這一切的核心就是makefile文件,不用管,我已經(jīng)幫你寫好了,而且全部中文注釋,各種參數(shù)也是取自stm32cube的makefile參數(shù),放心的用,放心的學(xué)!
然后我將在附件提供一個基于阿波羅開發(fā)板stm32f429igt6的點(diǎn)燈例程。如果的芯片不是stm32f429,但只要你的核是arm核,本例程本makefile,通通能用!
換芯片后你需要改以下內(nèi)容:
1,找到你的芯片的基于gcc的啟動文件和鏈接腳本,一般問廠商要肯定有的,不用自己寫,然后替換到根目錄下的2個對應(yīng)文件
![[STM32] 教你在vscode下用stm32+makefile+gcc實(shí)現(xiàn)編譯仿真下載一條龍服務(wù)](/images/21ic_nopic.gif)
2,改以下內(nèi)容,是不是看起來特簡單。
![[STM32] 教你在vscode下用stm32+makefile+gcc實(shí)現(xiàn)編譯仿真下載一條龍服務(wù)](/images/21ic_nopic.gif)
最后附上我的整個makefile
???#*************************************************************************??
#??**??
#??**?File?????????:?Makefile??
#??**?Abstract?????:?This?is?the?introduction?to?the?document??
#??**?Author???????:?wr??
#??**?mail?????????:?791314247@q.com??
#??**?Created?Time?:?2020年11月22日?星期日?11時(shí)58分06秒??
#??**?copyright????:?COPYRIGHT(c)?2020??
#??**??
#??************************************************************************/??
??
ifneq?($(V),1)??
Q?:=?@??
else??
Q?:=??
endif??
??
################################以下項(xiàng)目需用戶根據(jù)需要更改##########################??
#?輸出文件的名稱,默認(rèn)為main(main.elf?main.bin?main.hex)??
TARGET?:=?main??
??
#鏈接文件名稱和所在路徑??
LDSCRIPT?:=?./STM32F429IGTx_FLASH.ld??
??
#啟動文件名稱和所在路徑??
START_FILE_SOURCES?:=?./startup_stm32f429xx.s??
??
#內(nèi)核選擇,F(xiàn)PU,?FLOAT-ABI可為空??
CPU???????:=?-mcpu=cortex-m4??
FPU???????:=?-mfpu=fpv4-sp-d16??
FLOAT-ABI?:=?-mfloat-abi=hard??
??
#系統(tǒng)宏定義??
C_DEFS????:=?\??
-DUSE_HAL_DRIVER?\??
-DSTM32F429xx??
??
#?芯片型號,用于Jlink仿真調(diào)試、下載??
CHIP??????:=?STM32F429IG??
??
#?選擇優(yōu)化等級:??
#?1. gcc中指定優(yōu)化級別的參數(shù)有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。??
#?2. 在編譯時(shí),如果沒有指定上面的任何優(yōu)化參數(shù),則默認(rèn)為?-O0,即沒有優(yōu)化。??
#?3. 參數(shù)?-O1、-O2、-O3 中,隨著數(shù)字變大,代碼的優(yōu)化程度也越高,不過這在某種意義上來說,也是以犧牲程序的可調(diào)試性為代價(jià)的。??
#?4. 參數(shù)?-Og 是在?-O1 的基礎(chǔ)上,去掉了那些影響調(diào)試的優(yōu)化,所以如果最終是為了調(diào)試程序,可以使用這個參數(shù)。不過光有這個參數(shù)也是不行的,這個參數(shù)只是告訴編譯器,編譯后的代碼不要影響調(diào)試,但調(diào)試信息的生成還是靠?-g 參數(shù)的。??
#?5. 參數(shù)?-Os 是在?-O2 的基礎(chǔ)上,去掉了那些會導(dǎo)致最終可執(zhí)行程序增大的優(yōu)化,如果想要更小的可執(zhí)行程序,可選擇這個參數(shù)。??
#?6. 參數(shù)?-Ofast 是在?-O3 的基礎(chǔ)上,添加了一些非常規(guī)優(yōu)化,這些優(yōu)化是通過打破一些國際標(biāo)準(zhǔn)(比如一些數(shù)學(xué)函數(shù)的實(shí)現(xiàn)標(biāo)準(zhǔn))來實(shí)現(xiàn)的,所以一般不推薦使用該參數(shù)。??
#?7. 如果想知道上面的優(yōu)化參數(shù)具體做了哪些優(yōu)化,可以使用 gcc -Q --help=optimizers 命令來查詢。??
OPT???????:=?-Og??
??
#?是否將debug信息編譯進(jìn).elf文件,默認(rèn)打開??
DEBUG?????:=?1??
??
#?輸出文件夾,.hex?.bin?.elf放在此文件夾下,.o?.d文件放在此文件的子目錄Obj下(自動創(chuàng)建)??
BUILD?????:=?./build??
??
#?支持雙系統(tǒng)編譯,故需選當(dāng)前系統(tǒng),0為linux,1為windows??
SYS????:=?1??
#?若指定了windows系統(tǒng),則需確認(rèn)編譯器的路徑,若安裝時(shí)以默認(rèn)路徑安裝,則正確??
ifeq?($(SYS),?1)??
GCC_PATH?=?"/c/Program?Files?(x86)/GNU?Tools?Arm?Embedded/9?2019-q4-major/bin"??
JLINK_PATH?=?"/c/Program?Files?(x86)/SEGGER/JLink"??
endif??
###################################用戶修改結(jié)束###################################??
??
#?編譯器定義??
PREFIX?=?arm-none-eabi-??
ifdef?GCC_PATH??
SUFFIX?=?.exe??
CC??????:=?$(GCC_PATH)/$(PREFIX)gcc$(SUFFIX)??
SZ??????:=?$(GCC_PATH)/$(PREFIX)size$(SUFFIX)??
OBJCOPY?:=?$(GCC_PATH)/$(PREFIX)objcopy$(SUFFIX)??
GDB?????:=?$(GCC_PATH)/$(PREFIX)gdb$(SUFFIX)??
BIN?????:=?$(OBJCOPY)?-O?binary?-S??
HEX?????:=?$(OBJCOPY)?-O?ihex??
else??
CC??????:=?$(PREFIX)gcc??
SZ??????:=?$(PREFIX)size??
OBJCOPY?:=?$(PREFIX)objcopy??
GDB?????:=?$(PREFIX)gdb??
BIN?????:=?$(OBJCOPY)?-O?binary?-S??
HEX?????:=?$(OBJCOPY)?-O?ihex??
endif??
??
#?Jlink定義,用于支持一鍵下載和gdb仿真??
ifdef?JLINK_PATH??
SUFFIX?=?.exe??
JLINKEXE???????:=?$(JLINK_PATH)/JLink$(SUFFIX)??
JLINKGDBSERVER?:=?$(JLINK_PATH)/JLinkGDBServer$(SUFFIX)??
else??
JLINKEXE???????:=?JLinkExe??
JLINKGDBSERVER?:=?JLinkGDBServer??
endif??
??
??
####################?CFLAGS?Config?Start?##########################??
MCU?=?$(CPU)?-mthumb?$(FPU)?$(FLOAT-ABI)??
??
#搜索所有的h文件,并輸出攜帶-I的.h文件路徑??
C_INCLUDES?:=?$(addprefix?-I,$(subst?./,,$(sort?$(dir?$(shell?find?./?-type?f?-iname?"*.h")))))??
??
#編譯參數(shù)??
CFLAGS?=?$(MCU)?$(C_DEFS)?$(C_INCLUDES)?$(OPT)?-fdata-sections?-ffunction-sections??
#開關(guān)警告??
CFLAGS?+=?-Wall?-W?-Wno-unused-parameter??
#標(biāo)準(zhǔn)??
CFLAGS?+=?-std=c99??
??
#當(dāng)開啟DEBUG功能時(shí)攜帶DEBUG參數(shù)??
ifeq?($(DEBUG),?1)??
CFLAGS?+=?-g?-gdwarf-2??
endif??
??
#自動生成依賴文件??
CFLAGS?+=?-MMD?-MP?-MF"$(@:%.o=%.d)"??
####################?CFLAGS?Config?End?##########################??
??
#?libraries??
LIBS?=?-lc?-lm?-lnosys??
LIBDIR?=??
#鏈接指令集-specs=nosys.specs??
LDFLAGS?=?$(MCU)?-T$(LDSCRIPT)?-specs=nano.specs?$(LIBDIR)?$(LIBS)?-Wl,-Map=$(BUILD)/Obj/$(TARGET).map,--cref??
#是否開啟優(yōu)化掉未使用的函數(shù)和符號??
LDFLAGS?+=?-Wl,--gc-sections??
??
#制作啟動文件依賴Obj,輸出去掉路徑的.o文件,可兼容.s和.S??
START_FILE_OBJ?????=?$(addsuffix?.o,?$(basename?$(notdir?$(START_FILE_SOURCES))))??
OBJECTS????????????=?$(addprefix?$(BUILD)/Obj/,?$(START_FILE_OBJ))??
??
#搜索所有的c文件,制作所有的.c文件依賴Obj??
C_SOURCES??????????=?$(subst?./,,$(shell?find?./?-type?f?-iname?"*.c"))??
OBJECTS???????????+=?$(addprefix?$(BUILD)/Obj/,?$(notdir?$(C_SOURCES:%.c=%.o)))??
#PS:去掉終極目標(biāo)的原始路徑前綴并添加輸出文件夾路徑前綴(改變了依賴文件的路徑前綴,需要重新指定搜索路徑)??
??
#指定makefile搜索文件的路徑(假如終極目標(biāo)的依賴文件不攜帶.c文件所在的路徑,??
#且不指定搜索路徑,makefile會報(bào)錯沒有規(guī)則制定目標(biāo))??
vpath?%.c?$(sort?$(dir?$(C_SOURCES)))??#取出路徑并去重和排序(以首字母為單位)??
vpath?%.s?$(dir?$(START_FILE_SOURCES))??
vpath?%.S?$(dir?$(START_FILE_SOURCES))??
??
??
#指定為偽目標(biāo)跳過隱含規(guī)則搜索,提升makefile的性能,并防止make時(shí)攜帶的參數(shù)與實(shí)際文件重名的問題??
.PHONY:all?clean?printf?JLinkGDBServer?debug?download?reset?commit??
??
all?:?$(BUILD)/$(TARGET).elf?$(BUILD)/$(TARGET).bin?$(BUILD)/$(TARGET).hex??
??
??
#鏈接所有的.o生成.elf文件??
$(BUILD)/$(TARGET).elf?:?$(OBJECTS)?|?$(LDSCRIPT)??
????????$(Q)$(CC)?$(LDFLAGS)?-o?$[url=home.php?mod=space&uid=72445]@[/url]?$(OBJECTS)??
????????$(Q)echo?"make?$@:"??
????????$(Q)$(SZ)?$@??
??
??
#編譯啟動文件??備用參數(shù):#-x assembler-with-cpp??
$(BUILD)/Obj/$(START_FILE_OBJ)?:?$(START_FILE_SOURCES)?Makefile?|?$(BUILD)/Obj??
????????$(Q)echo?"buid?$(subst?./,,[????????DISCUZ_CODE_34????????]lt;)"??
????????$(Q)?$(CC)?-c?$(CFLAGS)?-o?$@?[????????DISCUZ_CODE_34????????]lt;??
??
#編譯工程??
$(BUILD)/Obj/%.o?:?%.c?Makefile?|?$(BUILD)/Obj??
????????$(Q)echo?"buid?$(subst?./,,[????????DISCUZ_CODE_34????????]lt;)"??
????????$(Q)?$(CC)?-c?$(CFLAGS)?-Wa,-a,-ad,-alms=$(@:%.o=%.lst)?-o?$@?[????????DISCUZ_CODE_34????????]lt;??
??
$(BUILD)/Obj?:??
????????$(Q)mkdir?-p?$@??
????????$(Q)echo?"mkdir?$@"??
??
%.bin?:?$(BUILD)/$(TARGET).elf??
????????$(Q)?$(BIN)?[????????DISCUZ_CODE_34????????]lt;?$@??
????????$(Q)du?-h?$(BUILD)/$(TARGET).bin??
??
%.hex?:?$(BUILD)/$(TARGET).elf??
????????$(Q)?$(HEX)?[????????DISCUZ_CODE_34????????]lt;?$@??
??
#用于檢查鏈接腳本和啟動文件是否存在,不存在則報(bào)錯誤??
$(START_FILE_SOURCES):??
????????$(Q)echo?ERROR:?The?startup?file?does?not?exist?or?has?the?wrong?path?!;\??
????????exit?1??
$(LDSCRIPT):??
????????$(Q)echo?ERROR:?The?link?file?does?not?exist?or?has?the?wrong?path?!;\??
????????exit?2??
??
clean:??
????????$(RM)?-rf?$(BUILD)??
??
printf:??
????????$(Q)echo?$(info?$(LDFLAGS))??
??
??
JLinkGDBServer:??
????????$(Q)JLinkGDBServer?-select?USB?-device?$(CHIP)?\??
????????-endian?little?-if?SWD?-speed?4000?-noir?-LocalhostOnly??
??
debug:??
????????$(Q)make??
????????$(Q)echo?target?remote?localhost\:2331?>?gdb.gdb??
????????$(Q)echo?monitor?reset?>>?gdb.gdb??
????????$(Q)echo?monitor?halt?>>?gdb.gdb??
????????$(Q)echo?load?>>?gdb.gdb??
????????$(Q)echo?b?main?>>?gdb.gdb??
????????$(Q)echo?-?>>?gdb.gdb??
????????$(Q)echo?c?>>?gdb.gdb??
????????$(Q)-$(GDB)?$(BUILD)/$(TARGET).elf?--command=gdb.gdb??
????????$(Q)$(RM)?gdb.gdb??
??
download:??
????????$(Q)make??
????????$(Q)echo?"h"?>?jlink.jlink??
????????$(Q)echo?"loadfile"?$(BUILD)/$(TARGET).hex?>>?jlink.jlink??
????????$(Q)echo?"r"?>>?jlink.jlink??
????????$(Q)echo?"qc"?>>?jlink.jlink??
????????$(Q)$(JLINKEXE)?-device?$(CHIP)?-Speed?4000?-IF?SWD?-CommanderScript?jlink.jlink??
????????$(Q)$(RM)?jlink.jlink??
??
reset:??
????????$(Q)echo?"r"?>>?jlink.jlink??
????????$(Q)echo?"qc"?>>?jlink.jlink??
????????$(Q)$(JLINKEXE)?-device?$(CHIP)?-Speed?4000?-IF?SWD?-CommanderScript?jlink.jlink??
????????$(Q)$(RM)?jlink.jlink??
??
commit:??
????????$(Q)git?add?.??
????????$(Q)status='$(shell?git?status?|?grep?"git?pull")';\??
????????if?test?-n?"$status";then?echo?"Need?to?do?git?pull?!";exit?10;fi??
????????$(Q)explain='$(shell?read?-p?"Please?input?git?commit?explain:"?explain;echo?"$explain")';\??
????????if?test?-z?"$explain";then?git?commit?-m?"Daily?development?submission";?\??
????????else?git?commit?-m?"$explain";fi??
????????$(Q)git?push??
????????$(Q)git?status??
??
-include?$(wildcard?$(BUILD)/Obj/*.d)?
本文系21ic論壇網(wǎng)友791314247
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!