STM32
直播中

七上八下

8年用户 736经验值
私信 关注
[问答]

如何去编写STM32 makefile模版的程序代码呢

如何去编写STM32 makefile模版的程序代码呢?

回帖(1)

王盼盼

2021-12-2 09:56:05
啥都不说了,直接上代码,注释相当详细了。

#STM32 makefile template


# 生成的文件名<项目名>
PROJECT                  = stm32_Mini_Led


# 定义文件格式和文件名
TARGET                  := $(PROJECT)
TARGET_ELF              := $(TARGET).elf
TARGET_BIN              := $(TARGET).bin
TARGET_HEX              := $(TARGET).hex
OBJCPFLAGS_ELF_TO_BIN    = -Obinary
OBJCPFLAGS_ELF_TO_HEX    = -Oihex
OBJCPFLAGS_BIN_TO_HEX    = -Ibinary -Oihex


# 定义路径
TOP_DIR      = .
SCRIPT_DIR  := $(TOP_DIR)/scripts
STARTUP_DIR := $(TOP_DIR)/third_party/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup
INC_DIR     := -I $(TOP_DIR)/src -I $(TOP_DIR)/src/Driver -I $(TOP_DIR)/src/EDP -I $(TOP_DIR)/src/Network


# 设置shell环境变量
#export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/


# 设置ld链接脚本文件
LDSCRIPT    := $(SCRIPT_DIR)/stm32_flash.ld


# 定义编译工具
CC          = arm-none-eabi-gcc
AS          = arm-none-eabi-as
LD          = arm-none-eabi-ld
AR          = arm-none-eabi-ar
OBJCP       = arm-none-eabi-objcopy


# 定义编译标志
CCFLAGS     += -Wall -mcpu=cortex-m3 -mthumb -g -mfloat-abi=soft -march=armv7-m
ASFLAGS     += -Wall -mcpu=cortex-m3 -mthumb
LDFLAGS     += -T $(LDSCRIPT) #-A armv7-m
LDFLAGS     += -L /Users/ch-yanghl/gcc-arm-none-eabi/lib/gcc/arm-none-eabi/5.4.1
LDFLAGS     += -L /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb


# 要链接的静态库
#LDLIBS         += /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/libc.a
#LDLIBS         += /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/libg.a
#LDLIBS         += /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/libm.a
#LDLIBS      += /Users/ch-yanghl/gcc-arm-none-eabi/lib/gcc/arm-none-eabi/5.4.1/libgcc.a
#LDLIBS      += /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/libnosys.a




# .c文件中的头文件引用查找路径
CCFLAGS     += $(INC_DIR)


# .s文件的flags
#ASFLAGS        +=


# .c文件编译时定义宏
CCFLAGS     += -D STM32F10X_MD -D USE_STDPERIPH_DRIVER


# 添加启动文件
#SOURCE         += $(SCRIPT_DIR)/startup_stm32f10x_md.c
SOURCE_ASM      += $(STARTUP_DIR)/gcc_ride7/startup_stm32f10x_md.s


# 展开工作 子目录中的inc文件(inc文件中添加需要编译链接的.c,.s等文件)
-include $(TOP_DIR)/src/make.inc
-include $(TOP_DIR)/third_party/make.inc


# 替换文件后缀
C_OBJS      := $(SOURCE:%.c=%.o)
ASM_OBJS    := $(SOURCE_ASM:%.s=%.o)


# 编译命令的定义
COMPILE     = $(CC) $(CCFLAGS) -c $< -o $@
ASSEMBLE    = $(AS) $(ASFLAGS) -c $< -o $@
LINK        = $(LD) $+ $(LDFLAGS) $(LDLIBS) -o $@
ELF_TO_BIN  = $(OBJCP) $(OBJCPFLAGS_ELF_TO_BIN) $< $@
BIN_TO_HEX  = $(OBJCP) $(OBJCPFLAGS_BIN_TO_HEX) $< $@


# 定义伪目标
.PHONY: all clean printf


# 定义规则
all: $(TARGET_HEX)
    @echo "build done"


$(TARGET_HEX): $(TARGET_BIN)
    $(BIN_TO_HEX)


$(TARGET_BIN): $(TARGET_ELF)
    $(ELF_TO_BIN)


$(TARGET_ELF): $(C_OBJS) $(ASM_OBJS)
    $(LINK)


$(C_OBJS):%.o:%.c
    $(COMPILE)


$(ASM_OBJS):%.o:%.s
    $(ASSEMBLE)


printf:
    @echo $(ASM_OBJS)
    @echo $(ASSEMBLE)


# 清理项
clean:
    rm -f $(TARGET_HEX)
    rm -f $(TARGET_BIN)
    rm -f $(TARGET_ELF)
    rm -f $(C_OBJS) $(ASM_OBJS)
    @echo "clean done"


这个一个LED流水灯的STM32工程,包含STM32库v3.5.0版本,下载地址
再详细说一下注释中没有的可能有疑问的地方:


# 要链接的静态库
#LDLIBS         += /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/libc.a
#LDLIBS         += /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/libg.a
#LDLIBS         += /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/libm.a
#LDLIBS      += /Users/ch-yanghl/gcc-arm-none-eabi/lib/gcc/arm-none-eabi/5.4.1/libgcc.a
#LDLIBS      += /Users/ch-yanghl/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/libnosys.a


-这一块为什么要注释:因为文中使用了


# 设置ld链接脚本文件
LDSCRIPT    := $(SCRIPT_DIR)/stm32_flash.ld


/*stm32_flash.ld文件中最后部分内容*/
/DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libg.a ( * )
    libgcc.a ( * )
  }
这个ld脚本文件,该文件中已经包含了这些库。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分