搭建 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

二、软件安装配置

  1. GNU Arm Embedded Toolchain交叉编译器

    进入arm开发者官网,往下滑动选择下载解压可用的ZIP压缩包文件

    下载链接: Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer

    在这里插入图片描述

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

    在这里插入图片描述
    添加完环境变量后,进行测试,检测是否安装好。

在这里插入图片描述
在这里插入图片描述

  1. 安装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工程配置

  1. 工程结构

    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
  1. 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-工程测试

  1. make 构建工程

    在这里插入图片描述

    在这里插入图片描述

  2. make flash

    在这里插入图片描述

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

 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1cf3ac67fade4aa49f3648b98d0759ab.png#pic_center)
  1. make clean

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

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

  2. 注意修改的部分(仅我的工程,不代表全部)

    (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进行调试)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

13.求面积[有问题]

#include<stdio.h> #include<math.h> #include<bits/stdc.h> using namespace std;void fun(double a,b,c) {double p,c;p (abc)/2;c sqrt(p*(p-a)*(p-b)*(p-c));printf("面积是&#xff1a;%lf",c); }int main(){double a,b,c;scanf("%lf,%…

【LearnOpenGL基础入门——2】搭建第一个OpenGL窗口

目录 一.配置GLFW 二.配置GLAD 三.第一个OpenGL窗口 3.1 GLFW设置 3.2 GLAD设置 3.3 视口 3.4 输入 3.5渲染 在我们画出出色的效果之前&#xff0c;首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而&#xff0c;这些操作在每个系统上都是不一样…

从TCP到Socket,彻底理解网络编程是怎么回事

进行程序开发的同学&#xff0c;无论Web前端开发、Web后端开发&#xff0c;还是搜索引擎和大数据&#xff0c;几乎所有的开发领域都会涉及到网络编程。比如我们进行Web服务端开发&#xff0c;除了Web协议本身依赖网络外&#xff0c;通常还需要连接数据库&#xff0c;而数据库连…

易点易动固定资产管理系统:定制流程与用量控制的高效管理利器

固定资产管理对于企业来说至关重要&#xff0c;而如何提高固定资产管理的效率和精确度一直是企业管理者关注的焦点。易点易动固定资产管理系统以其自定义固定资产流程和用量控制功能&#xff0c;成为了提升固定资产管理效率的利器。本文将详细介绍易点易动固定资产管理系统的自…

功能: 在web应用程序中、读取文件

通过使用文件 API&#xff0c;web 内容可以要求用户选择本地文件&#xff0c;然后读取这些文件的内容。这种选择可以通过使用 HTML <input type"file"> 元素或通过拖放来完成。 1.通过 click() 方法使用隐藏的文件 input 元素 你可以隐藏公认难看的文件 <…

Android MotionLayout

MotionLayout exends ConstraintLayout(动画框架 过渡) View动画 API1 属性动画API11 过渡动画API18 root.width RootViewWidth TransitionManager.beginDelayedTransition(view) 过渡动画 可以改变其大小和流畅性 Fade 可以改变透明度 通过TrasitinManager管理 Go:动态替…

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.life…

小程序开发平台源码系统 各种类型小程序任由选择 带完整的搭建教程

近年来随着微信、支付宝等平台对小程序的大力推广和支持下应运而生的。小程序作为一种轻量级的应用程序&#xff0c;为用户提供了无需下载安装、即用即走的便捷体验&#xff0c;因此得到了广大用户的喜爱和青睐。所以今天罗峰来给大家介绍一款小程序开发平台源码系统&#xff0…

【NeurIPS 2020】基于蒙特卡罗树搜索的黑箱优化学习搜索空间划分

Learning Search Space Partition for Black-box Optimization using Monte Carlo Tree Search 目标&#xff1a;从采样&#xff08;Dt ∩ ΩA&#xff09;中学习一个边界&#xff0c;从而最大化两方的差异 先使用Kmeans在特征向量上&#xff08; [x, f(x)] &#xff09;聚类…

智能网联汽车有哪些信息安全场景

目录 1.车内安全通信 2.车云安全通信 3.安全启动 4.车载应用程序保护 5.入侵检测防御与日志管理系统 在聊完车载信息安全需求之后&#xff0c;势必要去看看​应用场景有哪些。根据之前的开发经验简单聊一下我知道的&#xff0c;还有很多没有讲&#xff0c;比如说车云之间具…

单月突破20万台大关!哪些供应商正在领跑W/AR HUD前装市场

传统汽车升级&#xff0c;从电动化到智能化&#xff0c;驱动更多的增量部件进入前装市场。这些产品通常都会经历几个关键的时间节点。 其中&#xff0c;前装搭载率10%&#xff0c;被视为细分赛道处在快速成长期的关键指标之一。并且&#xff0c;这意味着&#xff0c;产品已经得…

面试题:说一下线程、线程锁与线程池

文章目录 前言一、线程1.线程概念2.线程与进程的关系3.定义4.wait()和sleep()5.线程的状态及其他API 二、线程锁1. 普通锁机制2. Lock 三、线程同步工具类1. CountDowmLatch闭锁&#xff1a;2. CyclicBarrier栅栏&#xff1a;3. Exchanger交换机&#xff1a;4. 信号量 四、线程…

FreeRTOS源码阅读笔记2--list.c

list.c中主要完成列表数据结构的操作&#xff0c;有列表和列表项的初始化、列表的插入和移除。 2.1列表初始化vListInitialise() 2.1.1函数原型 void vListInitialise( List_t * const pxList ) pxList&#xff1a;列表指针&#xff0c;指向要初始化的列表。 2.1.2函数框架…

ARMday03(寄存器读写、栈、程序状态寄存器、软中断和异常、混合编程)

单寄存器内存读写指令 将一个寄存器中的数值写入到内存&#xff0c;或者从内存中读取数据放在某一个指定寄存器中 指令码和功能 1.向内存中写&#xff1a; str{条件码} 目标寄存器,[目标地址]&#xff1a;将目标寄存器的4字节数值写入到目标地址为首地址的空间中 strh{条件码…

跟着森老师学React Hooks(1)——使用Vite构建React项目

Vite是一款构建工具&#xff0c;对ts有很好的支持&#xff0c;最近也是在前端越来越流行。 以往的React项目的初始化方式大多是通过脚手架create-react-app(本质是webpack)&#xff0c;其实比起Vite来构建&#xff0c;启动会慢一些。 所以这次跟着B站的一个教程&#xff0c;使用…

JavaScript脚本操作CSS

脚本化CSS就是使用JavaScript脚本操作CSS&#xff0c;配合HTML5、Ajax、jQuery等技术&#xff0c;可以设计出细腻、逼真的页面特效和交互行为&#xff0c;提升用户体验&#xff0c;如网页对象的显示/隐藏、定位、变形、运动等动态样式。 1、CSS脚本化基础 CSS样式有两种形式&…

【Ruoyi管理后台】用户登录强制修改密码

近期有个需求&#xff0c;就是需要调整Ruoyi管理后台&#xff1a;用户如果三个月(长时间)未修改过密码&#xff0c;需要在登录时强制修改密码&#xff0c;否则不能登录系统。 一、后端项目调整 从需求来看&#xff0c;我们需要在用户表增加一个字段&#xff0c;用于标记用户最…

Ansible优化大全

文章目录 一、关闭系统信息收集二、开启加速 Ansible 执行速度修改配置文件/etc/ansible/ansible.cfg由于该功能与sudo冲突&#xff0c;必须关闭 requiretty 选项方法一方法二 参考文章&#xff1a; https://blog.csdn.net/o0o0o0D/article/details/110998873 一、关闭系统信息…

【教3妹学编程-算法题】逃离火灾

3妹&#xff1a;2哥&#xff0c;今日都立冬了&#xff0c; 可是天气一点都不冷。 2哥 : 立冬了&#xff0c;晚上要不要一起出去吃饺子&#xff1f;&#x1f95f; 3妹&#xff1a;好呀好呀&#xff0c;2哥请吃饺子喽 2哥 : 歪歪&#xff0c;我说的是一起出去吃&#xff0c;没说我…

Python|OpenCV-图像的添加和混合操作(8)

前言 本文是该专栏的第8篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV库对图像操作的时候,有时需要对图像进行运算操作,类似于加法,减法,位操作等处理。而本文,笔者将针对OpenCV对图像的添加,混合以及位操作进行详细的介绍说明和使用。 下面,…