最近突然对STM32感兴趣,研究了一下。STM32的编译方式非常多,由于一直对gcc情有独钟,所以还是喜欢使用Makefile+gcc编译的方法。当时从51单片机转向AVR单片机开发时,也是通过这种方式,那时已经使用Notepad++了,如今也一起在使用。

Makefile模板如下:

# STM32F103 Makefile模板
# 参考来源:
# https://github.com/andytt/stm32_template
# https://github.com/latelee/Makefile_templet
# 使用:
# make         #默认编译:调试版本,不输出详细编译过程
# make debug=n # release版本,不输出详细编译过程
# make V=1     # 调试版本,输出详细编译过程
# make debug=n V=1 # release版本,输出详细编译过程
#
# 为加快编译,make可加“-j”选项。
# 本Makefile不需要手动添加头文件/源码目录,会自动查找。
# 目的是为了工程的方便而牺牲一点编译时间。
# 可能需要修改的地方使用“!!!===”标示出来
# TODO:为尽量减少二进制文件体积,需要将不调用的函数剔除,
# 但又要保存源码文件(防止后面需要用到)
#
# log:
# 2018.12.10: 首版完成
#################################################!!!=== 交叉编译器
CROSS_COMPILE = arm-none-eabi-
CC  = $(CROSS_COMPILE)gcc
AS  = $(CROSS_COMPILE)gcc -x assembler-with-cpp
CP  = $(CROSS_COMPILE)objcopy
AR  = $(CROSS_COMPILE)ar
SIZE  = $(CROSS_COMPILE)size
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -SMKDIR_P ?= mkdir -p#!!!=== 目标文件名,注:下面会生成$(target).hex等文件
target = target#!!!=== 是否调试版本,如是,设置为y,反之,为n
debug  = n#!!!=== 编译目录
BUILD_DIR = build#!!!=== 头文件目录,在当前目录下搜索所有目录,将其当成头文件目录
INC := $(shell find ./ -type d)
INCDIRS := $(addprefix -I, $(INC))######################################
# C源码文件
#注:find会递归查找项目目录所有.c文件,如c文件不必要,则要删除,否则可能会编译出错
C_SOURCES =  $(shell find ./ -name '*.c')#!!!=== 启动汇编文件
ASM_SOURCES = $(shell find ./ -name '*.s') #app/startup_stm32f103xe.s
# TODO:其它目录在此列出# float-abi 如不支持,则不填写
FLOAT-ABI =
FPU = # 目标芯片特有编译指令
MCU = -mcpu=cortex-m3 -mthumb $(FPU) $(FLOAT-ABI)# c编译标志
CFLAGS = $(MCU) $(DEFS) $(INCDIRS) -std=c99 -Wall -Wfatal-errors \-MMD -fdata-sections -ffunction-sections
ASFLAGS = $(CFLAGS) $(AS_DEFS)# debug或release版本选择
ifeq ($(debug), y)CFLAGS += -g -gdwarf-2
elseCFLAGS += -O2 -s # 或者-Og
endif# AS宏定义
AS_DEFS = #!!!=== C宏定义
# STM32F103必须定义USE_STDPERIPH_DRIVER和STM32F10X_HD
# USE_FREERTOS 使用freertos系统
# USE_UCOSII   使用ucos-ii系统
# OS_SUPPORT   使用了OS(在GUI源码中使用到此宏)
DEFS_STR += STM32F10X_HD USE_STDPERIPH_DRIVER OS_SUPPORT USE_FREERTOS
DEFS     := $(addprefix -D, $(DEFS_STR))#!!!=== 链接脚本文件
LDSCRIPT = $(shell find ./ -name '*.ld') #app/STM32F103XE_FLASH.ld#!!!=== 静态库名称
LIBS = -lc -lm -lnosys
LIBS += $(shell find ./ -name '*.a') # STemWin526_CM3_OS_GCC.a
# 其它库目录
LIBDIR =
# 链接标志
#  添加-specs=rdimon.specs会造成close/seek与nosys库冲突
# nano库实现相应C库的功能,但体积会更小
LDFLAGS = $(MCU) -T$(LDSCRIPT) $(LIBDIR) $(LIBS) \-Wl,-Map=$(BUILD_DIR)/$(target).map,--cref -Wl,--gc-sections \-specs=nosys.specs -specs=nano.specs ifeq ($(V),1)
Q=
NQ=true
else
Q=@
NQ=echo
endif# default action: build all
all: $(BUILD_DIR)/$(target).out $(BUILD_DIR)/$(target).hex $(BUILD_DIR)/$(target).bin#######################################
## 目标文件规则(由.c .s产生.o的规则)
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))DEPS := $(OBJECTS:.o=.d)# 编译.c .s文件
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)@$(NQ) "Compiling: " $(basename $(notdir $@)).c$(Q)$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)@$(NQ) "Assembling: " $(basename $(notdir $@)).s$(Q)$(AS) -c $(CFLAGS) $< -o $@# 生成out hex bin文件
$(BUILD_DIR)/$(target).out: $(OBJECTS) Makefile@$(NQ) "linking..."@$(NQ) "Creating file..." $(notdir $@)$(Q)$(CC) $(OBJECTS) $(LDFLAGS) -o $@$(Q)$(SIZE) $@$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.out | $(BUILD_DIR)@$(NQ) "Creating hex file..." $(notdir $@)$(Q)$(HEX) $< $@$(Q)mv $@ .$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.out | $(BUILD_DIR)@$(NQ) "Generating bin file..." $(notdir $@)$(Q)$(BIN) $< $@    #$(Q)mv $@ .$(BUILD_DIR):$(Q)$(MKDIR_P) $@        ## 清理文件
clean:@$(NQ) "Cleaning..."$(Q)@-rm -fR .dep $(BUILD_DIR)$(Q)@find . -iname '*.o' -o -iname '*.bak' -o -iname '*.d' | xargs rm -f## 烧录命令
flash:st-flash write $(BUILD_DIR)/$(target).bin 0x8000000
## 擦除命令
erase:st-flash erase.PHONY: all clean flash erase## 依赖文件
-include $(DEPS)

李迟 2019.1.11 凌晨睡前

一个STM32编译Makefile模板相关推荐

  1. 一个通用的Makefile模板-转

    使用前需要在当前目录下建立一个obj文件夹,用来存放中间文件.*.d文件中包含了对应*.c的依赖文件,*.o文件为对应*.c文件的目标文件. 详细的Makfile资料可以看看GNU make中文手册和 ...

  2. 一个简单的Makefile模板

    FLAGS = -Wall -g INCLUDE=-I$(ACE_ROOT)/include ACE_LIB=-L$(ACE_ROOT)/lib N_LIB=-lACE DD=-DACE_HAS_EV ...

  3. 关于中型工程的Makefile模板

    我们定义的中型工程 可能会有多层嵌套的源代码文件夹 一个源代码文件夹下可能有多个源代码子文件夹 中间文件应当在其源文件所在目录生成,而不是同一生成到一个目录下(如统一生成到obj目录下) (大多数情况 ...

  4. 万能 Makefile 模板

    在 Linux 编程时,对于很多小工程来说,很多时候似乎没有必要用 autoconf 和 automake 工具来生成 Makefile,反而自己写一个 Makefile 更省事.这里给大家提供一个简 ...

  5. 一个适用各类场合的Makefile模板

    1.写在前面 对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了"一键编译",编码完成后只需一个操作即可完成编译.链接.生成目标文件.Linu ...

  6. 一个使用多年的Makefile模板

    layout: post title: category : linux系统 tags : [Makefile] 许久以前,一直使用自己总结的Makefile模板,这个模板也是基于现有资料整理而成的. ...

  7. 一个stm32的简单程序的编译

    一个stm32的简单程序的编译 stm32程序-LED 总结 stm32程序-LED 一.建立一个工程 1.打开Keil uVision5,找到project,然后点击New uVision Proj ...

  8. 一个stm32简单程序的编译

    MDK 是 Microcontroller Development Kit 的缩写,ARM 公司出品,是目前针对 ARM 处理器,尤其是 Cortex-M 内核处理器的最佳开发工具. 目录 一.MDK ...

  9. 用FPGA搭建一个STM32内核?

    1.必要的基础知识 为了更快的完成在FPGA上实现ARM Cortex-M3软核,一些必要的基础知识还是要有的! FPGA开发基础知识,如FPGA开发流程,设计.综合.布局.布线.约束.下载 Xili ...

最新文章

  1. Libevent调用
  2. LeetCode--014--最长公共前缀(java)
  3. Hadoop HA 深度解析
  4. git patch 应用
  5. centos 升级内核方法
  6. mysql query cache 查询缓存
  7. 如何从JQuery中的each()函数中断/退出? [重复]
  8. ArrayList 类方法toArray的一点疑惑
  9. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
  10. 大写日期转换器(大写日期转换器)
  11. FFT+NNT 深入学习记录 秦皇岛camp 乒乓球
  12. 乐理小课堂——自然/和声/旋律大调的调式音阶
  13. 初窥门径——字典的更好使用方式
  14. 上海黄金交易所交易操作基本知识
  15. onenote冲突服务器显示,ONENOTE同步分区失败,显示“正在等待另一个设备完成上载您的笔记”?...
  16. 2020CTF笔记crypto部分
  17. 自动计数报警器c语言程序,计数报警器电路设计方案汇总(多款模拟电路设计原理图详解)...
  18. 使用TestProject Python SDK创建移动Appium测试
  19. Navicat连接oracleTNS无监听程序解决方法
  20. MAT Memory Analyzer Tool 插件安装(图解)

热门文章

  1. 知网又火了!续订费近千万且连年上涨 中科院:不堪重负 停用
  2. 1月至今 微信共对超十万个确认存在欺诈行为的帐号进行了阶梯式处理
  3. 盒马申请多个“屁股脸”商标被驳回!其IP盒马先生被网友戏称:“屁股脸”...
  4. 苹果推送iOS 15系统正式版:实况文本等功能上线
  5. 美国国家公路交通安全管理局对特斯拉Autopilot系统展开正式调查
  6. 100家店干翻17000家药店!刘强东最恐惧的对手来了!
  7. 中信证券:维持贝壳“买入”的投资评级
  8. 阿里云盘今日公测:无论用户是否付费,未来都不会限速
  9. 一加Z配置细节曝光:处理器大变 为了更好的进入欧洲市场?
  10. 离开张小龙后,她要做一款与微信互补的社交产品