STM32 Makefile

#使用斜杠,而不是反斜杠
#环境:windows, ARM gcc, gnu make, stm32cube library, stm32cube programmer

#工具链
PREFIX = arm-none-eabi-
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
BIN = $(CP) -O binary -S

# STM32的Cube库的位置,HAL驱动的位置
CUBE = C:/*/STM32CubeF3
HAL = $(CUBE)/Drivers/stm32f3xx_HAL_Driver

#构建目标,构建结果存到build目录下
TARGET = test
BUILD = build

#指定MCU的类型
CPU = -mcpu=cortex-m4
FPU = -mfpu=fpv4-sp-d16
FLT = -mfloat-abi=hard
MCU = $(CPU) -mthumb $(FPU) $(FLT)
#需要编译的源代码文件
C_SRC = $(HAL)/Src/stm32f3xx_hal.c \
$(HAL)/Src/stm32f3xx_hal_*.c \
system_stm32f3xx.c stm32f3xx_it.c main.c syscall.c

#启动文件
ASM_SRC = startup_stm32f334x8.s

#预定义符号
C_DEFS = -DUSE_HAL_DRIVER -DSTM32F334x8

#头文件搜索位置
INCLUDE = -I. \
-I$(CUBE)/Drivers/CMSIS/Core/Include \
-I$(CUBE)/Drivers/CMSIS/Include \
-I$(CUBE)/Drivers/CMSIS/Device/ST/stm32f3xx/Include \
-I$(HAL)/Inc

#编译标志
OPT = -Og
ASFLAGS = $(MCU) $(OPT) -Wall -fdata-sections -ffunction-sections
CFLAGS = $(MCU) $(C_DEFS) $(INCLUDE) $(OPT) -Wall -fdata-sections -ffunction-sections
CFLAGS += -g -gdwarf-2
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"

#链接脚本,库
LDSCRIPT = STM32F334XX_FLASH.ld
LIBS = -lc -lm -lnosys
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBS) -Wl,-Map=$(BUILD)/$(TARGET).map,--cref -Wl,--gc-sections

#生成ELF和BIN文件
all: $(BUILD)/$(TARGET).elf $(BUILD)/$(TARGET).bin
  $(SZ) $<

#把C_SRC的后缀改成.o,然后去掉目录名只取文件名,再加上build目录路径。就是说,把生成的.o都放在build里面
OBJECTS = $(addprefix $(BUILD)/,$(notdir $(C_SRC:.c=.o)))
vpath %.c $(sort $(dir $(C_SRC))) #将目录排序去重,加入到vpath
OBJECTS += $(addprefix $(BUILD)/,$(notdir $(ASM_SRC:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SRC)))

$(BUILD)/%.o: %.c Makefile | $(BUILD)
  $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD)/$(notdir $(<:.c=.lst)) $< -o $@ #生成lst,至今还没弄明白
$(BUILD)/%.o: %.s Makefile | $(BUILD)
  $(AS) -c $(CFLAGS) $< -o $@

$(BUILD)/$(TARGET).elf: $(OBJECTS) Makefile
  $(CC) $(OBJECTS) $(LDFLAGS) -o $@
$(BUILD)/%.bin:$(BUILD)/%.elf | $(BUILD)
  $(BIN) $< $@
$(BUILD):
  mkdir $@

clean:
  RD /S /Q $(BUILD) #RD就是RMDIR,windows上的rm命令

-include $(wildcard $(BUILD)/*.d)

#命令行下载运行
PROG = C:/*/STM32CubeProgrammer/bin/STM32_Programmer_CLI.exe
flash: $(BUILD)/$(TARGET).bin
  $(PROG) -c port=SWD freq=4000 -e all -w $< 0x08000000 -v #使用SWD把BIN文件写入到0x08000000位置并校验
run: flash
  $(PROG) -c port=SWD freq=4000 -s 0x08000000
posted @ 2026-01-05 15:06  fish21  阅读(5)  评论(0)    收藏  举报