diff --git a/Makefile b/Makefile index 074654a..5c1c04b 100644 --- a/Makefile +++ b/Makefile @@ -50,130 +50,6 @@ ADIRS := User AFILES := # Include paths -INCLUDES := Libraries/CMSIS/Core/Include \ - Libraries/CMSIS/Device/PY32F0xx/Include \ - $(CDIRS) - -##### Library Paths ############ - -# Library flags -LIB_FLAGS = $(MCU_TYPE) -# JLink device (Uppercases) -JLINK_DEVICE ?= $(shell echo $(MCU_TYPE) | tr '[:lower:]' '[:upper:]') -# PyOCD device (Lowercases) -PYOCD_DEVICE ?= $(shell echo $(MCU_TYPE) | tr '[:upper:]' '[:lower:]') -# Link descript file: -LDSCRIPT = Libraries/LDScripts/$(PYOCD_DEVICE).ld - - -ifneq (,$(findstring PY32F002B,$(MCU_TYPE))) - -# PY32F002B >>> -CFILES += Libraries/CMSIS/Device/PY32F0xx/Source/system_py32f002b.c - -ifeq ($(USE_LL_LIB),y) -CDIRS += Libraries/PY32F002B_LL_Driver/Src \ - Libraries/PY32F002B_LL_BSP/Src -INCLUDES += Libraries/PY32F002B_LL_Driver/Inc \ - Libraries/PY32F002B_LL_BSP/Inc -LIB_FLAGS += USE_FULL_LL_DRIVER -else -CDIRS += Libraries/PY32F002B_HAL_Driver/Src \ - Libraries/PY32F002B_HAL_BSP/Src -INCLUDES += Libraries/PY32F002B_HAL_Driver/Inc \ - Libraries/PY32F002B_HAL_BSP/Inc -endif -# Startup file -AFILES := Libraries/CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f002b.s -# PY32F002B <<< - -else ifneq (,$(findstring PY32F07,$(MCU_TYPE))) - -# PY32F07x >>> -CFILES += Libraries/CMSIS/Device/PY32F0xx/Source/system_py32f07x.c - -CDIRS += Libraries/PY32F07x_HAL_Driver/Src \ - Libraries/PY32F07x_HAL_BSP/Src -INCLUDES += Libraries/PY32F07x_HAL_Driver/Inc \ - Libraries/PY32F07x_HAL_BSP/Inc -LIB_FLAGS += USE_HAL_DRIVER -# Startup file -AFILES := Libraries/CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f072.s -# PY32F07 <<< - -else - -# PY32F002A,003,030 >>> -CFILES += Libraries/CMSIS/Device/PY32F0xx/Source/system_py32f0xx.c - -ifeq ($(USE_LL_LIB),y) -CDIRS += Libraries/PY32F0xx_LL_Driver/Src \ - Libraries/PY32F0xx_LL_BSP/Src -INCLUDES += Libraries/PY32F0xx_LL_Driver/Inc \ - Libraries/PY32F0xx_LL_BSP/Inc -LIB_FLAGS += USE_FULL_LL_DRIVER -else -CDIRS += Libraries/PY32F0xx_HAL_Driver/Src \ - Libraries/PY32F0xx_HAL_BSP/Src -INCLUDES += Libraries/PY32F0xx_HAL_Driver/Inc \ - Libraries/PY32F0xx_HAL_BSP/Inc -endif -# Startup file -ifneq (,$(findstring PY32F002A,$(LIB_FLAGS))) -AFILES := Libraries/CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f002a.s -endif -ifneq (,$(findstring PY32F003,$(LIB_FLAGS))) -AFILES := Libraries/CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f003.s -endif -ifneq (,$(findstring PY32F030,$(LIB_FLAGS))) -AFILES := Libraries/CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f030.s -endif -# PY32F002A,003,030 <<< - -endif - -######## Additional Libs ######## - -ifeq ($(USE_FREERTOS),y) -CDIRS += Libraries/FreeRTOS \ - Libraries/FreeRTOS/portable/GCC/ARM_CM0 - -CFILES += Libraries/FreeRTOS/portable/MemMang/heap_4.c - -INCLUDES += Libraries/FreeRTOS/include \ - Libraries/FreeRTOS/portable/GCC/ARM_CM0 -endif - -ifeq ($(USE_DSP),y) -CFILES += Libraries/CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c \ - Libraries/CMSIS/DSP/Source/BayesFunctions/BayesFunctions.c \ - Libraries/CMSIS/DSP/Source/CommonTables/CommonTables.c \ - Libraries/CMSIS/DSP/Source/ComplexMathFunctions/ComplexMathFunctions.c \ - Libraries/CMSIS/DSP/Source/ControllerFunctions/ControllerFunctions.c \ - Libraries/CMSIS/DSP/Source/DistanceFunctions/DistanceFunctions.c \ - Libraries/CMSIS/DSP/Source/FastMathFunctions/FastMathFunctions.c \ - Libraries/CMSIS/DSP/Source/FilteringFunctions/FilteringFunctions.c \ - Libraries/CMSIS/DSP/Source/InterpolationFunctions/InterpolationFunctions.c \ - Libraries/CMSIS/DSP/Source/MatrixFunctions/MatrixFunctions.c \ - Libraries/CMSIS/DSP/Source/QuaternionMathFunctions/QuaternionMathFunctions.c \ - Libraries/CMSIS/DSP/Source/StatisticsFunctions/StatisticsFunctions.c \ - Libraries/CMSIS/DSP/Source/SupportFunctions/SupportFunctions.c \ - Libraries/CMSIS/DSP/Source/SVMFunctions/SVMFunctions.c \ - Libraries/CMSIS/DSP/Source/TransformFunctions/TransformFunctions.c -INCLUDES += Libraries/CMSIS/DSP/Include \ - Libraries/CMSIS/DSP/PrivateInclude -endif - -ifeq ($(USE_EPAPER),y) -CDIRS += Libraries/EPaper/Lib \ - Libraries/EPaper/Examples \ - Libraries/EPaper/Fonts \ - Libraries/EPaper/GUI - -INCLUDES += Libraries/EPaper/Lib \ - Libraries/EPaper/Examples \ - Libraries/EPaper/Fonts \ - Libraries/EPaper/GUI -endif +INCLUDES := $(CDIRS) include ./rules.mk diff --git a/README.md b/README.md index 637a1f4..77e4ab8 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,15 @@ Frequency up to 72 MHz, 128 Kbytes of Flash memory, 16 Kbytes of SRAM, with more └── User # User application code ``` +## Use as a submodule + +If you prefer you may include this template as a submodule into your repository. +``` +git submodule add https://github.com/IOsetting/py32f0-template +sed 's/include \./include py32f0-template/' py32f0-template/Makefile > Makefile +``` +Then adjust the `Makefile` to your needs. + # Requirements * PY32F0 EVB or boards of PY32F002/003/030 series diff --git a/rules.mk b/rules.mk index 4750720..5be346a 100644 --- a/rules.mk +++ b/rules.mk @@ -12,28 +12,183 @@ AS = $(PREFIX)as LD = $(PREFIX)ld OBJCOPY = $(PREFIX)objcopy OBJDUMP = $(PREFIX)objdump -# `$(shell pwd)` or `.`, both works -TOP = . -BDIR = $(TOP)/$(BUILD_DIR) +BDIR := $(BUILD_DIR) + +# TOP is py32f0-template, SRC is user's base - identical in the simple case but need not be +TOP := $(dir $(lastword $(MAKEFILE_LIST))) +SRC := $(TOP:%py32f0-template/=%) +ifneq (,$(findstring ../,$(TOP))) + # py32f0-template is a neighbor to cwd, ensure proper build dir structure + SRC_PREFIX := ../$(notdir $(shell pwd))/ + ADIRS := $(ADIRS:%=$(SRC_PREFIX)%) + AFILES := $(AFILES:%=$(SRC_PREFIX)%) + CDIRS := $(CDIRS:%=$(SRC_PREFIX)%) + CFILES := $(CFILES:%=$(SRC_PREFIX)%) + CPPFILES := $(CPPFILES:%=$(SRC_PREFIX)%) +endif + +##### Library Paths ############ + +LIB := $(TOP)Libraries/ + +# Library flags +LIB_FLAGS += $(MCU_TYPE) +# JLink device (Uppercases) +JLINK_DEVICE ?= $(shell echo $(MCU_TYPE) | tr '[:lower:]' '[:upper:]') +# PyOCD device (Lowercases) +PYOCD_DEVICE ?= $(shell echo $(MCU_TYPE) | tr '[:upper:]' '[:lower:]') +# Link descript file: +LDSCRIPT ?= $(LIB)LDScripts/$(PYOCD_DEVICE).ld + + +ifneq (,$(findstring PY32F002B,$(MCU_TYPE))) + +# PY32F002B >>> +CFILES += $(LIB)CMSIS/Device/PY32F0xx/Source/system_py32f002b.c + +ifeq ($(USE_LL_LIB),y) +CDIRS += \ + $(LIB)PY32F002B_LL_Driver/Src \ + $(LIB)PY32F002B_LL_BSP/Src +INCLUDES += \ + $(LIB)PY32F002B_LL_Driver/Inc \ + $(LIB)PY32F002B_LL_BSP/Inc +LIB_FLAGS += USE_FULL_LL_DRIVER +else +CDIRS += \ + $(LIB)PY32F002B_HAL_Driver/Src \ + $(LIB)PY32F002B_HAL_BSP/Src +INCLUDES += + $(LIB)PY32F002B_HAL_Driver/Inc \ + $(LIB)PY32F002B_HAL_BSP/Inc +endif +# Startup file +AFILES += $(LIB)CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f002b.s +# PY32F002B <<< + +else ifneq (,$(findstring PY32F07,$(MCU_TYPE))) + +# PY32F07x >>> +CFILES += $(LIB)CMSIS/Device/PY32F0xx/Source/system_py32f07x.c + +CDIRS += \ + $(LIB)PY32F07x_HAL_Driver/Src \ + $(LIB)PY32F07x_HAL_BSP/Src +INCLUDES += \ + $(LIB)PY32F07x_HAL_Driver/Inc \ + $(LIB)PY32F07x_HAL_BSP/Inc +LIB_FLAGS += USE_HAL_DRIVER +# Startup file +AFILES += $(LIB)CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f072.s +# PY32F07 <<< + +else + +# PY32F002A,003,030 >>> +CFILES += $(LIB)CMSIS/Device/PY32F0xx/Source/system_py32f0xx.c + +ifeq ($(USE_LL_LIB),y) +CDIRS += \ + $(LIB)PY32F0xx_LL_Driver/Src \ + $(LIB)PY32F0xx_LL_BSP/Src +INCLUDES += \ + $(LIB)PY32F0xx_LL_Driver/Inc \ + $(LIB)PY32F0xx_LL_BSP/Inc +LIB_FLAGS += USE_FULL_LL_DRIVER +else +CDIRS += \ + $(LIB)PY32F0xx_HAL_Driver/Src \ + $(LIB)PY32F0xx_HAL_BSP/Src +INCLUDES += \ + $(LIB)PY32F0xx_HAL_Driver/Inc \ + $(LIB)PY32F0xx_HAL_BSP/Inc +endif +# Startup file +ifneq (,$(findstring PY32F002A,$(LIB_FLAGS))) +AFILES += $(LIB)CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f002a.s +endif +ifneq (,$(findstring PY32F003,$(LIB_FLAGS))) +AFILES += $(LIB)CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f003.s +endif +ifneq (,$(findstring PY32F030,$(LIB_FLAGS))) +AFILES += $(LIB)CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f030.s +endif +# PY32F002A,003,030 <<< + +endif + +######## Additional Libs ######## + +ifeq ($(USE_FREERTOS),y) +CDIRS += \ + $(LIB)FreeRTOS \ + $(LIB)FreeRTOS/portable/GCC/ARM_CM0 + +CFILES += $(LIB)FreeRTOS/portable/MemMang/heap_4.c + +INCLUDES += \ + $(LIB)FreeRTOS/include \ + $(LIB)FreeRTOS/portable/GCC/ARM_CM0 +endif + +ifeq ($(USE_DSP),y) +CFILES += \ + $(LIB)CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c \ + $(LIB)CMSIS/DSP/Source/BayesFunctions/BayesFunctions.c \ + $(LIB)CMSIS/DSP/Source/CommonTables/CommonTables.c \ + $(LIB)CMSIS/DSP/Source/ComplexMathFunctions/ComplexMathFunctions.c \ + $(LIB)CMSIS/DSP/Source/ControllerFunctions/ControllerFunctions.c \ + $(LIB)CMSIS/DSP/Source/DistanceFunctions/DistanceFunctions.c \ + $(LIB)CMSIS/DSP/Source/FastMathFunctions/FastMathFunctions.c \ + $(LIB)CMSIS/DSP/Source/FilteringFunctions/FilteringFunctions.c \ + $(LIB)CMSIS/DSP/Source/InterpolationFunctions/InterpolationFunctions.c \ + $(LIB)CMSIS/DSP/Source/MatrixFunctions/MatrixFunctions.c \ + $(LIB)CMSIS/DSP/Source/QuaternionMathFunctions/QuaternionMathFunctions.c \ + $(LIB)CMSIS/DSP/Source/StatisticsFunctions/StatisticsFunctions.c \ + $(LIB)CMSIS/DSP/Source/SupportFunctions/SupportFunctions.c \ + $(LIB)CMSIS/DSP/Source/SVMFunctions/SVMFunctions.c \ + $(LIB)CMSIS/DSP/Source/TransformFunctions/TransformFunctions.c +INCLUDES += \ + $(LIB)CMSIS/DSP/Include \ + $(LIB)CMSIS/DSP/PrivateInclude +endif + +ifeq ($(USE_EPAPER),y) +CDIRS += \ + $(LIB)EPaper/Lib \ + $(LIB)EPaper/Examples \ + $(LIB)EPaper/Fonts \ + $(LIB)EPaper/GUI + +INCLUDES += \ + $(LIB)EPaper/Lib \ + $(LIB)EPaper/Examples \ + $(LIB)EPaper/Fonts \ + $(LIB)EPaper/GUI +endif # For each direcotry, add it to csources -CSOURCES := $(foreach dir, $(CDIRS), $(shell find $(TOP)/$(dir) -maxdepth 1 -name '*.c')) +CSOURCES := $(foreach dir, $(CDIRS), $(shell find $(dir) -maxdepth 1 -name '*.c')) # Add single c source files to csources -CSOURCES += $(addprefix $(TOP)/, $(CFILES)) +CSOURCES += $(CFILES) # C++ files -CPPSOURCES := $(foreach dir, $(CDIRS), $(shell find $(TOP)/$(dir) -maxdepth 1 -name '*.cpp')) -CPPSOURCES += $(addprefix $(TOP)/, $(CPPFILES)) +CPPSOURCES := $(foreach dir, $(CDIRS), $(shell find $(dir) -maxdepth 1 -name '*.cpp')) +CPPSOURCES += $(CPPFILES) # Then assembly source folders and files -ASOURCES := $(foreach dir, $(ADIRS), $(shell find $(TOP)/$(dir) -maxdepth 1 -name '*.s')) -ASOURCES += $(addprefix $(TOP)/, $(AFILES)) +ASOURCES := $(foreach dir, $(ADIRS), $(shell find $(dir) -maxdepth 1 -iname '*.s')) +ASOURCES += $(AFILES) # Fill object files with c and asm files (keep source directory structure) -OBJS = $(CSOURCES:$(TOP)/%.c=$(BDIR)/%.o) -OBJS += $(CPPSOURCES:$(TOP)/%.cpp=$(BDIR)/%.o) -OBJS += $(ASOURCES:$(TOP)/%.s=$(BDIR)/%.o) +OBJS := $(CSOURCES:%.c=%.o) +OBJS += $(CPPSOURCES:%.cpp=%.o) +OBJS += $(patsubst %.s,%.o, \ + $(patsubst %.S,%.o,$(ASOURCES))) +OBJS := $(OBJS:../%=%) +OBJS := $(OBJS:%=$(BDIR)/%) + # d files for detecting h file changes -DEPS=$(CSOURCES:$(TOP)/%.c=$(BDIR)/%.d) +DEPS := $(OBJS:%.o=%.d) # Arch and target specified flags ARCH_FLAGS := -mcpu=cortex-m0plus @@ -50,7 +205,7 @@ TGT_CFLAGS ?= $(ARCH_FLAGS) $(DEBUG_FLAGS) $(OPT) -std=c17 $(addprefix -D, $(LIB # C++ flags TGT_CPPFLAGS ?= $(ARCH_FLAGS) $(DEBUG_FLAGS) $(OPT) -std=c++11 $(addprefix -D, $(LIB_FLAGS)) -Wall -ffunction-sections -fdata-sections # ASM flags -TGT_ASFLAGS ?= $(ARCH_FLAGS) $(DEBUG_FLAGS) $(OPT) -Wa,--warn +TGT_ASFLAGS ?= $(ARCH_FLAGS) $(DEBUG_FLAGS) $(OPT) $(addprefix -D, $(LIB_FLAGS)) -Wa,--warn # LD flags TGT_LDFLAGS ?= $(ARCH_FLAGS) -specs=nano.specs -specs=nosys.specs -lc -lm \ -Wl,-Map=$(BDIR)/$(PROJECT).map \ @@ -68,7 +223,10 @@ TGT_LDFLAGS += -u _printf_float endif # include paths -TGT_INCFLAGS := $(addprefix -I $(TOP)/, $(INCLUDES)) +INCLUDES += \ + $(LIB)CMSIS/Core/Include \ + $(LIB)CMSIS/Device/PY32F0xx/Include +TGT_INCFLAGS := $(addprefix -I , $(INCLUDES)) .PHONY: all clean flash echo @@ -92,27 +250,33 @@ echo: # include d files without non-exist warning -include $(DEPS) -# Compile c to obj -- should be `$(BDIR)/%.o: $(TOP)/%.c`, but since $(TOP) is base folder so non-path also works -$(BDIR)/%.o: %.c +# Compile c to obj +$(BDIR)/%.o: $(SRC)%.c @printf " CC\t$<\n" @mkdir -p $(dir $@) $(Q)$(CC) $(TGT_CFLAGS) $(TGT_INCFLAGS) -MT $@ -o $@ -c $< -MD -MF $(BDIR)/$*.d -MP -$(BDIR)/%.o: %.cpp +$(BDIR)/%.o: $(SRC)%.cpp @printf " XX\t$<\n" @mkdir -p $(dir $@) $(Q)$(XX) $(TGT_CPPFLAGS) $(TGT_INCFLAGS) -MT $@ -o $@ -c $< -MD -MF $(BDIR)/$*.d -MP # Compile asm to obj -$(BDIR)/%.o: %.s +$(BDIR)/%.o: $(SRC)%.s @printf " AS\t$<\n" @mkdir -p $(dir $@) $(Q)$(CC) $(TGT_ASFLAGS) -o $@ -c $< +# Compile asm to obj with preprocessing +$(BDIR)/%.o: $(SRC)%.S + @printf " AS\t$<\n" + @mkdir -p $(dir $@) + $(Q)$(CC) $(TGT_ASFLAGS) $(TGT_INCFLAGS) -o $@ -c $< -MD -MF $(BDIR)/$*.d -MP + # Link object files to elf -$(BDIR)/$(PROJECT).elf: $(OBJS) $(TOP)/$(LDSCRIPT) +$(BDIR)/$(PROJECT).elf: $(OBJS) $(LDSCRIPT) @printf " LD\t$(LDSCRIPT) -> $@\n" - $(Q)$(CC) $(TGT_LDFLAGS) -T$(TOP)/$(LDSCRIPT) $(OBJS) -o $@ + $(Q)$(CC) $(TGT_LDFLAGS) -T$(LDSCRIPT) $(OBJS) -o $@ # Convert elf to bin %.bin: %.elf @@ -134,10 +298,10 @@ clean: flash: $(BDIR)/$(PROJECT).elf ifeq ($(FLASH_PROGRM),jlink) - $(JLINKEXE) -device $(JLINK_DEVICE) -if swd -speed 4000 -JLinkScriptFile $(TOP)/Misc/jlink-script -CommanderScript $(TOP)/Misc/jlink-command + $(JLINKEXE) -device $(JLINK_DEVICE) -if swd -speed 4000 -JLinkScriptFile $(TOP)Misc/jlink-script -CommanderScript $(TOP)Misc/jlink-command else ifeq ($(FLASH_PROGRM),pyocd) - $(PYOCD_EXE) erase -t $(PYOCD_DEVICE) --chip --config $(TOP)/Misc/pyocd.yaml - $(PYOCD_EXE) load $< -t $(PYOCD_DEVICE) --config $(TOP)/Misc/pyocd.yaml + $(PYOCD_EXE) erase -t $(PYOCD_DEVICE) --chip --config $(TOP)Misc/pyocd.yaml + $(PYOCD_EXE) load $< -t $(PYOCD_DEVICE) --config $(TOP)Misc/pyocd.yaml else @echo "FLASH_PROGRM is invalid\n" endif