搜索
返回列表 发新帖本帖赏金 10.00元(功能说明)我要提问

[STM32] 教你在vscode下用stm32+makefile+gcc实现一键编译仿真下载

[复制链接]
569|15
 楼主 | 2020-12-31 23:05 | 显示全部楼层 |阅读模式
本帖最后由 791314247 于 2021-1-11 22:02 编辑

#技术资源# #有奖活动# #申请原创#
生命在于运动,技术在于折腾,你是否厌倦了在keil、iar下孜孜不倦的写代码、debug,是否玩累了在外部编辑器下写代码,然后在转到ide下进行仿真、下载等操作呢?

先附上一些我写的博文:
(arm-none-eabi-gcc + GNU make + Makefile +嵌入式单片机)环境搭建篇(linux+windows):
https://blog.csdn.net/qq_35333978/article/details/110398968
在Linux Ubnutu下安装arm-none-eabi-gcc及所必须的各种依赖包:
https://blog.csdn.net/qq_35333978/article/details/109738462


这个教程将介绍下如何在vscode下实现这些操作,真正实现一个vscode可以吃天下、实现一键编译仿真下载,而你只需要在vscode下的终端敲几个命令而已。。。
本教程以阿波罗开发板stm32f429igt6为例,先瞅瞅最终界面
547995fedd9e02b219.png
最终可以用的功能如下:
1,vscode终端下执行make指令,即可在build文件下编译出.hex .bin .elf文件,中间文件放在build/Obj/文件夹下
2,执行make clean,可清除build文件夹
3,执行make download,可一键下载hex到目标板子并让板子复位运行,相当于keil的一键下载按钮
4,执行make reset,可以让板子复位运行一下
5,执行make commit,可一键推送到你的github或者giteee远程服务器上去,但前提是你自己创建了这个工程的git
教程如下:
环境:
1,下载vscode及必要插件,令需要一个插件Cortex_debug
2,Windows下安装arm-none-eabi-gcc工具链,推荐q4版本
下载及安装教程:https://blog.csdn.net/qq_35333978/article/details/110398968
3,Windows下安装Jlink最新版驱动(V6.88a)
附件上传不上去,故分享个网盘永久链接
链接:HTTP//:pan.baidu.com/s/11YnBjWtl9L9V7YCQABC60Q
提取码:ysgp

安装、下载的教程也在上面的链接。
4,GNU make
百度网盘链接和安装教程、添加环境变量教程也在上边的链接。。。
5,git bash
这个不用说,大家都会有的吧,然后需要把vscode的终端换成git bash。百度一下,太容易了。
好了,环境就搭好了,不要嫌麻烦,现在越麻烦,你用起来越方便!
编译:
编译只需在vscode终端中执行make指令就行,如下图:
970825fede74df3eee.png
仿真:
仿真的话需要vscode下的插件cortex debug,这个教程我粘贴上我之前写的国产芯片fm33lc02x的教程,大家只要把芯片名字换成STM32F429就行
(1) vscode下载插件cortex debug插件

20201130200452854.png

(2) 创建launch.json文件

如下图所示:
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1MzMzOTc4,size_16,color_FFFFFF,t_70.jpg

然后选择Cotrex Debug即可创建好launch.json文件
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1MzMzOTc4,size_16,color_FFFFFF,t_70.jpg

(3) 配置launch.json文件

稍微按照自己的芯片修改下就好,以FM33LC026为例:
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1MzMzOTc4,size_16,color_FFFFFF,t_70.jpg
然后将厂商提供的.svd文件放到你的工程根目录即可开始仿真,可以看变量、看外设寄存器、内核寄存器等等,还可以保存你的断点等。


然后实现这一切的核心就是makefile文件,不用管,我已经帮你写好了,而且全部中文注释,各种参数也是取自stm32cube的makefile参数,放心的用,放心的学!
然后我将在附件提供一个基于阿波罗开发板stm32f429igt6的点灯例程。如果的芯片不是stm32f429,但只要你的核是arm核,本例程本makefile,通通能用!
换芯片后你需要改以下内容:
1,找到你的芯片的基于gcc的启动文件和链接脚本,一般问厂商要肯定有的,不用自己写,然后替换到根目录下的2个对应文件
590295fede56a571b3.png

2,改以下内容,是不是看起来特简单。
683875fede5cce434a.png
然后,就搞定了,具体的参数可以去stm32cube上生成一个对应内核的makefile,然后参考下就行了,其实其他核是更简单的。教程可能有点乱,后期我会在整理下。

最后附上我的整个makefile
  1. #*************************************************************************
  2. #  **
  3. #  ** File         : Makefile
  4. #  ** Abstract     : This is the introduction to the document
  5. #  ** Author       : wr
  6. #  ** mail         : 791314247@q.com
  7. #  ** Created Time : 2020年11月22日 星期日 11时58分06秒
  8. #  ** copyright    : COPYRIGHT(c) 2020
  9. #  **
  10. #  ************************************************************************/

  11. ifneq ($(V),1)
  12. Q := @
  13. else
  14. Q :=
  15. endif

  16. ################################以下项目需用户根据需要更改##########################
  17. # 输出文件的名称,默认为main(main.elf main.bin main.hex)
  18. TARGET := main

  19. #链接文件名称和所在路径
  20. LDSCRIPT := ./STM32F429IGTx_FLASH.ld

  21. #启动文件名称和所在路径
  22. START_FILE_SOURCES := ./startup_stm32f429xx.s

  23. #内核选择,FPU, FLOAT-ABI可为空
  24. CPU       := -mcpu=cortex-m4
  25. FPU       := -mfpu=fpv4-sp-d16
  26. FLOAT-ABI := -mfloat-abi=hard

  27. #系统宏定义
  28. C_DEFS    := \
  29. -DUSE_HAL_DRIVER \
  30. -DSTM32F429xx

  31. # 芯片型号,用于Jlink仿真调试、下载
  32. CHIP      := STM32F429IG

  33. # 选择优化等级:
  34. # 1. gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
  35. # 2. 在编译时,如果没有指定上面的任何优化参数,则默认为 -O0,即没有优化。
  36. # 3. 参数 -O1、-O2、-O3 中,随着数字变大,代码的优化程度也越高,不过这在某种意义上来说,也是以牺牲程序的可调试性为代价的。
  37. # 4. 参数 -Og 是在 -O1 的基础上,去掉了那些影响调试的优化,所以如果最终是为了调试程序,可以使用这个参数。不过光有这个参数也是不行的,这个参数只是告诉编译器,编译后的代码不要影响调试,但调试信息的生成还是靠 -g 参数的。
  38. # 5. 参数 -Os 是在 -O2 的基础上,去掉了那些会导致最终可执行程序增大的优化,如果想要更小的可执行程序,可选择这个参数。
  39. # 6. 参数 -Ofast 是在 -O3 的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。
  40. # 7. 如果想知道上面的优化参数具体做了哪些优化,可以使用 gcc -Q --help=optimizers 命令来查询。
  41. OPT       := -Og

  42. # 是否将debug信息编译进.elf文件,默认打开
  43. DEBUG     := 1

  44. # 输出文件夹,.hex .bin .elf放在此文件夹下,.o .d文件放在此文件的子目录Obj下(自动创建)
  45. BUILD     := ./build

  46. # 支持双系统编译,故需选当前系统,0为linux,1为windows
  47. SYS    := 1
  48. # 若指定了windows系统,则需确认编译器的路径,若安装时以默认路径安装,则正确
  49. ifeq ($(SYS), 1)
  50. GCC_PATH = "/c/Program Files (x86)/GNU Tools Arm Embedded/9 2019-q4-major/bin"
  51. JLINK_PATH = "/c/Program Files (x86)/SEGGER/JLink"
  52. endif
  53. ###################################用户修改结束###################################

  54. # 编译器定义
  55. PREFIX = arm-none-eabi-
  56. ifdef GCC_PATH
  57. SUFFIX = .exe
  58. CC      := $(GCC_PATH)/$(PREFIX)gcc$(SUFFIX)
  59. SZ      := $(GCC_PATH)/$(PREFIX)size$(SUFFIX)
  60. OBJCOPY := $(GCC_PATH)/$(PREFIX)objcopy$(SUFFIX)
  61. GDB     := $(GCC_PATH)/$(PREFIX)gdb$(SUFFIX)
  62. BIN     := $(OBJCOPY) -O binary -S
  63. HEX     := $(OBJCOPY) -O ihex
  64. else
  65. CC      := $(PREFIX)gcc
  66. SZ      := $(PREFIX)size
  67. OBJCOPY := $(PREFIX)objcopy
  68. GDB     := $(PREFIX)gdb
  69. BIN     := $(OBJCOPY) -O binary -S
  70. HEX     := $(OBJCOPY) -O ihex
  71. endif

  72. # Jlink定义,用于支持一键下载和gdb仿真
  73. ifdef JLINK_PATH
  74. SUFFIX = .exe
  75. JLINKEXE       := $(JLINK_PATH)/JLink$(SUFFIX)
  76. JLINKGDBSERVER := $(JLINK_PATH)/JLinkGDBServer$(SUFFIX)
  77. else
  78. JLINKEXE       := JLinkExe
  79. JLINKGDBSERVER := JLinkGDBServer
  80. endif


  81. #################### CFLAGS Config Start ##########################
  82. MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)

  83. #搜索所有的h文件,并输出携带-I的.h文件路径
  84. C_INCLUDES := $(addprefix -I,$(subst ./,,$(sort $(dir $(shell find ./ -type f -iname "*.h")))))

  85. #编译参数
  86. CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -fdata-sections -ffunction-sections
  87. #开关警告
  88. CFLAGS += -Wall -W -Wno-unused-parameter
  89. #标准
  90. CFLAGS += -std=c99

  91. #当开启DEBUG功能时携带DEBUG参数
  92. ifeq ($(DEBUG), 1)
  93. CFLAGS += -g -gdwarf-2
  94. endif

  95. #自动生成依赖文件
  96. CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
  97. #################### CFLAGS Config End ##########################

  98. # libraries
  99. LIBS = -lc -lm -lnosys
  100. LIBDIR =
  101. #链接指令集-specs=nosys.specs
  102. LDFLAGS = $(MCU) -T$(LDSCRIPT) -specs=nano.specs $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD)/Obj/$(TARGET).map,--cref
  103. #是否开启优化掉未使用的函数和符号
  104. LDFLAGS += -Wl,--gc-sections

  105. #制作启动文件依赖Obj,输出去掉路径的.o文件,可兼容.s和.S
  106. START_FILE_OBJ     = $(addsuffix .o, $(basename $(notdir $(START_FILE_SOURCES))))
  107. OBJECTS            = $(addprefix $(BUILD)/Obj/, $(START_FILE_OBJ))

  108. #搜索所有的c文件,制作所有的.c文件依赖Obj
  109. C_SOURCES          = $(subst ./,,$(shell find ./ -type f -iname "*.c"))
  110. OBJECTS           += $(addprefix $(BUILD)/Obj/, $(notdir $(C_SOURCES:%.c=%.o)))
  111. #PS:去掉终极目标的原始路径前缀并添加输出文件夹路径前缀(改变了依赖文件的路径前缀,需要重新指定搜索路径)

  112. #指定makefile搜索文件的路径(假如终极目标的依赖文件不携带.c文件所在的路径,
  113. #且不指定搜索路径,makefile会报错没有规则制定目标)
  114. vpath %.c $(sort $(dir $(C_SOURCES)))  #取出路径并去重和排序(以首字母为单位)
  115. vpath %.s $(dir $(START_FILE_SOURCES))
  116. vpath %.S $(dir $(START_FILE_SOURCES))


  117. #指定为伪目标跳过隐含规则搜索,提升makefile的性能,并防止make时携带的参数与实际文件重名的问题
  118. .PHONY:all clean printf JLinkGDBServer debug download reset commit

  119. all : $(BUILD)/$(TARGET).elf $(BUILD)/$(TARGET).bin $(BUILD)/$(TARGET).hex


  120. #链接所有的.o生成.elf文件
  121. $(BUILD)/$(TARGET).elf : $(OBJECTS) | $(LDSCRIPT)
  122.         $(Q)$(CC) $(LDFLAGS) -o $[url=home.php?mod=space&uid=72445]@[/url] $(OBJECTS)
  123.         $(Q)echo "make $@:"
  124.         $(Q)$(SZ) $@


  125. #编译启动文件  备用参数:#-x assembler-with-cpp
  126. $(BUILD)/Obj/$(START_FILE_OBJ) : $(START_FILE_SOURCES) Makefile | $(BUILD)/Obj
  127.         $(Q)echo "buid $(subst ./,,[        DISCUZ_CODE_34        ]lt;)"
  128.         $(Q) $(CC) -c $(CFLAGS) -o $[url=home.php?mod=space&uid=72445]@[/url] [        DISCUZ_CODE_34        ]lt;

  129. #编译工程
  130. $(BUILD)/Obj/%.o : %.c Makefile | $(BUILD)/Obj
  131.         $(Q)echo "buid $(subst ./,,[        DISCUZ_CODE_34        ]lt;)"
  132.         $(Q) $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(@:%.o=%.lst) -o $[url=home.php?mod=space&uid=72445]@[/url] [        DISCUZ_CODE_34        ]lt;

  133. $(BUILD)/Obj :
  134.         $(Q)mkdir -p $@
  135.         $(Q)echo "mkdir $@"

  136. %.bin : $(BUILD)/$(TARGET).elf
  137.         $(Q) $(BIN) [        DISCUZ_CODE_34        ]lt; $@
  138.         $(Q)du -h $(BUILD)/$(TARGET).bin

  139. %.hex : $(BUILD)/$(TARGET).elf
  140.         $(Q) $(HEX) [        DISCUZ_CODE_34        ]lt; $@

  141. #用于检查链接脚本和启动文件是否存在,不存在则报错误
  142. $(START_FILE_SOURCES):
  143.         $(Q)echo ERROR: The startup file does not exist or has the wrong path !;\
  144.         exit 1
  145. $(LDSCRIPT):
  146.         $(Q)echo ERROR: The link file does not exist or has the wrong path !;\
  147.         exit 2

  148. clean:
  149.         $(RM) -rf $(BUILD)

  150. printf:
  151.         $(Q)echo $(info $(LDFLAGS))


  152. JLinkGDBServer:
  153.         $(Q)JLinkGDBServer -select USB -device $(CHIP) \
  154.         -endian little -if SWD -speed 4000 -noir -LocalhostOnly

  155. debug:
  156.         $(Q)make
  157.         $(Q)echo target remote localhost\:2331 > gdb.gdb
  158.         $(Q)echo monitor reset >> gdb.gdb
  159.         $(Q)echo monitor halt >> gdb.gdb
  160.         $(Q)echo load >> gdb.gdb
  161.         $(Q)echo b main >> gdb.gdb
  162.         $(Q)echo - >> gdb.gdb
  163.         $(Q)echo c >> gdb.gdb
  164.         $(Q)-$(GDB) $(BUILD)/$(TARGET).elf --command=gdb.gdb
  165.         $(Q)$(RM) gdb.gdb

  166. download:
  167.         $(Q)make
  168.         $(Q)echo "h" > jlink.jlink
  169.         $(Q)echo "loadfile" $(BUILD)/$(TARGET).hex >> jlink.jlink
  170.         $(Q)echo "r" >> jlink.jlink
  171.         $(Q)echo "qc" >> jlink.jlink
  172.         $(Q)$(JLINKEXE) -device $(CHIP) -Speed 4000 -IF SWD -CommanderScript jlink.jlink
  173.         $(Q)$(RM) jlink.jlink

  174. reset:
  175.         $(Q)echo "r" >> jlink.jlink
  176.         $(Q)echo "qc" >> jlink.jlink
  177.         $(Q)$(JLINKEXE) -device $(CHIP) -Speed 4000 -IF SWD -CommanderScript jlink.jlink
  178.         $(Q)$(RM) jlink.jlink

  179. commit:
  180.         $(Q)git add .
  181.         $(Q)status='$(shell git status | grep "git pull")';\
  182.         if test -n "$status";then echo "Need to do git pull !";exit 10;fi
  183.         $(Q)explain='$(shell read -p "Please input git commit explain:" explain;echo "$explain")';\
  184.         if test -z "$explain";then git commit -m "Daily development submission"; \
  185.         else git commit -m "$explain";fi
  186.         $(Q)git push
  187.         $(Q)git status

  188. -include $(wildcard $(BUILD)/Obj/*.d)

复制代码




  








   

stm32f4x_gcc.zip

1.22 MB, 下载次数: 5

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2021-01-06
理由:恭喜通过原创文章审核!请多多加油哦!

评论

xyz549040622 2021-1-2 21:55 回复TA
穿个裤子给你楼主不要生气 
| 2021-1-2 11:57 | 显示全部楼层
不错,辛苦楼主了
改天学一下cmake

使用特权

评论回复
| 2021-1-2 21:55 | 显示全部楼层
穿个裤子给你,楼主不要生气。

使用特权

评论回复
| 2021-1-3 12:01 | 显示全部楼层
有点东西

使用特权

评论回复
| 2021-1-3 13:41 | 显示全部楼层
问下有8051的吗?

使用特权

评论回复

评论

wsnsyy 2021-1-5 10:34 回复TA
可以安装一个插件Keil Assistant 
| 2021-1-4 14:31 | 显示全部楼层
有没有研究codeblocks+gcc的,我用codeblocks+gcc就是仿真是个问题

使用特权

评论回复

评论

desig 2021-1-6 01:17 回复TA
@fcccc :不科学啊,codeblocks打开挺快的。我就是么有找到在codeblocks怎么调试。其他么有问题。 
fcccc 2021-1-4 19:58 回复TA
codeblocks打开太慢了,不知道是不是win平台的锅,linux下面没试 
| 2021-1-5 15:38 | 显示全部楼层
很多公司使用内网,无法下载插件,有些插件还得科学上网。最终还是用回keil...

使用特权

评论回复

评论

740071911 2021-1-16 09:41 回复TA
都是玩玩,最后还是。。。 
 楼主 | 2021-1-12 08:36 | 显示全部楼层
caizhiwei 发表于 2021-1-2 11:57
不错,辛苦楼主了
改天学一下cmake

学一下makefile多有意思,不知能用来编译还能用来执行脚本实现各种意想不到的的操作呢

使用特权

评论回复
 楼主 | 2021-1-12 08:37 | 显示全部楼层
xyz549040622 发表于 2021-1-2 21:55
穿个裤子给你,楼主不要生气。

谢谢,我冲动了

使用特权

评论回复
 楼主 | 2021-1-12 08:39 | 显示全部楼层
linguanghua 发表于 2021-1-5 15:38
很多公司使用内网,无法下载插件,有些插件还得科学上网。最终还是用回keil... ...

其实不需要插件的,甚至vscode都不需要的,只要能运行makefile的环境都可以,仿真可以用arm-eabi-gcc-gdb,只不过入门难,不过学会了以后走linux也容易的多

使用特权

评论回复
| 2021-1-12 16:59 | 显示全部楼层
很不错,谢谢分享

使用特权

评论回复
扫描二维码,随时随地手机跟帖
返回列表 发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

在线客服 快速回复 返回顶部 返回列表