搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板
STM32F407-GCC-Template
Arm-none-eabi-gcc + Makefile+OpenOCD+CMSIS-DAP+Vscode工程模板
一、本次环境搭建所用的软硬件
1)Windows or Linux (本文以Windows为主)
2)JLink、Daplink、Wch-Link烧录器
3)GNU Arm Embedded Toolchain交叉编译器
4)Mingw-w64 GCC for Windows 64
5)Debug 调试工具 openocd
6)Visual Studio Code
二、软件安装配置
-
GNU Arm Embedded Toolchain交叉编译器
进入arm开发者官网,往下滑动选择下载解压可用的ZIP压缩包文件
下载链接: Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer

将下载好的压缩包文件解压在gcc-arm-none-eabi”文件夹中,并记住文件内“bin”文件的路径,后续需添加到系统环境变量Path中。

添加完环境变量后,进行测试,检测是否安装好。


-
安装Mingw-w64 GCC
点击链接进入到SourceForge官网,往下翻可以找到很多版本的下载链接,选择红色框内型号即可,不同前后缀的具体差异请参考:
MinGW gcc下载链接及sjlj、dwarf、seh异同以及gcc安装_AMDDMA的博客-CSDN博客_seh和sjlj
下载链接:
MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net

同样,将下载好的文件解压到“gcc-arm-none-eabi”文件夹下,记住目录下的“bin”文件路径

进入“bin”文件内找到“mingw32-make”应用程序文件,复制一份并重命名为“make”。这么做有利于在命令行执行make指令,而不是输入mingw32-make。

添加完环境变量后,进行测试,检测是否安装好。


3. 安装调试软件Download pre-built OpenOCD for Windows
默认安装Vscode,安装过程比较简单,参考其他文章。有了以上三个软件的支持,已经可以在VScode中编译并生成bin文件和hex文件了,但众所周知,程序员最大的工作是Debug,那就免不了需要一款调试软件了。
Debug常用的硬件有STLink、JLink,WCH-Link,DapLink.
Download pre-built OpenOCD for Windows下载链接:OpenOCD for Windows

同样将下载好的压缩包解压至“OpenOCD-20231002-0.12.0”,记住文件内“bin”文件的路径。

添加完环境变量后,进行测试,检测是否安装好。


综上所述,基本的软件环境已经配置好。
三、STM32-GCC-Template工程配置
-
工程结构
STM32-GCC-Template 使用的标准固件库开发,当然你可以使用HAL开发(这个不重要,有库就行了)

- ApplicationApplication/incApplication/src- BspLibrariesBspLibraries/incBspLibraries/src- FwlibLibrariesFwlibLibraries/CMSIS/IncludeFwlibLibraries/incFwlibLibraries/src- KernelKernel/incKernel/src- SystemLibrariesSystemLibraries/incSystemLibraries/src- Build//编译过程输出文件- toolstools/startup_stm32f407xx.stools/STM32F407ZGTx_FLASH.ld- MakefileMakefile脚本文件,重点,构建全流程脚本//OpenOCD 调试下载配置文件cmsis-dap.cfg stm32f4x.cfg
- Makefile文件编写(重点)
Author = dele####################################### target 构建目标###################################### TARGET = stm32f407-gcc-template ####################################### building variables####################################### debug build?DEBUG = 1# optimizationOPT = -Og######################################## paths######################################## source path# firmware library pathPERIFLIB_PATH = # Build pathBUILD_DIR = Build####################################### source # ####################################### 修改1 C源文件添加 参加文件工程,按照下面格式添加所有的c文件# C sourcesC_SOURCES = \Kernel/src/stm32f4xx_it.c \Kernel/src/system_stm32f4xx.c \FwlibLibraries/src/misc.c \FwlibLibraries/src/stm32f4xx_adc.c \FwlibLibraries/src/stm32f4xx_can.c \FwlibLibraries/src/stm32f4xx_crc.c \FwlibLibraries/src/stm32f4xx_cryp_aes.c \FwlibLibraries/src/stm32f4xx_cryp.c \FwlibLibraries/src/stm32f4xx_cryp_des.c \FwlibLibraries/src/stm32f4xx_cryp_tdes.c \FwlibLibraries/src/stm32f4xx_dac.c \FwlibLibraries/src/stm32f4xx_dbgmcu.c \FwlibLibraries/src/stm32f4xx_dcmi.c \FwlibLibraries/src/stm32f4xx_dma2d.c \FwlibLibraries/src/stm32f4xx_dma.c \FwlibLibraries/src/stm32f4xx_exti.c \FwlibLibraries/src/stm32f4xx_flash.c \FwlibLibraries/src/stm32f4xx_flash_ramfunc.c \FwlibLibraries/src/stm32f4xx_gpio.c \FwlibLibraries/src/stm32f4xx_hash.c\FwlibLibraries/src/stm32f4xx_hash_md5.c \FwlibLibraries/src/stm32f4xx_hash_sha1.c \FwlibLibraries/src/stm32f4xx_i2c.c \FwlibLibraries/src/stm32f4xx_iwdg.c \FwlibLibraries/src/stm32f4xx_ltdc.c \FwlibLibraries/src/stm32f4xx_pwr.c \FwlibLibraries/src/stm32f4xx_rcc.c \FwlibLibraries/src/stm32f4xx_rng.c \FwlibLibraries/src/stm32f4xx_rtc.c \FwlibLibraries/src/stm32f4xx_sai.c \FwlibLibraries/src/stm32f4xx_sdio.c \FwlibLibraries/src/stm32f4xx_spi.c \FwlibLibraries/src/stm32f4xx_syscfg.c \FwlibLibraries/src/stm32f4xx_tim.c \FwlibLibraries/src/stm32f4xx_usart.c \FwlibLibraries/src/stm32f4xx_wwdg.c \BspLibraries/src/key.c \BspLibraries/src/led.c \SystemLibraries/src/delay.c \SystemLibraries/src/usart.c \SystemLibraries/src/sys.c \SystemLibraries/src/timer.c \Application/src/main.c \# ASM sources# 修改2 汇编启动源文件添加 ASM_SOURCES = \tools/startup_stm32f407xx.s######################################## binaries######################################## 修改3 gcc-arm-none-eabi工具链地址PREFIX = arm-none-eabi-GCC_PATH = /SoftwareApplication/gcc-arm-none-eabi/binifdef GCC_PATHCC = $(GCC_PATH)/$(PREFIX)gccAS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cppCP = $(GCC_PATH)/$(PREFIX)objcopySZ = $(GCC_PATH)/$(PREFIX)sizeelseCC = $(PREFIX)gccAS = $(PREFIX)gcc -x assembler-with-cppCP = $(PREFIX)objcopySZ = $(PREFIX)sizeendifHEX = $(CP) -O ihexBIN = $(CP) -O binary -S######################################## CFLAGS######################################## cpu 架构CPU = -mcpu=cortex-m4# fpuFPU = -mfpu=fpv4-sp-d16# float-abiFLOAT-ABI = -mfloat-abi=hard# mcuMCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)# macros for gcc# AS definesAS_DEFS = # C defines# 修改4 全局宏定义 -DXXX C_DEFS = \-DSTM32F40_41xxx \-DUSE_STDPERIPH_DRIVER\# AS includesAS_INCLUDES = # C includes# 修改5 H源文件添加 参加文件工程,按照下面格式添加所有的文件夹C_INCLUDES =\-I Kernel/inc \-I FwlibLibraries/inc \-I FwlibLibraries/CMSIS/Include \-I BspLibraries/inc \-I SystemLibraries/inc \-I Application/inc \# compile gcc flagsASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sectionsCFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sectionsifeq ($(DEBUG), 1)CFLAGS += -g -gdwarf-2endif# Generate dependency informationCFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)"######################################## LDFLAGS######################################## link script# 修改6 link script 链接脚本文件添加 链接脚本如何获取看参考stm32cubemx官方工程LDSCRIPT = \tools/STM32F407ZGTx_FLASH.ld# librariesLIBS = -lc -lm -lnosys LIBDIR = LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections# default action: build allall: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin######################################## build the application######################################## list of objectsOBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))vpath %.c $(sort $(dir $(C_SOURCES)))# list of ASM program objectsOBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))vpath %.s $(sort $(dir $(ASM_SOURCES)))$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) @echo "[CC] $<"@$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)@echo "[AS] $<"@$(AS) -c $(CFLAGS) $< -o $@$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile@echo "[HEX] $< -> $@"@$(CC) $(OBJECTS) $(LDFLAGS) -o $@@$(SZ) $@$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)@echo "[HEX] $< -> $@"@$(HEX) $< $@$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)@echo "[BIN] $< -> $@"@$(BIN) $< $@ $(BUILD_DIR):@mkdir $@ ######################################## clean up####################################### # make clean 清除编译中间文件# Windows环境不支持 rm 因此写成 -del # Linux环境 clean:-del /q $(BUILD_DIR)# Openocd 调试下载工具 # 修改7 cmsis-dap.cfg -f stm32f4x.cfg# 配置文件 修改成为自己使用的工具和芯片文件 如 stlink.cfg jlink.cfg stm32f1xx.cfgflash:openocd -f cmsis-dap.cfg -f stm32f4x.cfg -c init -c halt -c "program $(BUILD_DIR)/$(TARGET).bin 0x8000000" -c reset -c shutdown######################################## dependencies#######################################-include $(wildcard $(BUILD_DIR)/*.d)# *** EOF ***
四、STM32-工程测试
-
make 构建工程


-
make flash

接上串口线,打开串口软件,查看终端输出情况(如果是从MDK-Keil工程移植过来,printf应该是不支持的,因此终端没有输出,需要修改相关代码,后面写修改文件)(图片中的情况是修改之后的效果)

-
make clean
清除工程,修改main.c代码,重新构建代码



-
注意修改的部分(仅我的工程,不代表全部)
(1)usart.c printf重定向问题
//重定向c库函数printf到串口,重定向后可使用printf函数 // int fputc(int ch, FILE *f) // { // /* 发送一个字节数据到串口 */ // USART_SendData(DEBUG_USART, (uint8_t) ch);// /* 等待发送完毕 */ // while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);// return (ch); // } int _write (int fd, char *pBuffer, int size) {for (int i = 0; i < size; i++){while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成USART1->DR = (uint8_t) pBuffer[i]; //写DR,串口1将发送数据}return size; }(2)sys.c 汇编代码 (注意,由于工程来源于正点原子的工程修改,可能与其他工程模板不一样,非不要)
//THUMB指令不支持汇编内联 //采用如下方法实现执行汇编指令WFI __asm void WFI_SET(void) {WFI; } //关闭所有中断(但是不包括fault和NMI中断) __asm void INTX_DISABLE(void) {CPSID IBX LR } //开启所有中断 __asm void INTX_ENABLE(void) {CPSIE IBX LR } //设置栈顶地址 //addr:栈顶地址 __asm void MSR_MSP(u32 addr) {MSR MSP, r0 //set Main Stack valueBX r14 }修改后
//THUMB指令不支持汇编内联 //采用如下方法实现执行汇编指令WFI void WFI_SET(void) {__ASM volatile("WFI"); } //关闭所有中断(但是不包括fault和NMI中断) void INTX_DISABLE(void) {__ASM volatile("CPSID I");__ASM volatile("BX LR");} //开启所有中断 void INTX_ENABLE(void) {__ASM volatile("CPSIE I");__ASM volatile("BX LR"); } //设置栈顶地址 //addr:栈顶地址 void MSR_MSP(u32 addr) {__ASM volatile("MSR MSP, r0"); __ASM volatile("BX r14"); }
五、测试效果
使用Vscode进行工程修改编辑,编译,下载代码(可以使用Cortex-Debug进行调试)



相关文章:
搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板
STM32F407-GCC-Template Arm-none-eabi-gcc MakefileOpenOCDCMSIS-DAPVscode工程模板 一、本次环境搭建所用的软硬件 1)Windows or Linux (本文以Windows为主) 2)JLink、Daplink、Wch-Link烧录器 3)GNU Arm Embedded Toolchain交叉编译…...
Unity场景ab包加载压缩(LZ4,LZMA)格式的测试
情况 最近场景越来越大,大概800M的场景加载时间可能长达40秒左右,所以需要测试看看发生了什么。 测试环境 测试环境Win10,21thI5-12600KF,32GRam , Nvidia GF RTX2060 32G Scene1大小:741M 加载代码 首…...
私有化部署大模型:5个.Net开源项目
从零构建.Net前后端分离项目 今天一起盘点下,10月份推荐的5个.Net开源项目(点击标题查看详情)。 1、BootstrapBlazor企业级组件库:前端开发的革新之路 BootstrapBlazor是一个用于构建现代Web应用程序的开源框架,它基…...
安卓系统手机便签app使用哪一款?
在现代快节奏的生活中,我们经常会遇到各种繁忙的事务和容易遗忘的备忘事项。为避免大家遗忘重要的事情,大家可以在常用的手机上安装记录备忘事项的工具,为了帮助安卓用户高效地记录和管理这些信息,今天我将向大家推荐一款功能强大…...
SpringCloud-Gateway无法使用Feign服务(2021.X版本)
Spring Cloud Gateway 2021.x版本,无法使用Feign调用其他服务接口。 问题原因: 在官网的 issue 里面找到了相关的问题。 How to call another micro-service on GatewayFilterFactory ? Issue #1090 spring-cloud/spring-cloud-gateway GitHubHel…...
基于SSM的建筑装修图纸管理平台
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
Apache Doris (五十二): Doris Join类型 - Broadcast Join
🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Broadcast Join原理...
Docker从入门到上天系列第四篇:docker平台入门图解与平台架构图解
大神推荐:作者有幸结识技术大神孙哥为好友获益匪浅,现在把孙哥作为朋友分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员。 本专栏简介:话不多说,让我们一起干翻Docker 本文章简介:话不多说,让我们讲清楚Docker的平台入门图解和平台…...
安全防御——四、防火墙理论知识
安全防御 一、防火墙1、防火墙是如何诞生的2、防火墙如何分类2.1 软件型防火墙2.1.1 个人防火墙2.1.2 网关型防火墙 3、硬件型防火墙4、防火墙的技术类型5、代理服务器什么是代理 6、防火墙的接口模式7、防火墙抵御的攻击7.1 DDoS攻击7.2 单包攻击7.3 用户行为不受控7.4 威胁安…...
如何给PPT幻灯片解除密码保护以防止编辑
如果您忘记了ppt幻灯片的密码或无法编辑它,不要担心,提供了一种安全、简单易操作的方法来找回密码或解除限制。具体步骤如下:第一步百度搜索密码帝官网,第二步在用户中心上传需要解密的文件即可。 无论您是使用手机还是电脑&#…...
在linux安装单机版hadoop-3.3.6
一、下载hadoop https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/core/hadoop-3.3.6/ 二、配置环境变量 1、配置java环境变量 2、配置hadoop环境变量 export HADOOP_HOME/usr/local/bigdata/hadoop-3.3.6 export HBASE_HOME/usr/local/bigdata/hbase-2.5.6 export JA…...
Hadoop相关
hdfs getconf -confKey dfs.namenode.http-address 查看Hadoop工作端口的信息 hdfs getconf -confKey dfs.datanode.http.address 查看HDFS的NameNode组件的HTTP端口。...
ArcGIS 气象风场等示例 数据制作、服务发布及前端加载
1. 原始数据为多维数据 以nc数据为例。 首先在pro中需要以多维数据的方式去添加多维数据,这里的数据包含uv方向: 加载进pro的效果: 这里注意 数据属性需要为矢量uv: 如果要发布为服务,需要导出存储为tif格式&…...
【Axure高保真原型】树切换动态面板案例
今天和大家分享树切换动态面板的原型模板,点击树的箭头可以打开或者收起子节点,点击最后一级人物节点,可以切换右侧面板的状态到对应的页面,左侧的树是通过中继器制作的,使用简单,只需要按要求填写中继器表…...
安装pr提示VCRUNTIME140.dll丢失的修复方法,3个有效的方法
在学习和工作中,我们经常需要使用到PR和PS。然而,在安装这些软件时,有时会遇到一些错误提示,其中之一就是“VCRUNTIME140.dll丢失”,无法运行启动软件程序。那么,如何解决VCRUNTIME140.dll丢失的问题呢&…...
Linux进程控制(2)
Linux进程控制(2) 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容讲解了进程等待收尾内容和进程的程序…...
Android Glide transform旋转rotate圆图CircleCrop,Kotlin
Android Glide transform旋转rotate圆图CircleCrop,Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load…...
如何让群晖Audio Station公开共享的本地音频公网可访问?
文章目录 1. 本教程使用环境:2. 制作音频分享链接3. 制作永久固定音频分享链接: 之前文章我详细介绍了如何在公网环境下使用pc和移动端访问群晖Audio Station: 公网访问群晖audiostation听歌 - cpolar 极点云 群晖套件不仅能读写本地文件&a…...
生态环境领域基于R语言piecewiseSEM结构方程模型
结构方程模型(Sructural Equation Modeling,SEM)可分析系统内变量间的相互关系,并通过图形化方式清晰展示系统中多变量因果关系网,具有强大的数据分析功能和广泛的适用性,是近年来生态、进化、环境、地学、…...
spring boot+netty 搭建MQTT broken
一、项目结构 二、安装依赖 <!-- netty包 --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.75.Final</version></dependency><!-- 常用JSON工具包 --><…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...
