Create directory
libs directory puts stm32 firmware library, src puts user source code, inc puts user header file
# mkdir libs src inc
- 1
Copy file
Copy stm32f10x? Stdperiph? Lib? V3.5.0 to the libs directory
Create Makefile.common
Create the Makefile.common file in the home directory. This is a general Makefile file file
#This file is included in the general Makefile, the libs Makefile and the src Makefile #Different optimize settings for library and source files can be realized by using arguments #Compiler optimize settings: # -O0 no optimize, reduce compilation time and make debugging produce the expected results (default). # -O1 optimize, reduce code size and execution time, without much increase of compilation time. # -O2 optimize, reduce code execution time compared to 'O1', increase of compilation time. # -O3 optimize, turns on all optimizations, further increase of compilation time. # -Os optimize for size, enables all '-O2' optimizations that do not typically increase code size and other code size optimizations. #Recommended optimize settings for release version: -O3 #Recommended optimize settings for debug version: -O0 #Valid parameters : # OptLIB=0 --> optimize library files using the -O0 setting # OptLIB=1 --> optimize library files using the -O1 setting # OptLIB=2 --> optimize library files using the -O2 setting # OptLIB=3 --> optimize library files using the -O3 setting # OptLIB=s --> optimize library files using the -Os setting # OptSRC=0 --> optimize source files using the -O0 setting # OptSRC=1 --> optimize source files using the -O1 setting # OptSRC=2 --> optimize source files using the -O2 setting # OptSRC=3 --> optimize source files using the -O3 setting # OptSRC=s --> optimize source files using the -Os setting TOP=$(shell readlink -f "$(dir $(lastword $(MAKEFILE_LIST)))") PROGRAM=main LIBDIR=$(TOP)/libs #Adust the following line to the library in use STMLIB=$(LIBDIR)/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries #Adjust TypeOfMCU in use, see CMSIS file "stm32f10x.h" #STM32F103RBT (128KB FLASH, 20KB RAM) --> STM32F10X_MD #TypeOfMCU=STM32F10X_MD #STM32F103RET (512KB FLASH, 64KB RAM) --> STM32F10X_HD #STM32F103ZET (512KB FLASH, 64KB RAM) --> STM32F10X_HD TypeOfMCU=STM32F10X_HD #============================================================================# TC=arm-none-eabi CC=$(TC)-gcc LD=$(TC)-ld -v OBJCOPY=$(TC)-objcopy AR=$(TC)-ar GDB=$(TC)-gdb INCLUDE=-I$(TOP)/inc INCLUDE+=-I$(STMLIB)/CMSIS/CM3/CoreSupport INCLUDE+=-I$(STMLIB)/CMSIS/CM3/DeviceSupport/ST/STM32F10x INCLUDE+=-I$(STMLIB)/STM32F10x_StdPeriph_Driver/inc COMMONFLAGS=-g -mcpu=cortex-m3 -mthumb COMMONFLAGSlib=$(COMMONFLAGS) #Commands for general Makefile and src Makefile ifeq ($(OptSRC),0) COMMONFLAGS+=-O0 InfoTextSrc=src (no optimize, -O0) else ifeq ($(OptSRC),1) COMMONFLAGS+=-O1 InfoTextSrc=src (optimize time+ size+, -O1) else ifeq ($(OptSRC),2) COMMONFLAGS+=-O2 InfoTextSrc=src (optimize time++ size+, -O2) else ifeq ($(OptSRC),s) COMMONFLAGS+=-Os InfoTextSrc=src (optimize size++, -Os) else COMMONFLAGS+=-O3 InfoTextSrc=src (full optimize, -O3) endif CFLAGS+=$(COMMONFLAGS) -Wall -Werror $(INCLUDE) CFLAGS+=-D $(TypeOfMCU) CFLAGS+=-D VECT_TAB_FLASH #Commands for libs Makefile ifeq ($(OptLIB),0) COMMONFLAGSlib+=-O0 InfoTextLib=libs (no optimize, -O0) else ifeq ($(OptLIB),1) COMMONFLAGSlib+=-O1 InfoTextLib=libs (optimize time+ size+, -O1) else ifeq ($(OptLIB),2) COMMONFLAGSlib+=-O2 InfoTextLib=libs (optimize time++ size+, -O2) else ifeq ($(OptLIB),s) COMMONFLAGSlib+=-Os InfoTextLib=libs (optimize size++, -Os) else COMMONFLAGSlib+=-O3 InfoTextLib=libs (full optimize, -O3) endif CFLAGSlib+=$(COMMONFLAGSlib) -Wall -Werror $(INCLUDE) CFLAGSlib+=-D $(TypeOfMCU) CFLAGSlib+=-D VECT_TAB_FLASH
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
Compile firmware library
First, compile the firmware library, compile the firmware library into a static library, and the application program can directly use the
Download address of startup.c file: http://download.csdn.net/download/zhangxuechao_/10266433
include ../../../../../Makefile.common LIBS+=libstm32.a CFLAGSlib+=-c all: $(LIBS) libstm32.a: @echo -n "Building $@ ..." cd $(STMLIB)/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ && \ $(CC) $(CFLAGSlib) system_stm32f10x.c cd $(STMLIB)/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm && \ $(CC) $(CFLAGSlib) startup.c cd $(STMLIB)/STM32F10x_StdPeriph_Driver/src && \ $(CC) $(CFLAGSlib) *.c \ -D"assert_param(expr)=((void)0)" $(AR) cr $(LIBDIR)/$@ \ $(STMLIB)/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.o \ $(STMLIB)/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup.o \ $(STMLIB)/STM32F10x_StdPeriph_Driver/src/*.o @echo "done." .PHONY: clean clean: rm -f $(STMLIB)/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.o rm -f $(STMLIB)/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup.o rm -f $(STMLIB)/STM32F10x_StdPeriph_Driver/src/*.o rm -f $(LIBDIR)/$(LIBS)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
Create ld file
Set up linker.ld file according to the memory and flash capacity of the chip
Download address of linker.ld file: http://download.csdn.net/download/zhangxuechao_/10266451
Here is where the file needs to be modified
MEMORY { /*Adust LENGTH to RAMsize of target MCU:*/ /*STM32F103RBT --> 20K*/ /*RAM (RWX) : ORIGIN = 0x20000000 , LENGTH = 20K*/ /*STM32F103RET --> 64K*/ /*STM32F103ZET --> 64K*/ RAM (RWX) : ORIGIN = 0x20000000 , LENGTH = 64K EXTSRAM (RWX) : ORIGIN = 0x68000000 , LENGTH = 0 /*Adust LENGTH to (FLASHsize - FeePROMsize) of target MCU:*/ /*STM32F103RBT --> 126K*/ /*FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 126K*/ /*STM32F103RET --> 508K*/ /*FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 508K*/ /*STM32F103ZET --> 508K*/ FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 508K /*Adust ORIGIN to (0x08000000 + (FLASHsize-FeePROMsize)) of target MCU*/ /*and adust LENGTH to FeePROMsize allocated:*/ /*STM32F103RBT --> 0x08000000+126K, 2K*/ EEMUL (RWX) : ORIGIN = 0x08000000+126K, LENGTH = 2K /*STM32F103RET --> 0x08000000+508K, 4K*/ /*EEMUL (RWX) : ORIGIN = 0x08000000+508K, LENGTH = 4K*/ }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
Compile user files
Compiling user applications into static libraries as well
include ../Makefile.common LIBS+=app.a CFLAGSlib+=-c all: $(LIBS) app.a: @echo -n "Building $@ ..." $(CC) $(CFLAGSlib) *.c $(AR) cr $@ *.o @echo "done." .PHONY: clean clean: rm -f *.o rm -f $(LIBS)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
Create master Makefile
In the home directory, create the main Makefile file
Compiling firmware libraries and user applications into executables
include Makefile.common LDFLAGS=$(COMMONFLAGS) -fno-exceptions -ffunction-sections -fdata-sections -L$(LIBDIR) -nostartfiles -Wl,--gc-sections,-Tlinker.ld LDLIBS+=-lm LDLIBS+=-lstm32 all: libs src $(CC) -o $(PROGRAM).elf $(LDFLAGS) \ -Wl,--whole-archive \ src/app.a \ -Wl,--no-whole-archive \ $(LDLIBS) $(OBJCOPY) -O ihex $(PROGRAM).elf $(PROGRAM).hex $(OBJCOPY) -O binary $(PROGRAM).elf $(PROGRAM).bin arm-none-eabi-readelf -a $(PROGRAM).elf > $(PROGRAM).info_elf arm-none-eabi-size -d -B -t $(PROGRAM).elf > $(PROGRAM).info_size arm-none-eabi-objdump -S $(PROGRAM).elf > $(PROGRAM).info_code arm-none-eabi-nm -t d -S --size-sort -s $(PROGRAM).elf > $(PROGRAM).info_symbol .PHONY: libs src clean libs: $(MAKE) -C libs/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src src: $(MAKE) -C src clean: rm -f $(PROGRAM).elf $(PROGRAM).hex $(PROGRAM).bin $(PROGRAM).info_elf $(PROGRAM).info_size rm -f $(PROGRAM).info_code rm -f $(PROGRAM).info_symbol