单片机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.修改以上文件内容为:
{
// 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 文件。
{
// 使用 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没有代码智能提示和错误波浪线
1.进入设置界面(快捷键 ctrl+, ),在搜索栏输入 prevent ,将 Edit > Suggest:Snippets Prevent Quick Suggestings 的选项框 取消选项
2.错误波浪线
使用快捷键 ctrl+shift+P 搜索 errorsquiggles ,选中 启用波浪线
三、Makefile文件
我参考 STM32cube MX 自动生成的 Makefile 进行修改得到以下 Makefile :
# ------------------------------------------------
# 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 ***