stm32 在windows下 使用gcc 编译的makefile脚本

cygwin_build.bat

@ECHO OFF

::----------------------------------------------------------
:: configure cross compiler path
::----------------------------------------------------------
SET COMPILER_ROOT_PATH=d:/arm-2013-11
SET COMPILER_PATH=D:\arm-2013-11
SET COMPILER_BIN=%COMPILER_PATH%\bin

::----------------------------------------------------------
:: configure Cygwin path
::----------------------------------------------------------
SET CYGWIN_ROOT=d:\cygwin

::----------------------------------------------------------
:: regular configuration, need not change
::----------------------------------------------------------
SET LANG=C.UTF-8
SET PATH=C:\WINDOWS\system32;C:\WINDOWS
SET PATH=%CYGWIN_ROOT%\bin;%COMPILER_BIN%;%PATH%
SET HOME=%~dp0

::----------------------------------------------------------
:: show system settings on start
::----------------------------------------------------------
@ECHO =======================================
@ECHO      HOME = %HOME%
@ECHO      COMPILER_PATH = %COMPILER_PATH%
@ECHO      CYGWIN_ROOT = %CYGWIN_ROOT%
@ECHO =======================================

@bash --login -i


makefile如下:

#*******************************************************************************    
# Copyright (c) 2013 semilog Tech LTD. ALL rights reserved.             
#
# Filename: Makefile
# Author: gaowei    [email protected]
# Date: 2017-05-28
# Version: 0.2
# Description: Created for build stm32 project under windows by using arm gcc
#
# ----------------------------- History --------------------------------------
# Author:
# Date:
# Modification: 
#********************************************************************************/
# ------------------------------------------------------------------------------ #
# include other file
# ------------------------------------------------------------------------------ #
include drv_config.mk

# ------------------------------------------------------------------------------ #
#  system configure
# ------------------------------------------------------------------------------ #
CPU = cortex-m3
ARCH = armv7-m
PROJECT = RF_machine
LD_SCRIPT_FILE = stm32_flash.ld

# ------------------------------------------------------------------------------ #
# Compiler configuration
# ------------------------------------------------------------------------------ #
COMPILER_ROOT = $(COMPILER_ROOT_PATH)
CROSS_COMPILE = $(COMPILER_ROOT)/bin/arm-none-eabi-

# ------------------------------------------------------------------------------ #
#  Path
# ------------------------------------------------------------------------------ #
USER_DIR = ../source/user
DRIVER_DIR = ../source/driver
OUTPUT_DIR = ../output
BIN_DIR = ../bin

# ------------------------------------------------------------------------------ #
#  default
# ------------------------------------------------------------------------------ #
default: all

# ------------------------------------------------------------------------------ #
# Compiler tools
# ------------------------------------------------------------------------------ #
AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm
STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump
SIZE		= $(CROSS_COMPILE)size

# ------------------------------------------------------------------------------ #
#  shell command
# ------------------------------------------------------------------------------ #
CD    = cd
MKDIR = mkdir -p
RMDIR = rm -rf
RM    = rm -f
SED   = sed
ECHO  = echo
COPY  = cp
CAT   = cat
MV    = mv
TEST  = test

# ------------------------------------------------------------------------------ #
# DEFINE
# ------------------------------------------------------------------------------ #
DEFINE = -DUSE_STDPERIPH_DRIVER
DEFINE += -DSTM32F10X_HD
DEFINE += -DDEBUG

# ------------------------------------------------------------------------------ #
# INCLUDE
# ------------------------------------------------------------------------------ #
INCLUDE  = -I$(USER_DIR)/inc
INCLUDE	+= -I$(DRIVER_DIR)/stm32_lib/inc
INCLUDE	+= -I$(DRIVER_DIR)/CMSIS/CoreSupport
INCLUDE	+= -I$(DRIVER_DIR)/CMSIS/STM32F10x

# ------------------------------------------------------------------------------ #
# INCLUDE
# ------------------------------------------------------------------------------ #
LDLIBS = -L$(COMPILER_ROOT)/arm-none-eabi/lib
LDLIBS += -L$(COMPILER_ROOT)/lib/gcc/arm-none-eabi/4.8.1

# ------------------------------------------------------------------------------ #
# CCFLAGS
# ------------------------------------------------------------------------------ #
CCFLAGS = -mcpu=$(CPU) -march=$(ARCH) 
CCFLAGS += -mthumb -mthumb-interwork
CCFLAGS += -mapcs-frame -mabi=aapcs
CCFLAGS += -mfloat-abi=softfp
CCFLAGS += -mlittle-endian
CCFLAGS += -fdata-sections -ffunction-sections -fsigned-char
CCFLAGS += -fmessage-length=0
CCFLAGS += -Og -gdwarf-2 
CCFLAGS += -Wall -Wextra

DEPFLAGS = -Wp,-MT,$@,-MMD,$(patsubst %.o,%.d,$@)
#DEPFLAGS = -MT $@ -MMD -MP -MF $(patsubst %.o,%.d,$@)

# ------------------------------------------------------------------------------ #
# ASFLAGS
# ------------------------------------------------------------------------------ #
ASFLAGS = -mcpu=$(CPU) -march=$(ARCH)
ASFLAGS += -mthumb -mthumb-interwork 
ASFLAGS += -mapcs-frame -mapcs-32
ASFLAGS += -mfloat-abi=softfp
ASFLAGS += -mlittle-endian
ASFLAGS += --warn -gdwarf-2
ASFLAGS += -adhlns=$(patsubst %.o,%.lst,$@)
ASFLAGS += --MD $(patsubst %.o,%.d,$@)

# ------------------------------------------------------------------------------ #
# ARFLAGS
# ------------------------------------------------------------------------------ #
ARFLAGS = -rc

# ------------------------------------------------------------------------------ #
# LDFLAGS
# ------------------------------------------------------------------------------ #
LDFLAGS  = --script=$(LD_SCRIPT_FILE)
LDFLAGS += --Map=$(OUTPUT_DIR)/$(PROJECT).map
LDFLAGS += --gc-sections 
LDFLAGS += --cref

# ------------------------------------------------------------------------------ #
# ELF To bin  hex  s19
# ------------------------------------------------------------------------------ #
# intel 32 bit hex
ELF2HEXOUT = -O ihex

# motorola 32 bit hex
ELF2S19OUT = -O srec

# plain bin
ELF2BINOUT = -O binary

# ------------------------------------------------------------------------------ #
# C Source file
# ------------------------------------------------------------------------------ #
USER_SRC = $(wildcard $(USER_DIR)/src/*.c)

DRIVER_SRC = $(wildcard $(DRIVER_DIR)/CMSIS/CoreSupport/*.c)
DRIVER_SRC += $(wildcard $(DRIVER_DIR)/CMSIS/STM32F10x/*.c)
DRIVER_SRC += $(addprefix $(DRIVER_DIR)/stm32_lib/src/, $(LIB_SRC))

#all C Source files
C_SOURCE = $(USER_SRC) $(DRIVER_SRC)

# the c objects lists
USER_OBJECTS = $(addprefix $(OUTPUT_DIR)/, $(subst .c,.o, $(notdir $(USER_SRC))))
DRIVER_OBJECTS = $(addprefix $(OUTPUT_DIR)/, $(subst .c,.o, $(notdir $(DRIVER_SRC))))

# ------------------------------------------------------------------------------ #
# AS Source file
# ------------------------------------------------------------------------------ #
STARTUP_SRC = $(wildcard $(DRIVER_DIR)/CMSIS/STM32F10x/startup/*.s)

# all asm Source files
ASM_SOURCE = $(STARTUP_SRC)

# all asm objects lists
STARTUP_OBJECTS = $(addprefix $(OUTPUT_DIR)/, $(subst .s,.o, $(notdir $(STARTUP_SRC))))

DRIVER_OBJECTS += $(STARTUP_OBJECTS) 
#===============================================================================
#  Compile
#===============================================================================
ALL_OBJECTS = $(USER_OBJECTS) $(DRIVER_OBJECTS) 

$(OUTPUT_DIR)/%.o:$(USER_DIR)/src/%.c
	@$(ECHO) Compile $<
	@-$(MKDIR) $(OUTPUT_DIR)	
	@$(CC) $(CCFLAGS) $(DEFINE) $(INCLUDE) $(DEPFLAGS) -c $< -o $@
	@$(ECHO) Done!

$(OUTPUT_DIR)/%.o:$(DRIVER_DIR)/stm32_lib/src/%.c
	@$(ECHO) Compile $<
	@-$(MKDIR) $(OUTPUT_DIR)
	@$(CC) $(CCFLAGS) $(DEFINE) $(INCLUDE) $(DEPFLAGS) -c $< -o $@
	@$(ECHO) Done!

$(OUTPUT_DIR)/%.o:$(DRIVER_DIR)/CMSIS/CoreSupport/%.c
	@$(ECHO) Compile $<
	@-$(MKDIR) $(OUTPUT_DIR)	
	@$(CC) $(CCFLAGS) $(DEFINE) $(INCLUDE) $(DEPFLAGS) -c $< -o $@
	@$(ECHO) Done!	

$(OUTPUT_DIR)/%.o:$(DRIVER_DIR)/CMSIS/STM32F10x/%.c
	@$(ECHO) Compile $<
	@-$(MKDIR) $(OUTPUT_DIR)	
	@$(CC) $(CCFLAGS) $(DEFINE) $(INCLUDE) $(DEPFLAGS) -c $< -o $@
	@$(ECHO) Done!	

$(OUTPUT_DIR)/%.o:$(DRIVER_DIR)/CMSIS/STM32F10x/startup/%.s
	@$(ECHO) Compile $<
	@-$(MKDIR) $(OUTPUT_DIR)	
	@$(AS) $(ASFLAGS) $< -o $@
	@$(ECHO) Done!

#===============================================================================
#  user code Compile
#===============================================================================
user: $(USER_OBJECTS)

USER_CLEAN_OBJ = $(USER_OBJECTS)
USER_CLEAN_DEP = $(subst .o,.d, $(USER_CLEAN_OBJ))

userclean:
	-$(RM) $(USER_CLEAN_OBJ)
	-$(RM) $(USER_CLEAN_DEP)
	@$(ECHO) ""
	@$(ECHO) "-------------------------------------"
	@$(ECHO) "--- User objs clean have done. ---"
	@$(ECHO) "-------------------------------------"

#===============================================================================
#  driver Compile (STM32 standard peripheral lib)
#===============================================================================
DRIVER_LIB = $(OUTPUT_DIR)/stm32_dirver.a 

driver: $(DRIVER_LIB)
$(DRIVER_LIB): $(DRIVER_OBJECTS) 
	@$(ECHO) ""
	@$(AR) $(ARFLAGS) $@ $(DRIVER_OBJECTS)
	@$(ECHO) "======================================="
	@$(ECHO) "--- make stm32 driver $@ done."
	@$(ECHO) "======================================="
	@$(ECHO) ""
	
DRIVER_CLEAN_OBJ = $(DRIVER_OBJECTS)
DRIVER_CLEAN_DEP = $(subst .o,.d,$(DRIVER_CLEAN_OBJ))
DRIVER_CLEAN_LIB = $(DRIVER_LIB)

driverclean:
	-$(RM) $(DRIVER_CLEAN_OBJ)
	-$(RM) $(DRIVER_CLEAN_DEP)
	-$(RM) $(DRIVER_CLEAN_LIB)
	@$(ECHO) ""
	@$(ECHO) "-------------------------------------"
	@$(ECHO) "--- DRIVER objs clean have done. ---"
	@$(ECHO) "-------------------------------------"

#===============================================================================
#  link
#===============================================================================
link: $(BIN_DIR)/$(PROJECT).elf HEX_OUT S19_OUT BIN_OUT

$(BIN_DIR)/$(PROJECT).elf: $(USER_OBJECTS) $(DRIVER_LIB)
	@$(ECHO) "--- Linking $@"
	@$(TEST) -d $(BIN_DIR) || $(MKDIR) $(BIN_DIR)
	@$(LD) $(LDFLAGS) $(LDLIBS) -o $@ $^
	@$(SIZE) --format=berkeley -d $@
	@$(ECHO) "done"

HEX_OUT: $(BIN_DIR)/$(PROJECT).hex

S19_OUT: $(BIN_DIR)/$(PROJECT).s19

BIN_OUT: $(BIN_DIR)/$(PROJECT).bin

$(BIN_DIR)/$(PROJECT).hex: $(BIN_DIR)/$(PROJECT).elf
	@$(ECHO) "--- Generating Intel 32bit Hex file $@"
	@$(OBJCOPY) $(ELF2HEXOUT) $< $@	

$(BIN_DIR)/$(PROJECT).s19: $(BIN_DIR)/$(PROJECT).elf
	@$(ECHO) "--- Generating Motorola 32bit Hex file $@"
	@$(OBJCOPY) $(ELF2S19OUT) $< $@	
	
$(BIN_DIR)/$(PROJECT).bin: $(BIN_DIR)/$(PROJECT).elf
	@$(ECHO) "--- Generating plain bin file $@"
	@$(OBJCOPY) $(ELF2BINOUT) $< $@
	
linkclean:
	-$(RM) $(BIN_DIR)/*.elf
	-$(RM) $(BIN_DIR)/*.hex
	-$(RM) $(BIN_DIR)/*.map
	@$(ECHO) ""
	@$(ECHO) "-------------------------------------"
	@$(ECHO) "--- Link clean have done. ---"
	@$(ECHO) "-------------------------------------"
#===============================================================================
#  make all
#  make allclean
#===============================================================================
all: user driver link

allclean: userclean driverclean linkclean

#===============================================================================
#  help
#===============================================================================
help:
	@$(ECHO) "  make: all user cmsis fwlib link    "
	@$(ECHO) ""
	@$(ECHO) "================ Make help ===================="
	@$(ECHO) "make                make all"
	@$(ECHO) "make all[clean]     compile all && link"
	@$(ECHO) "make link[clean]    link all"
	@$(ECHO) "make user[clean]    build user code"
	@$(ECHO) "make driver[clean]  build stm32 standard std driver"
	@$(ECHO) ""
	@$(ECHO) ""
	
#===============================================================================
#  clean
#===============================================================================
clean: cleanall
cleanall:
	-$(RM) $(OUTPUT_DIR)/*.d
	-$(RM) $(OUTPUT_DIR)/*.o
	-$(RM) $(OUTPUT_DIR)/*.map
	-$(RM) $(OUTPUT_DIR)/*.lst
	-$(RM) $(OUTPUT_DIR)/*.a
	-$(RM) $(BIN_DIR)/*.elf
	-$(RM) $(BIN_DIR)/*.hex
	-$(RM) $(BIN_DIR)/*.s19
	-$(RM) $(BIN_DIR)/*.bin
	@$(ECHO) "-------------------------------------"
	@$(ECHO) "--- Clean all have done. ---"
	@$(ECHO) "-------------------------------------"
	@$(ECHO) ""

#===============================================================================
#  include dependency files
#===============================================================================
-include $(wildcard $(OUTPUT_DIR)/*.d)

.PHONY: all clean default user driver userclean driverclean linkclean help \
		HEX_OUT S19_OUT BIN_OUT
			
#----------------------------- end of Makefile ----------------------------------

drv_config.mk文件:

#*******************************************************************************    
# Copyright (c) 2013 semilog Tech LTD. ALL rights reserved.             
#
# Filename: drv_config.mk
# Author: semilog    [email protected]
# Date: 2017-05-27
# Version: 0.1
# Description: Created for configuration of stm32 peripheral devices
#
# ----------------------------- History --------------------------------------
# Author:
# Date:
# Modification: 
#********************************************************************************/
# ------------------------------------------------------------------------------
# chose the needed stem32 peripheral modules
# ------------------------------------------------------------------------------
USE_ADC = yes
USE_BKP = no
USE_CAN = no
USE_CEC = no
USE_CRC = yes
USE_DAC = yes
USE_DBGMCU = no
USE_DMA = yes
USE_EXTI = yes
USE_FLASH = no
USE_FSMC = no
USE_GPIO = yes
USE_I2C = yes
USE_IWDG = no
USE_PWR = yes
USE_RCC = yes
USE_RTC = yes
USE_SDIO = no
USE_SPI = no
USE_TIM = yes
USE_USART = yes
USE_WWDG = no

# ------------------------------------------------------------------------------
# modules Define
# ------------------------------------------------------------------------------
LIB_SRC = misc.c

ifeq ($(USE_ADC),yes)
LIB_SRC += stm32f10x_adc.c
endif

ifeq ($(USE_BKP),yes)
LIB_SRC += stm32f10x_bkp.c
endif

ifeq ($(USE_CAN),yes)
LIB_SRC += stm32f10x_can.c
endif

ifeq ($(USE_CEC),yes)
LIB_SRC += stm32f10x_cec.c
endif

ifeq ($(USE_CRC),yes)
LIB_SRC += stm32f10x_crc.c
endif

ifeq ($(USE_DAC),yes)
LIB_SRC += stm32f10x_dac.c
endif

ifeq ($(USE_DBGMCU),yes)
LIB_SRC += stm32f10x_dbgmcu.c
endif

ifeq ($(USE_DMA),yes)
LIB_SRC += stm32f10x_dma.c
endif

ifeq ($(USE_EXTI),yes)
LIB_SRC += stm32f10x_exti.c
endif

ifeq ($(USE_FLASH),yes)
LIB_SRC += stm32f10x_flash.c
endif

ifeq ($(USE_FSMC),yes)
LIB_SRC += stm32f10x_fsmc.c
endif

ifeq ($(USE_GPIO),yes)
LIB_SRC += stm32f10x_gpio.c
endif

ifeq ($(USE_I2C),yes)
LIB_SRC += stm32f10x_i2c.c
endif

ifeq ($(USE_IWDG),yes)
LIB_SRC += stm32f10x_iwdg.c
endif

ifeq ($(USE_PWR),yes)
LIB_SRC += stm32f10x_pwr.c
endif

ifeq ($(USE_RCC),yes)
LIB_SRC += stm32f10x_rcc.c
endif

ifeq ($(USE_RTC),yes)
LIB_SRC += stm32f10x_rtc.c
endif

ifeq ($(USE_SDIO),yes)
LIB_SRC += stm32f10x_sdio.c
endif

ifeq ($(USE_SPI),yes)
LIB_SRC += stm32f10x_spi.c
endif

ifeq ($(USE_TIM),yes)
LIB_SRC += stm32f10x_tim.c
endif

ifeq ($(USE_USART),yes)
LIB_SRC += stm32f10x_usart.c
endif

ifeq ($(USE_WWDG),yes)
LIB_SRC += stm32f10x_wwdg.c
endif


猜你喜欢

转载自blog.csdn.net/semilog/article/details/72937840