Developing STM32 in ubuntu environment

Keywords: Makefile Linker shell

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

Posted by s0me0ne on Thu, 14 Nov 2019 08:21:46 -0800