gcc-arm+make+openocd+vscode单片机开发环境搭建

单片机arm开发环境搭建

一、安装包下载与安装

1.gcc-arm

1.下载

arm-gnu-none-eabi

找到对应平台下的arm工具链进行下载,支持Windows、Linux、Mac OS系统。

2.安装

arm工具链的安装极其简单,这里不再赘述。安装完成后将gcc-arm目录下的文件夹加入到环境变量中。

gcc-arm-none-eabi-10_2021.10\bin

gcc-arm-none-eabi-10_2021.10\arm-none-eabi\bin

2.make

使用cygwin来进行下载make。

下载和安装参考以下博客:
windows环境下gcc的使用(一):安装cygwin

注意: 只安装make即可,不需要安装博客中提到的那些内容。

安装完成后将以下目录加入到系统环境变量:

cygwin64\bin

cygwin64\sbin

3.openocd

1.下载

Download pre-built OpenOCD for Windows

2.安装

openocd下载下来是一个以.7z结尾的压缩文件,7z压缩文件的解压请下载7-Zip工具。

解压后还需要将openocd的以下目录加入到系统环境变量:

OpenOCD-20231002-0.12.0\bin

4.vscode

下载和安装请参考博客VSCode安装配置使用教程(最新版超详细保姆级含插件)一文就够了

二、VSCode的配置

1.插件安装

1.必要的插件

2.推荐插件

2.配置

注意在 vscode 中打开文件夹后需要在当前文件夹下自行创建一个 .vscode 文件夹(或者执行以下任意操作 vscode 将自动创建 .vscode 文件夹)。

1.c_cpp_properties.json

使用快捷键 ctrl+shift+p 输入c/c++ui 进入 C/C++:Edit Configurations(UI)。

需要做以下配置:

注意: 编译器路径应该是绝对路径!!!(是arm-gcc的路径)

配置完成后vscode将在.vscode文件夹下创建 c_cpp_properties.json 文件。

2.tasks.json

1.点击终端下的配置任务。

2.选择 使用模板创建 tasks.json 。

3.选择 MSBuild ,将在 .vscode 文件夹下创建 tasks.json 文件。

4.修改以上文件内容为:

javascript 复制代码
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "make",
            "args": [
                "-C",
                "./Debug", // 目录
                "-j12"
            ],
            "group": "build",
        },
        {
            "label": "clean",
            "type": "shell",
            "command": "make",
            "args": [
                "-C",
                "./Debug",
                "clean"
            ],
            "group": "build",
        },
        {
            "label": "download",
            "type": "shell",
            "command": "openocd",
            "args": [
                "-f",
                "./Debug/stlink.cfg",
                "-f",
                "./Debug/stm32f1x.cfg",
                "-c",
                "program Debug/gcc-test.elf verify reset exit"
            ],
            "group": "build",
        }
    ]
}

打开 终端 -> 运行任务... 就可以看到刚刚配置的命令了。


3.launch.json

1.创建 launch.json 文件。


2.修改 launch.json 文件。

javascript 复制代码
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "cwd": "${workspaceRoot}",
            "executable": "./Debug/gcc-test.elf",
            "name": "Debug Microcontroller",
            "request": "launch",
            "type": "cortex-debug",
            //"showDevDebugOutput": false,
            "servertype": "openocd", 
            // .svd 文件可以在 keil 文件夹 Local\Arm\Packs\Keil\单片机_DFP\版本号\SVD 文件夹下找
            "svdFile": "./Debug/STM32F103xx.svd",
            "configFiles": [
            // 单片机.cfg 文件在 share\openocd\scripts\target
            // 仿真器.cfg 文件在 share\openocd\scripts\interface
                "./Debug/stlink.cfg",
                "./Debug/stm32f1x.cfg"
            ]
        }
    ]
}

4.vscode没有代码智能提示和错误波浪线

参考:vscode 没有代码智能提示和错误波浪线

1.进入设置界面(快捷键 ctrl+, ),在搜索栏输入 prevent ,将 Edit > Suggest:Snippets Prevent Quick Suggestings 的选项框 取消选项

2.错误波浪线

使用快捷键 ctrl+shift+P 搜索 errorsquiggles ,选中 启用波浪线

三、Makefile文件

我参考 STM32cube MX 自动生成的 Makefile 进行修改得到以下 Makefile :

shell 复制代码
# ------------------------------------------------
# Makefile
# REFER : STM32Cube MX automatically generated Makefile file
#
# ChangeLog :
#   2024-08-11 - first version
# ------------------------------------------------

#目标文件名
TARGET = gcc-test


######################################
# building variables
######################################
# debug build?
DEBUG = 1
# optimization
OPT = -Og


#######################################
# paths
#######################################
# Build path
BUILD_DIR = build
OUTPUT_DIR = .


# C源文件
C_SOURCES +=  $(wildcard \
../APP/*.c \
../CORE/*.c \
../STM32_Lib/conf/*.c \
../STM32_Lib/src/*.c \
) 

# ASM 源文件
ASM_SOURCES =  \
../CORE/startup_stm32f10x_hd.s


#######################################
# binaries
#######################################
PREFIX = arm-none-eabi-
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
 
#######################################
# CFLAGS
#######################################
# cpu
CPU = -mcpu=cortex-m3

# fpu
# NONE for Cortex-M0/M0+/M3

# float-abi


# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)

# macros for gcc
# AS defines
AS_DEFS = 

# 宏定义
C_DEFS =  \
-DUSE_STDPERIPH_DRIVER \
-DSTM32F10X_HD


# AS includes
AS_INCLUDES = 

# C 头文件目录
C_INCLUDES =  \
-I../CORE \
-I../STM32_Lib/conf \
-I../STM32_Lib/inc


# compile gcc flags
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections -std=c99

CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections -std=c99

ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif


# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"


# 链接脚本
LDSCRIPT = ../Link/STM32F103ZETx_FLASH.ld

# libraries
LIBS = -lc -lm -lnosys 
LIBDIR = 
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(OUTPUT_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

# default action: build all
all: $(OUTPUT_DIR)/$(TARGET).elf $(OUTPUT_DIR)/$(TARGET).hex $(OUTPUT_DIR)/$(TARGET).bin


#######################################
# build the application
#######################################
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 
	$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
	$(AS) -c $(CFLAGS) $< -o $@

$(OUTPUT_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
	$(CC) $(OBJECTS) $(LDFLAGS) -o $@
	$(SZ) $@

$(OUTPUT_DIR)/%.hex: $(OUTPUT_DIR)/%.elf | $(BUILD_DIR)
	$(HEX) $< $@
	
$(OUTPUT_DIR)/%.bin: $(OUTPUT_DIR)/%.elf | $(BUILD_DIR)
	$(BIN) $< $@	

#######################################
# create build directory
	
$(BUILD_DIR):
	mkdir $@		

#######################################
# clean up
#######################################
clean:
	-rm -fR $(BUILD_DIR)
	-rm -fR $(OUTPUT_DIR)/*.bin $(OUTPUT_DIR)/*.hex $(OUTPUT_DIR)/*.elf $(OUTPUT_DIR)/*.map
  
#######################################
# dependencies
#######################################
-include $(wildcard $(BUILD_DIR)/*.d)

# *** EOF ***
相关推荐
Whappy001几秒前
51单片机-AD(模拟信号转数字信号)-实验()
单片机·嵌入式硬件·51单片机
学习3人组2 小时前
结合板载驱动以及考虑全志 ARM 开发板有温度传感器和显示屏等硬件设备开发示例
arm开发
仙陨2 小时前
ARM相关概念
arm开发
流殇2583 小时前
ARM中要使用的汇编基础
汇编·arm开发
科研小白_d.s10 小时前
vscode配置c/c++环境
c语言·c++·vscode
辰哥单片机设计13 小时前
门磁模块详解(防盗感应开关 STM32)
stm32·单片机·嵌入式硬件·传感器
yrx02030714 小时前
stm32 IIC总线busy解决方法
stm32·单片机·嵌入式硬件
YHPsophie15 小时前
ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域
经验分享·笔记·单片机·信息与通信·交通物流
钡铼技术物联网关16 小时前
Codesys 与 ARMxy ARM 工业控制器:工业控制的黄金组合
linux·运维·服务器·arm开发·硬件工程