一、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 veneersSOURCE = .\SYSTEM\delay\delay.c .\SYSTEM\sys\sys.c .\SYSTEM\usart\usart.c .\HARDWARE\LED\led.c .\USER\test.c
START  = .\USER\startup_stm32f40_41xxx.sSOURCE_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.oINC +=  -I .\SYSTEM\delay -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\HARDWARE\LEDTEST:$(SOURCE_OBJ) $(START_OBJ) TEST1TEST1:$(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
│
└─USERstartup_stm32f40_41xxx.stest.c
 
四、STM32启动过程
- 初始化堆栈指针 SP = _initial_sp
 - 初始化程序计数器指针 PC = Reset_Handler
 - 设置堆和栈的大小
 - 初始化中断向量表
 - 配置外部SRAM作为数据存储器(可选)
 - 配置系统时钟,通过调用SystemInit函数(可选)
 - 调用C库中的 _main 函数初始化用户堆栈,最终调用 main 函数