基于Linux系统的stm32f103开发环境构建
基于Makefile(后续更新基于xmake,cmake的现代构建方式)
GNU Make为开源的C语言构建软件,本文基于GNU Make, GNU Arm-GCC, OpenOCD开源生态工具来构建一个更加开放的C语言开发方式。(本文基于Std库进行示例)并且要求有一定的Github基础知识
必要工具获取
OpenOCD获取
通过官网下载其Release版本。先暂放,之后与arm-none-eabi-gcc一起配置
make与git获取
sudo apt update && sudo apt upgrade -y
sudo apt install make git bear -y
bear为我个人用来生成compile_commands.json
用的,可以不需要
arm-none-eabi-gcc获取
在arm官网选择适合你的交叉编译工具。在解压之后将其放在任意目录下,笔者放在/opt
目录下,查看/opt
目录下的文件
ls /opt
gcc-arm-none-eabi openocd
将两个文件加的目录加入到~/.bashrc
或~/.zshrc
下
export PATH=$PATH:/opt/gcc-arm-none-eabi/bin
export PATH=$PATH:/opt/openocd/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc-arm-none-eabi/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/openocd/libexec
执行source ~/.bashrc
或者source ~/.zshrc
模板工程获取
确保你的git可以访问Github链接。
mkdir ~/projects && cd ~/projects
git clone git@github.com:Robinsssson/STM32F103-Template.git
这将会在你的~/projects/STM32F103-Template
下创建一个模板工程。
如果您使用的是正点原子精英版。
执行make all
make flash
即可将交替闪烁流水灯的程序烧写到您的项目中。
否则需要修改makefile文件
makefile
# Project configuration
PROJECT ?= template
CC = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
CC_PATH = /opt/gcc-arm-none-eabi/arm-none-eabi
STD_PERIPH_LIBS ?= ./STM32F10x_StdPeriph_Lib_V3.6.0/
# Directories
SOURCES_DIR = src
BUILD_DIR = build
INCLUDE_DIR = include
STARTUP_DIR = startup
LIB_DIR = lib
3RD_LIB_DIR = 3rdparty
# Source files
SOURCES = \
$(SOURCES_DIR)/main.c \
$(SOURCES_DIR)/stm32f10x_it.c \
$(SOURCES_DIR)/system_stm32f10x.c \
$(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c \
$(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c \
$(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c \
$(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c \
$(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c
# Include directories
INCLUDES = \
-I$(INCLUDE_DIR) \
-I$(3RD_LIB_DIR) \
-I$(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ \
-I$(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/CoreSupport/ \
-I$(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/inc/ \
-I$(CC_PATH)/include
# Libraries
LIBS = \
-lc
# Compiler and linker flags
CFLAGS = \
-g -Wall --specs=nosys.specs -march=armv7-m -O0 \
-mlittle-endian -mthumb -mcpu=cortex-m3 \
-mfloat-abi=soft \
-DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER \
$(INCLUDES)
LDFLAGS = \
-Wl,--gc-sections $(LIBS) -T$(STARTUP_DIR)/stm32_flash.ld
# Startup file
START_FILE = startup_stm32f10x_hd
# st-flash tool
ST_FLASH ?= st-flash
# Object files
OBJECTS = $(SOURCES:$(SOURCES_DIR)/%.c=$(BUILD_DIR)/%.o) \
$(BUILD_DIR)/startup/$(START_FILE).o
# Quiet mode
QUIET ?= @
# Default target
all: $(BUILD_DIR)/$(PROJECT).elf
# Compile target
$(BUILD_DIR)/$(PROJECT).elf: $(OBJECTS)
@echo "Linking $@..."
$(QUIET)mkdir -p $(BUILD_DIR)
$(QUIET)$(CC) $(OBJECTS) $(CFLAGS) $(LDFLAGS) -o $@
@echo "Generating HEX and BIN files..."
$(QUIET)$(OBJCOPY) -O ihex $@ $(BUILD_DIR)/$(PROJECT).hex
$(QUIET)$(OBJCOPY) -O binary $@ $(BUILD_DIR)/$(PROJECT).bin
# Pattern rule for object files
$(BUILD_DIR)/%.o: $(SOURCES_DIR)/%.c
@echo "Compiling $<..."
$(QUIET)mkdir -p $(dir $@)
$(QUIET)$(CC) $(CFLAGS) -c $< -o $@
# Rule for compiling the startup file
$(BUILD_DIR)/$(STARTUP_DIR)/$(START_FILE).o: $(STARTUP_DIR)/$(START_FILE).s
@echo "Compiling $<..."
$(QUIET)mkdir -p $(dir $@)
$(QUIET)$(CC) $(CFLAGS) -c $< -o $@
# Remove binary files
.PHONY: clean flash compile_commands
clean:
@echo "Cleaning project..."
$(QUIET)rm -rf $(BUILD_DIR)
# Flash target
flash:
@echo "Flashing the device..."
$(QUIET)/opt/openocd/bin/openocd -f /opt/openocd/openocd/scripts/interface/stlink.cfg \
-f /opt/openocd/openocd/scripts/target/stm32f1x.cfg \
-c "program $(BUILD_DIR)/$(PROJECT).bin verify reset exit 0x08000000"
# Generate compile_commands.json for clangd
compile_commands:
@echo "Generating compile_commands.json..."
$(QUIET)bear -- make all -j2
$(QUIET)mv -f compile_commands.json $(BUILD_DIR)/compile_commands.json
文件树介绍
├── build #构建中间文件存放
├── include #头文件包含位置
├── src #源文件位置
├── startup #启动文件*.s *.ld位置
└── STM32F10x_StdPeriph_Lib_V3.6.0 #ST标准库位置
├── _htmresc
├── Libraries
├── Project
└── Utilities
修改方法
根据您单片机容量型号,选择单片机的设置宏,修改
SOURCES += $(STARTUP_DIR)/startup_stm32f10x_hd.s # startup_stm32f10x_ld.s
CFLAGS += -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER # DSTM32F10X_MD
# 从$(STD_PERIPH_LIBS)/Project/STM32F10x_StdPeriph_Template/下选择符合您型号的*.ld文件
有问题可在仓库提issue,我会尽快回复
Github仓库 地址