電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 4842|回復(fù): 4
收起左側(cè)

在vscode下用stm32+makefile+gcc實(shí)現(xiàn)編譯仿真下載一條龍服務(wù)

[復(fù)制鏈接]

131

主題

512

帖子

1666

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1666
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2021-4-3 11:56:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
生命在于運(yùn)動(dòng),技術(shù)在于折騰,你是否厭倦了在keil、iar下孜孜不倦的寫(xiě)代碼、debug,是否玩累了在外部編輯器下寫(xiě)代碼,然后在轉(zhuǎn)到ide下進(jìn)行仿真、下載等操作呢?

這個(gè)教程將介紹下如何在vscode下實(shí)現(xiàn)這些操作,真正實(shí)現(xiàn)一個(gè)vscode可以吃天、實(shí)現(xiàn)編譯仿真下載一條龍服務(wù),而你只需要在vscode下的終端敲幾個(gè)命令而已。。。

本教程以阿波羅開(kāi)發(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)建了這個(gè)工程的git

教程如下:

環(huán)境:
1,下載vscode及必要插件,令需要一個(gè)插件Cortex_debug

2,Windows下安裝arm-none-eabi-gcc工具鏈,推薦q4版本
下載及安裝教程:https://blog.csdn.net/qq_35333978/article/details/110398968

3,Windows下安裝Jlink最新版驅(qū)動(dòng)(V6.88a)
附件上傳不上去,故分享個(gè)網(wǎng)盤(pán)永久鏈接
鏈接:加HTTP加斜杠pan.baidu.com/s/11YnBjWtl9L9V7YCQABC60Q
提取碼:ysgp安裝、下載的教程也在上面的鏈接。

4,GNU make
百度網(wǎng)盤(pán)鏈接和安裝教程、添加環(huán)境變量教程也在上邊的鏈接。。。

5,git bash

這個(gè)不用說(shuō),大家都會(huì)有的吧,然后需要把vscode的終端換成git bash。百度一下,太容易了。

好了,環(huán)境就搭好了,不要嫌麻煩,現(xiàn)在越麻煩,你用起來(lái)越方便!

編譯:編譯只需在vscode終端中執(zhí)行make指令就行,如下圖:



仿真:仿真的話需要vscode下的插件cortex debug,這個(gè)教程我粘貼上我之前寫(xiě)的國(guó)產(chǎn)芯片fm33lc02x的教程,大家只要把芯片名字換成STM32F429就行

(1) vscode下載插件cortex debug插件

(2) 創(chuàng)建launch.json文件

如下圖所示:

然后選擇Cotrex Debug即可創(chuàng)建好launch.json文件


(3) 配置launch.json文件稍微按照自己的芯片修改下就好,以FM33LC026為例:


然后將廠商提供的.svd文件放到你的工程根目錄即可開(kāi)始仿真,可以看變量、看外設(shè)寄存器、內(nèi)核寄存器等等,還可以保存你的斷點(diǎn)等。
然后實(shí)現(xiàn)這一切的核心就是makefile文件,不用管,我已經(jīng)幫你寫(xiě)好了,而且全部中文注釋,各種參數(shù)也是取自stm32cube的makefile參數(shù),放心的用,放心的學(xué)!
然后我將在附件提供一個(gè)基于阿波羅開(kāi)發(fā)板stm32f429igt6的點(diǎn)燈例程。如果的芯片不是stm32f429,但只要你的核是arm核,本例程本makefile,通通能用!
換芯片后你需要改以下內(nèi)容:
1,找到你的芯片的基于gcc的啟動(dòng)文件和鏈接腳本,一般問(wèn)廠商要肯定有的,不用自己寫(xiě),然后替換到根目錄下的2個(gè)對(duì)應(yīng)文件


2,改以下內(nèi)容,是不是看起來(lái)特簡(jiǎn)單。


然后,就搞定了,具體的參數(shù)可以去stm32cube上生成一個(gè)對(duì)應(yīng)內(nèi)核的makefile,然后參考下就行了,其實(shí)其他核是更簡(jiǎn)單的。教程可能有點(diǎn)亂,后期我會(huì)在整理下。

最后附上我的整個(gè)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
  • #啟動(dòng)文件名稱和所在路徑
  • 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
  • # 芯片型號(hào),用于Jlink仿真調(diào)試、下載
  • CHIP      := STM32F429IG
  • # 選擇優(yōu)化等級(jí):
  • # 1. gcc中指定優(yōu)化級(jí)別的參數(shù)有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
  • # 2. 在編譯時(shí),如果沒(méi)有指定上面的任何優(yōu)化參數(shù),則默認(rèn)為 -O0,即沒(méi)有優(yōu)化。
  • # 3. 參數(shù) -O1、-O2、-O3 中,隨著數(shù)字變大,代碼的優(yōu)化程度也越高,不過(guò)這在某種意義上來(lái)說(shuō),也是以犧牲程序的可調(diào)試性為代價(jià)的。
  • # 4. 參數(shù) -Og 是在 -O1 的基礎(chǔ)上,去掉了那些影響調(diào)試的優(yōu)化,所以如果最終是為了調(diào)試程序,可以使用這個(gè)參數(shù)。不過(guò)光有這個(gè)參數(shù)也是不行的,這個(gè)參數(shù)只是告訴編譯器,編譯后的代碼不要影響調(diào)試,但調(diào)試信息的生成還是靠 -g 參數(shù)的。
  • # 5. 參數(shù) -Os 是在 -O2 的基礎(chǔ)上,去掉了那些會(huì)導(dǎo)致最終可執(zhí)行程序增大的優(yōu)化,如果想要更小的可執(zhí)行程序,可選擇這個(gè)參數(shù)。
  • # 6. 參數(shù) -Ofast 是在 -O3 的基礎(chǔ)上,添加了一些非常規(guī)優(yōu)化,這些優(yōu)化是通過(guò)打破一些國(guó)際標(biāo)準(zhǔn)(比如一些數(shù)學(xué)函數(shù)的實(shí)現(xiàn)標(biāo)準(zhǔn))來(lái)實(shí)現(xiàn)的,所以一般不推薦使用該參數(shù)。
  • # 7. 如果想知道上面的優(yōu)化參數(shù)具體做了哪些優(yōu)化,可以使用 gcc -Q --help=optimizers 命令來(lái)查詢。
  • OPT       := -Og
  • # 是否將debug信息編譯進(jìn).elf文件,默認(rèn)打開(kāi)
  • DEBUG     := 1
  • # 輸出文件夾,.hex .bin .elf放在此文件夾下,.o .d文件放在此文件的子目錄Obj下(自動(dòng)創(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
  • #開(kāi)關(guān)警告
  • CFLAGS += -Wall -W -Wno-unused-parameter
  • #標(biāo)準(zhǔn)
  • CFLAGS += -std=c99
  • #當(dāng)開(kāi)啟DEBUG功能時(shí)攜帶DEBUG參數(shù)
  • ifeq ($(DEBUG), 1)
  • CFLAGS += -g -gdwaRF-2
  • endif
  • #自動(dòng)生成依賴文件
  • 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
  • #是否開(kāi)啟優(yōu)化掉未使用的函數(shù)和符號(hào)
  • LDFLAGS += -Wl,--gc-sections
  • #制作啟動(dòng)文件依賴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會(huì)報(bào)錯(cuò)沒(méi)有規(guī)則制定目標(biāo))
  • vpath %.c $(sort $(dir $(C_SOURCES)))  #取出路徑并去重和排序(以首字母為單位)
  • vpath %.s $(dir $(START_FILE_SOURCES))
  • vpath %.S $(dir $(START_FILE_SOURCES))
  • #指定為偽目標(biāo)跳過(guò)隱含規(guī)則搜索,提升makefile的性能,并防止make時(shí)攜帶的參數(shù)與實(shí)際文件重名的問(wèn)題
  • .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 $@ $(OBJECTS)
  •         $(Q)echo "make $@:"
  •         $(Q)$(SZ) $@
  • #編譯啟動(dòng)文件  備用參數(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; $@
  • #用于檢查鏈接腳本和啟動(dòng)文件是否存在,不存在則報(bào)錯(cuò)誤
  • $(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
  • <div>-include $(wildcard $(BUILD)/Obj/*                                       </div><div>
  • </div>


[color=rgb(51, 102, 153) !important]復(fù)制代碼
















131

主題

512

帖子

1666

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1666
沙發(fā)
發(fā)表于 2021-4-3 11:56:41 | 只看該作者
需要做PCB線路板的可以聯(lián)系我

13651479995
lyl

1

主題

1119

帖子

3525

積分

四級(jí)會(huì)員

Rank: 4

積分
3525
板凳
發(fā)表于 2021-4-30 08:34:37 | 只看該作者
資料很好,學(xué)習(xí)學(xué)習(xí)

3

主題

2721

帖子

3052

積分

四級(jí)會(huì)員

Rank: 4

積分
3052
地板
發(fā)表于 2021-6-4 11:37:12 | 只看該作者
1111111111111111111111111

1

主題

12

帖子

31

積分

一級(jí)會(huì)員

Rank: 1

積分
31
5#
發(fā)表于 2021-6-16 17:38:48 | 只看該作者
熱線:134-3063-6619,QQ:490504602【【高價(jià)回收ST品牌STM32F103RET6 !!.】】

【【 ST品牌 STM32F103RET6實(shí)力回收!!】】
▲大量回收工廠電子IC,整廠回收,電子IC收購(gòu)
大量回收.原裝高價(jià)收購(gòu)!進(jìn)口電子IC優(yōu)勢(shì)收購(gòu)
主要回收品牌有ATMEL、ST、TI、FREESCALE、MICROCHIP、AD、NXP等知名品牌電子IC
單片機(jī)ic實(shí)力回收,我司專業(yè)十五年收購(gòu),豐富的回收經(jīng)驗(yàn),讓新老客戶信賴,現(xiàn)大量收購(gòu)電子芯片,單片機(jī)ic回收,單片機(jī)ic收購(gòu),長(zhǎng)期回收單片機(jī)ic,
回收ST系列:
STM32F101C6T6A、STM32F101C8T6、STM32F101CBT6、STM32F101R8T6、STM32F101RBT6、STM32F101RCT6、STM32F101RDT6、
STM32F101VBT6、STM32F103C8T6、STM32F103CBT6、STM32F103R8T6、STM32F103RBT6、STM32F103RCT6、STM32F103VCT6、STM32F103VET6、

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表