GD32F307VC+WIN10+VSCODE+GCC+JLINK环境build

news/2024/3/28 17:31:28/文章来源:https://blog.csdn.net/man9953211/article/details/127239036

为了构建Cortex M系列单片机免费开源的开发环境,网络上了解来看VSCODE+GCC+JLINK是一套比较高效的组合方式,下面记录环境搭建的流程。

我这边的PC环境为 WIN10专业版64bit。

工具准备

1. arm-none-eabi-gcc下载及安装

官网下载链接:
Downloads | GNU Arm Embedded Toolchain Downloads – Arm DeveloperDownload the GNU Embedded Toolchain for ARM, an open-source suite of tools for C, C++, and Assembly programming for 32-bit ARM Cortex-A, ARM Cortex-M and Cortex-R familieshttps://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads下载最新版本。

下载完成后点击.exe直接一直点下一步就好,千万要记得在最后一步的时候将add path打上勾,默认是不打勾的。

2. Gnu make工具 --- MinGW下载及安装

官网下载很慢,推荐到下面镜像站点下载最新版本即可

/明威指数 (1f0.de)http://files.1f0.de/mingw/下载好之后解压到D盘根目录,然后将bin文件路径加到环境变量。

设置 -> 系统 -> 关于 -> 高级系统设置

将MinGW路径加入到Path中。

 重启后即可生效。

打开cmd,输入gcc -v验证是否成功即可。

3. GIT Bash安装(推荐)

这里使用git bash终端(unix)替换dos 终端,自行百度安装GIT即可。

将vscode的终端使用git bash代替cmd,验证gcc -v成功的结果如下:

4. JLINK安装

官网下载安装JLINK最新版本即可。

GD32F307 JLINK已经默认支持,如果是其他一些国内的mcu,需要去mcu官网下载对应的JLINK支持文件。

这部分可自行百度解决。

5. vscode下载安装

官网下载安装。

vscode需要使用到的插件如下:

1. 中文插件。

可能有人看着英文界面比较难受,下面介绍如何设置中文环境。现在中文环境也是通过安装扩展来实现,如下图,先点击侧边栏的扩展,然后在搜索框中输入language,选择“中文(简体)”进行安装,完成后重启VSCode即可。

2. C/C++环境插件

3. Cortex debug插件

4. Code runner仿真插件

插件可以在搜索栏输入关键字搜索安装。

至此,环境工具安装完毕。

6. MDK5官方版本(不要使用破解版)

官网下载并安装MDK5,这里是为了生成芯片用于仿真的SVD文件,如芯片官网有SVD文件下载,则不需要这一步。

编译准备

1. 代码准备

这里以GD32F307 demo板的LED闪烁例程来做演示,参考官方下载的GD32F30x_Firmware_Library_V2.1.4.rar目录tree,初步扩展如下:

因官网下载的代码printf为MDK环境使用,使用GNU gcc编译会出错,libs中重写了gcc所需的printf部分函数

2. makefile

makefile参考下面范本修改芯片名称即可。


#当由用户传入的参数V等于1时,条件为真,输出编译信息,当V不等于1时禁止信息
ifneq ($(V),1)
Q := @
else
Q :=
endif################################以下项目需用户根据需要更改##########################
# 输出文件的名称,默认为main(main.elf main.bin main.hex)
TARGET := main#链接文件名称和所在路径
LDSCRIPT := \
./StartUp/gd32f307vctb_flash.ld#启动文件名称和所在路径
START_FILE_SOURCES := \
./StartUp/startup_gd32f307vctb.s#内核选择,FPU, FLOAT-ABI可为空
CPU       := -mcpu=cortex-m4
FPU       :=
FLOAT-ABI :=#系统宏定义
C_DEFS    := \
-DGD32F30X_HD \
-DUSE_FULL_ASSERT \
-D_DLIB_FILE_DESCRIPTOR# 芯片型号,用于Jlink仿真调试、下载
CHIP      := GD32F307VC# 选择优化等级:
# 1. gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
# 2. 在编译时,如果没有指定上面的任何优化参数,则默认为 -O0,即没有优化。
# 3. 参数 -O1、-O2、-O3 中,随着数字变大,代码的优化程度也越高,不过这在某种意义上来说,也是以牺牲程序的可调试性为代价的。
# 4. 参数 -Og 是在 -O1 的基础上,去掉了那些影响调试的优化,所以如果最终是为了调试程序,可以使用这个参数。不过光有这个参数也是不行的,这个参数只是告诉编译器,编译后的代码不要影响调试,但调试信息的生成还是靠 -g 参数的。
# 5. 参数 -Os 是在 -O2 的基础上,去掉了那些会导致最终可执行程序增大的优化,如果想要更小的可执行程序,可选择这个参数。
# 6. 参数 -Ofast 是在 -O3 的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。
# 7. 如果想知道上面的优化参数具体做了哪些优化,可以使用 gcc -Q --help=optimizers 命令来查询,比如下面是查询 -O3 参数开启了哪些优化:
OPT       := -Og# 是否将debug信息编译进.elf文件,默认打开
DEBUG     := 1# 输出文件夹,.hex .bin .elf放在此文件夹下,.o .d文件放在此文件的子目录Obj下(自动创建)
BUILD     := ./build
###################################用户修改结束#################################### 以下与系统相关,用于支持JLink下载和仿真
# linux 执行make download的时候不用带参数,windows下需要带SYS=1,用以支持Jlink
ifneq ($(SYS), 1)
JLINKEXE       := JLinkExe
JLINKGDBSERVER := JLinkGDBServer
else
JLINKEXE       := JLink.exe
JLINKGDBSERVER := JLinkGDBServer.exe
endif# 编译器定义
CC      := arm-none-eabi-gcc
SZ      := arm-none-eabi-size
OBJCOPY := arm-none-eabi-objcopy
GDB     := arm-none-eabi-gdb
BIN     := $(OBJCOPY) -O binary -S
HEX     := $(OBJCOPY) -O ihex#################### CFLAGS Config Start ##########################
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)#搜索所有的h文件,并输出携带-I的.h文件路径
C_INCLUDES := $(addprefix -I,$(sort $(dir $(shell find ./ -type f -iname "*.h"))))#编译参数
CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -fdata-sections -ffunction-sections
#开关警告
CFLAGS += -Wall #-W 
#标准
CFLAGS += -std=c99#当开启DEBUG功能时携带DEBUG参数
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
#LDFLAGS = $(MCU) -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD)/Obj/$(TARGET).map,--cref
#是否开启优化掉未使用的函数和符号
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          = $(shell find ./ -type f -iname "*.c")
OBJECTS           += $(addprefix $(BUILD)/Obj/,$(notdir $(C_SOURCES:%.c=%.o)))
#PS:去掉终极目标的原始路径前缀并添加输出文件夹路径前缀(改变了依赖文件的路径前缀,需要重新指定搜索路径)#指定makefile搜索文件的路径(假如终极目标的依赖文件不携带.c文件所在的路径,
#且不指定搜索路径,makefile会报错没有规则制定目标)
vpath %.c $(sort $(dir $(C_SOURCES)))  #取出路径并去重和排序(以首字母为单位)
vpath %.s $(dir $(START_FILE_SOURCES))
vpath %.S $(dir $(START_FILE_SOURCES))#指定为伪目标跳过隐含规则搜索,提升makefile的性能,并防止make时携带的参数与实际文件重名的问题
.PHONY:all cleanAll clean printf JLinkGDBServer debug download commitall : $(BUILD)/Obj $(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) $@#编译启动文件  备用参数:#-x assembler-with-cpp
$(BUILD)/Obj/$(START_FILE_OBJ) : $(START_FILE_SOURCES) Makefile$(Q) $(CC) -c $(CFLAGS) -x assembler-with-cpp -o $@ $<$(Q)echo "buid $(notdir $<)"#编译工程 备用参数:#-Wa,-a,-ad,-alms=$(BUILD_DIR)/Obj/$(notdir $(<:.c=.lst))
$(BUILD)/Obj/%.o : %.c Makefile$(Q) $(CC) -c $(CFLAGS) -o $@ $< $(Q)echo "buid $(notdir $<)"$(BUILD)/Obj :$(Q)mkdir -p $(BUILD)/Obj$(Q)echo "mkdir $(BUILD)/Obj"%.bin : $(BUILD)/$(TARGET).elf$(Q) $(BIN) $< $@%.hex : $(BUILD)/$(TARGET).elf$(Q) $(HEX) $< $@#用于检查链接脚本和启动文件是否存在,不存在则报错误
$(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 2cleanAll: clean$(Q)$(RM) -r build$(Q)echo "clean all *.elf *.hex *.bin";clean:$(Q)$(RM) $(shell find ./ -type f -iname "*.o")$(Q)$(RM) $(shell find ./ -type f -iname "*.d")$(Q)$(RM) $(shell find ./ -type f -iname "*.d.*")$(Q)$(RM) $(shell find ./ -type f -iname "*.map")$(Q)$(RM) $(shell find ./ -type f -iname "*.gdb")$(Q)echo "clean all *.o *.d *.map";printf:$(Q)echo $(info $(LDFLAGS))JLinkGDBServer:$(Q)JLinkGDBServer -select USB -device $(CHIP) \-endian little -if SWD -speed 4000 -noir -LocalhostOnlydebug:$(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.gdbdownload:$(Q)make$(Q)echo "h" > jlink.jlink$(Q)echo "loadfile" $(BUILD)/$(TARGET).bin >> 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.jlinkcommit:$(Q)git add .$(Q)echo read -p \"Please input git commit explain:\" explain > git.so$(Q)echo if test -z \"\$$explain\"\; then explain=\"Daily development submission\"\; fi >> git.so$(Q)echo echo \$$explain >> git.so$(Q)echo git commit -m \"'$$'explain\" >> git.so$(Q)bash ./git.so$(Q)$(RM) git.so$(Q)git pushinclude $(wildcard $(BUILD)/Obj/*.d)

使用方法:
1,根目录下执行make指令,即可编译出.hex .bin .elf文件
2,执行make clean,可清除.o .d文件
3,执行make cleanAll,可清除.o .d .hex .bin .elf文件
4,执行make download,可一键下载hex到目标板子并让板子复位运行,相当于keil的一键下载按钮(推荐使用JFLASH烧写)
5,执行make commit,可一键推送到你的github或者giteee远程服务器上去,但前提是你自己创建了这个工程的git

至此,在vscode的终端中输入下面指令即可编译:

vscode调试仿真

1. 准备VSD文件

安装好MDK5后,双击从gd官网下载的pack包,可以从下面路径得到解开的VSD文件。

2. vscode已经安装cortex debug插件

3. 创建launch.json文件

如下图所示:

如下图所示:

 配置launch.json文件,修改下面红色粗体部分。

    "version": "0.2.0",

    "configurations": [

        {

            "name": "Cortex Debug",

            "cwd": "${workspaceFolder}",

            "executable": "${workspaceFolder}/build/main.elf",

            "request": "launch",

            "type": "cortex-debug",

            "runToEntryPoint": "main",

            "servertype": "jlink",

            "device": "GD32F307VC",

            "svdFile": "${workspaceFolder}/GD32F30x_HD.svd"

        }

    ]

保存重启vscode。

至此即可在vscode中使用JLINK进行调试仿真了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_398862.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++数据结构:数组和向量

线性表&#xff1a; 在数据元素的非空有限集中 存在唯一的一个被叫做“第一个”的数据元素存在唯一的一个被叫做“最后一个”的数据元素除第一个之外&#xff0c;集合中的每个数据元素均只有一个前驱除最后一个之外&#xff0c;每个集合元素均只有一个后继数据结构中线性结构指…

文字识别检测入门(1)

CTPN 优点&#xff1a;对水平文字检测效果超级好 缺点&#xff1a;对扭曲的文字不好 RRPN 在faster的基础上改进 RPN改为RRPN ROI pooling改进为RROI pooling 能解决旋转&#xff0c;但是解决不了弯曲的曲面问题 EAST Anchor free 特征合并&#xff0c;检测不同尺度文本 检测各…

刷爆leetcode第三期 0007~0010

刷爆leetcode第三期 0007~0010 题目一 反转链表解法一解法二题目二 链表的中间节点题目三 链表的倒数第K个节点题目四 合并两个有序链表题目一 反转链表 解法一 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a…

python与人工智能:线性回归和逻辑回归

线性回归 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法&#xff0c;运用 十分广泛。梯度下降&#xff1f; 梯度下降法的基本思想可以类比为一个下山的过程。 假设这样一个场景&#xff1a;一个人被困在山上&a…

零拷贝总结

数据交互模式 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqLJVb5U-1665401648551)(en-resource://database/1074:1)] 读数据过程&#xff1a; 应用程序要读取磁盘数据&#xff0c;调用 read()函数从而实现用户态切换内核态&#xff0c;这是第 …

论文/机器学习笔记:SENet (Squeeze-and-Excitation Networks)

Image 2017 挑战赛夺冠paper 1 motivation 希望显式地建模特征通道&#xff08;channel&#xff09;之间的相互依赖关系 通过学习的方式来自动获取到每个特征通道的重要程度依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征 2 模型 给定一个输入 x&#xff…

利用phpstudy导入mysql文件

1.创建mysql文件 mysql 常用命令&#xff1a; 打开mysql: mysql -u root -p 查看数据库&#xff1a; show databases; 创建 数据库: create database baseName (数据库名称) 使用数据库&#xff1a; use baseName(数据库名称) 显示表&#xff1a;show tables; 创建表&#xff…

C#【高级篇】 IntPtr是什么?怎么用?

C#学习汇总 - 总目录 C#【高级篇】 IntPtr是什么&#xff1f;怎么用&#xff1f;前言一、IntPtr&#xff08;IntPointer&#xff09;的由来二、IntPtr&#xff08;属于结构体&#xff09;的说明三、IntPtr的使用示例1、int类型与IntPtr类型之间的转换2、string类型与IntPtr之间…

Java collection集合的体系特点

Java collection集合的体系特点 集合类体系结构 collection单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。 Map双列集合&#xff0c;每个元素包含两个值&#xff08;键值对&#xff09;。 collection集合体系&#xff08;常见&#xff09; colle…

位段是什么玩意?你听说过吗??

当我们学完结构体之后&#xff0c;我们就要好好学学结构体实现位段的能力&#xff01;&#xff01;&#xff01; 目录 一、位段是什么&#xff1f; 二、位段的内存分配 三、位段的跨平台问题 总结 一、位段是什么&#xff1f; 位段的声明和结构体大体相同&#xff0c;但是有两…

【Unity_AssetBundle】(二)AB包资源打包、Asset Bundle Browser工具的使用

1.Asset Bundle Browser包安装 Asset Bundle Browser是AB包打包工具较底版本Unity编辑器&#xff1a; Windows——>Package Mannger——>搜索Asset Bundle Browser进行下载导入即可 较高版本Unity编辑器&#xff1a; 高版本Unity在Addressables功能中封装了AB包功能 安…

Telnet、DHCP、静态路由、等价路由、环回接口、浮动静态路由详解

文章目录前言一、Telnet二、DHCP----动态主机配置协议手工配置缺陷报文类型DHCP租期地址池DHCP中继代理路由信息来源直连路由静态路由优先级数据流量是双向的静态路由的扩展配置等价路由环回接口手工汇总路由黑洞缺省路由空接口路由浮动静态路由前言 一、Telnet Telnet是位于…

【数据结构】 归并排序、 基数排序

目录 一、什么是归并排序&#xff1f; 二、归并排序 三、什么是基数排序&#xff1f; 四、基数排序 五、各种排序的比较 一、什么是归并排序&#xff1f; 归并排序是建立在归并操作上的一种有效&#xff0c;稳定的排序算法。是将已有序的子序列合并&#xff0c;得到完全有…

09-Pawn类 UE4 C++

1.首先创建一个C的Pawn类 右键点击Public&#xff0c;选择新建C类 选择Pawn&#xff0c;然后点击下一步 命名后&#xff0c;点击创建 创建完毕&#xff0c;双击打开MyPawn 2.在MyPawn.h中添加如下代码&#xff1a; UPROPERTY(EditAnywhere) class UStaticMeshComponent* Mes…

SpringCloud-31-Spring Cloud Config微服务与配置文件解耦

11.8 微服务与配置文件解耦 我们可以将之前的子模块中的配置提取出来&#xff0c;托管到gitee上统一管理&#xff0c;这样运维人员维护配置文件就不变动子模块了&#xff0c;实现了模块与配置的解耦。 下面用例子来解释下这种做法的好处 在基础工程spring-cloud-microservice…

热血江湖服务端架设开服搭建教程

热血江湖服务端架设开服搭建教程 玩网游比较多的小伙伴&#xff0c;相信对热血江湖这款游戏也不陌生&#xff0c;摆脱了传统武侠游戏阴暗血腥的游戏风格&#xff0c;提倡一种“明朗而愉快的武侠”精神。画面上即不会太随意又不会过于沉重&#xff0c;画面干净清新。活泼可爱的…

ORACLE新增数据库(用户),使用navicate

oracle新增数据库并不像mysql直接指令就行&#xff0c;百度一圈都是用Oracle Database Configuration Assistant的&#xff0c;其实navicate就直接可以新建&#xff0c;以下是新建方法&#xff1a; 1.连接数据库 2.新建表空间 点击navicate上方工具栏中"其它"&…

何为功能平价?特斯拉「抛弃」多传感融合,背后有哪些门道

技术与成本&#xff0c;永远是博弈的两方。 当大部分车企都在寻求通过增加更多、更高性能的传感器&#xff08;也就是通常所说的多传感融合技术&#xff09;来强化智能驾驶功能可靠性和拓展性的大背景下&#xff0c;特斯拉依然我行我素&#xff0c;继续沿着纯视觉感知的路线前…

盘点一个Python列表(元素多样)处理的实战题目(使用正则表达式也可以实现)

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【凡人不烦人】问了一个Python列表处理的问题,提问截图如下:下面是他的部分数据: lst = [(问答题)(2) 假设镀锌钢管, http://admintk.sc.zzstep.com/UpLoadImage/2019-10-10/a84f340e-6c67-42b1-8eae-3dc14281…

队列的操作实验(数据结构)

队列的操作实验&#xff08;数据结构&#xff09; 一、实验目的 1&#xff0e;掌握队列存储结构的表示和实现方法。 2&#xff0e;掌握队列的入队和出队等基本操作的算法实现。 3&#xff0e;了解队列在解决实际问题中的简单应用。 二、实验内容 1&#xff0e;建立顺序循环队列…