目录

Makefilemake工具编译STM32工程

目录

Makefile——make工具编译STM32工程

一、Makefile相关指令

1.1、变量

符号含义
=替换
+=追加
:=恒等于

1.2、隐含规则

符号含义
%.o任意的.o文件
*.o所有的.o文件

1.3、通配符

符号含义
$^所有依赖文件
$@所有目标文件
$<所有依赖文件的第一个文件

1.4、编译器指令常用参数功能说明

符号含义举例
-E预处理,主要是进行宏展开等步骤gcc -E test.c -> test.i
-S编译,生成汇编代码gcc -S test.c -> test.S
-c汇编:生成机器码gcc -c test.c -> test.o
-o指定文件名

二、Makefile文件

SHELL=cmd.exe
DIR = D:\LC\EE\Code\STM32F407\TEST
OBJ = OBJ
KEIL_PATH = D:\ProgramFiles\Keil_v5\Keil\ARM\ARMCC
ARMCC   = $(KEIL_PATH)\bin\armcc
ARMASM  = $(KEIL_PATH)\bin\armasm
ARMAR   = $(KEIL_PATH)\bin\armar  
ARMLINK = $(KEIL_PATH)\bin\armlink  
FROMELF = $(KEIL_PATH)\bin\fromelf  
  
TARGET = .\$(OBJ)\TEST
# OBJMAP := .\stm32.map 
OBJHTM := .\$(OBJ)*.htm  
OBJAXF := .\$(OBJ)*.axf  
 

CFLAGS := -c --cpu Cortex-M4.fp.sp -g -O1 --apcs=interwork --split_sections -D__UVISION_VERSION="541" -DSTM32F407xx -DSTM32F40_41xxx
CMACRO :=  
ASMFLAGS := --cpu Cortex-M4.fp.sp -g --apcs=interwork --pd "__UVISION_VERSION SETA 541" --pd "STM32F407xx SETA 1"
LINKFLAGS := --cpu=Cortex-M4.fp.sp
MAP := --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
INFO := --info sizes --info totals --info unused --info veneers

		
SOURCE = .\SYSTEM\delay\delay.c .\SYSTEM\sys\sys.c .\SYSTEM\usart\usart.c .\HARDWARE\LED\led.c .\USER\test.c
START  = .\USER\startup_stm32f40_41xxx.s

SOURCE_OBJ = $(SOURCE:%.c=%.o)
START_OBJ  = $(START:%.s=%.o)

OBJS = .\$(OBJ)\delay.o       .\$(OBJ)\sys.o     .\$(OBJ)\usart.o       .\$(OBJ)\led.o       .\$(OBJ)\test.o   .\$(OBJ)\startup_stm32f40_41xxx.o

INC +=  -I .\SYSTEM\delay -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\HARDWARE\LED


TEST:$(SOURCE_OBJ) $(START_OBJ) TEST1

TEST1:$(OBJS)
	@echo $(OBJS)
	$(ARMLINK) $(LINKFLAGS) $^  --strict --scatter .\$(OBJ)\TEST.sct $(MAP) $(INFO) --list $(TARGET).map -o $(TARGET).axf
	$(FROMELF) --i32combined -o $(TARGET).hex $(TARGET).axf


%.o:%.c
	$(ARMCC) $(CFLAGS) $(INC) $(CMACRO) -D__UVISION_VERSION="541" -DSTM32F407xx -DSTM32F40_41xxx  $< -o $@ 
	move $@ $(DIR)\$(OBJ)

%.o:%.s
	$(ARMASM) $(ASMFLAGS) $< -o $@ 
	move $@ $(DIR)\$(OBJ)

.PHONY : clean 
clean:  
	-del $(OBJS) .\output*.map .\output*.htm .\output*.axf .\output*.hex

三、STM32F407工程

D:.
│  Makefile
│  README
│
├─HARDWARE
│  └─LED
│          led.c
│          led.h
│
├─OBJ
│      delay.o
│      led.o
│      startup_stm32f40_41xxx.o
│      sys.o
│      TEST.axf
│      TEST.hex
│      TEST.htm
│      TEST.map
│      test.o
│      TEST.sct
│      usart.o
│
├─SYSTEM
│  │  readme.txt
│  │
│  ├─delay
│  │      delay.c
│  │      delay.h
│  │
│  ├─sys
│  │      core_cm4.h
│  │      core_cm4_simd.h
│  │      core_cmFunc.h
│  │      core_cmInstr.h
│  │      stm32f4xx.h
│  │      sys.c
│  │      sys.h
│  │      system_stm32f4xx.h
│  │
│  └─usart
│          usart.c
│          usart.h
│
└─USER
        startup_stm32f40_41xxx.s
        test.c

四、STM32启动过程

  1. 初始化堆栈指针 SP = _initial_sp
  2. 初始化程序计数器指针 PC = Reset_Handler
  3. 设置堆和栈的大小
  4. 初始化中断向量表
  5. 配置外部SRAM作为数据存储器(可选)
  6. 配置系统时钟,通过调用SystemInit函数(可选)
  7. 调用C库中的 _main 函数初始化用户堆栈,最终调用 main 函数