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 ***
相关推荐
代码游侠7 小时前
ARM开发——阶段问题综述(二)
运维·arm开发·笔记·单片机·嵌入式硬件·学习
DLGXY8 小时前
STM32——旋转编码器计次(七)
stm32·单片机·嵌入式硬件
羽获飞8 小时前
从零开始学嵌入式之STM32——3.使用寄存器点亮一盏LED灯
单片机·嵌入式硬件
浩子智控9 小时前
商业航天计算机抗辐射设计
单片机·嵌入式硬件
独处东汉12 小时前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
czy878747513 小时前
机智云 MCU OTA可以对MCU程序进行无线远程升级。
单片机·嵌入式硬件
A9better15 小时前
嵌入式开发学习日志52——二值与计数信号量
单片机·嵌入式硬件·学习
_chirs16 小时前
编译不依赖动态库的FFMPEG(麒麟国防 V10)
arm开发·ffmpeg
日更嵌入式的打工仔16 小时前
(实用向)中断服务程序(ISR)的优化方向
笔记·单片机
想放学的刺客17 小时前
单片机嵌入式试题(第25)嵌入式系统可靠性设计与外设驱动异常处理
stm32·单片机·嵌入式硬件·mcu·物联网