STM32 Makefile stm32loader

目录结构

image
image

  • HAL全复制过来了,省的引用。
  • CMSIS里面4个.H文件。
  • ST里面是system_stm....c/.h,一个启动.asm和一个.ld连接脚本。都是ST给的库里面的,GITHUB上有。
  • test1里面只有自己的代码。
  • syscall_stub.c是自己的_write/_read实现。因为用printf之类的函数需要用_read/_write之类的东西,链接器需要。

链接器用了libnosys.a【--specs=nano.specs --specs=nosys.specs或者-lnosys】,用printf/scanf需要自己实现_read和_write。其余的不用实现,libnosys.a里面有空stub。
编译器会给警告说都是空,无视即可,要的就是空实现。

Makefile内容

  • 因为自己都是写一些简单代码,所以就没有生成调试信息。
  • 烧录用的是stm32loader,因为不想安装stm32-cube-programmer,体积太大了。

ST的软件真是一坨,体积大,速度慢。逼得我手搓Makefile。

## make flash [PORT=COM3]
## Need: stm32loader (pip install)

TARGET=test1
BUILD_DIR=build

PREFIX=arm-none-eabi-
CC=$(PREFIX)gcc
SZ=$(PREFIX)size
OBJCOPY=$(PREFIX)objcopy -S
BIN=$(OBJCOPY) -O binary
HEX=$(OBJCOPY) -O ihex

HAL_DIR=../HAL
C_SRC= \
$(HAL_DIR)/Src/stm32f1xx_hal.c \
$(HAL_DIR)/Src/stm32f1xx_hal_cortex.c \
$(HAL_DIR)/Src/stm32f1xx_hal_dma.c \
$(HAL_DIR)/Src/stm32f1xx_hal_adc.c \
$(HAL_DIR)/Src/stm32f1xx_hal_adc_ex.c \
$(HAL_DIR)/Src/stm32f1xx_hal_flash.c \
$(HAL_DIR)/Src/stm32f1xx_hal_flash_ex.c \
$(HAL_DIR)/Src/stm32f1xx_hal_gpio.c \
$(HAL_DIR)/Src/stm32f1xx_hal_gpio_ex.c \
$(HAL_DIR)/Src/stm32f1xx_hal_pwr.c \
$(HAL_DIR)/Src/stm32f1xx_hal_rcc.c \
$(HAL_DIR)/Src/stm32f1xx_hal_rcc_ex.c \
$(HAL_DIR)/Src/stm32f1xx_hal_tim.c \
$(HAL_DIR)/Src/stm32f1xx_hal_tim_ex.c \
$(HAL_DIR)/Src/stm32f1xx_hal_uart.c \
$(HAL_DIR)/Src/stm32f1xx_hal_usart.c \
$(HAL_DIR)/Src/stm32f1xx_hal_msp.c \
../ST/system_stm32f1xx.c \
./syscall_stub.c \
./main.c \

ASM_SRC=../ST/startup_stm32f103xb.s
LINK_SCRIPT=../ST/STM32F103XB_FLASH.ld

C_INC= \
-I../CMSIS \
-I../ST \
-I$(HAL_DIR)/Inc \
-I. \

C_DEF= \
-DSTM32F103xB \
-DUSE_HAL_DRIVER \

MCU=-mcpu=cortex-m3 -mthumb -mfloat-abi=soft -mfpu=auto

vpath %.c $(sort $(dir $(C_SRC)))
vpath %.s $(sort $(dir $(ASM_SRC)))

OBJECTS+=$(addprefix $(BUILD_DIR)/,$(notdir $(C_SRC:.c=.o)))
OBJECTS+=$(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SRC:.s=.o)))


all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin
	$(SZ) $<
    @echo ALL OK

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) | $(BUILD_DIR)
	$(CC) $(MCU) -O2 -T$(LINK_SCRIPT) $^ -o $@ \
    --specs=nano.specs --specs=nosys.specs -s -static -lc -lm \
    -Wl,-Map,$(BUILD_DIR)/$(TARGET).map \
    -Wl,--gc-sections \
    -Wl,--no-warn-rwx-segments

$(BUILD_DIR)/%.o: %.s | $(BUILD_DIR)
	$(CC) -c $(MCU) -x assembler-with-cpp -o $@ $<

$(BUILD_DIR)/%.o: %.c | $(BUILD_DIR)
	$(CC) -c -Wall -O2 $(MCU) $(C_DEF) $(C_INC) \
    -o $@ $< \
    --specs=nano.specs -ffunction-sections -fdata-sections \
    -Wa,-a,-ad,-alms=$(BUILD)/$(notdir $(<:.c=.lst))

$(BUILD_DIR):
	MD $(BUILD_DIR)

$(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf
	$(BIN) $< $@
	@echo BIN OK
$(BUILD_DIR)/$(TARGET).hex: $(BUILD_DIR)/$(TARGET).elf
	$(HEX) $< $@
	@echo HEX OK
clean:
	@RD /S /Q $(BUILD_DIR)

STM32LOADER=stm32loader
PORT?=$(shell powershell -Command "[System.IO.Ports.SerialPort]::GetPortNames() | Select-Object -First 1")

flash: $(BUILD_DIR)/$(TARGET).bin
ifeq ($(PORT),)
	$(error [ERROR] Plug in COMx or use "make flash PORT=COMx, x=1,2,...")
endif
	@echo PORT=$(PORT)...
	$(STM32LOADER) -e -v -w -p $(PORT) -f F1 -s -n $<

Windows上用Powershell【System.IO.Ports.SerialPort]::GetPortNames()】拿到COM端口名字,省得手打字。当然手动指定也可。
stm32loader的选项【-s】,根据板子连线选择要不要加。当初画板子用的ch340x的自动下载电路,沁恒官网上有。RTS#连的是stm MCU的nRST,DTR#连的是BOOT0。

posted @ 2026-01-05 15:06  fish21  阅读(14)  评论(0)    收藏  举报