Prequistes
一、Cubemx 导出
1.1 Makefile 文件架构
- TARGET
- building
- DEBUG = 1
- OPT = -Og
- paths
- BUILD_DIR
- source
- C_SOURCES
- ASM_SOURCES
- binaries
- CC
- AS
- CP
- SZ
- HEX
- BIN
- CFLAGS
- CPU
- FPU - 指定浮点单元
- FLOAT-ABI
- MCU
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
- AS_DEFS
- C_DEFS
- AS_INCLUDES
- C_INCLUDES
- ASFLAGS
- CFLAGS
CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
- LDFLAGS
- LDSCRIPT
- LIBS
- LIBDIR
- LDFLAGS
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
1.2 编译参数说明
参数 | 说明 | ㅤ |
目标架构 | ㅤ | ㅤ |
-mcpu=cortex-m3 | 指定芯片内核(必需) | cortex-a8、cortex-m3、cortex-m4 |
- march=<architecture> | 指定目标处理器的体系结构 | armv7-a |
-mfpu=fpv4-sp-d16 | 指定浮点单元 | 1. 使用 VFPv4 浮点单元,支持单精度浮点运算,并且支持双精度浮点数,大小为 16 位。
2. “neon”是“neon-vfpv3”的别名, “vfp” 是 “vfpv2” 的别名。 |
-mfloat-abi=hard | 指定使用硬件浮点单元 | -mfloat-abi=soft: 完全使用软件浮点实现。
-mfloat-abi=softfp: 使用软件实现的浮点运算,但使用硬件寄存器传递浮点参数和返回浮点值。
-mfloat-abi=hard: 使用硬件浮点单元。 |
-mthumb | 指定使用 Thumb 指令集。(必需) | ㅤ |
优化选项 | ㅤ | ㅤ |
-O0 | 指定优化级别(从无优化到高优化)。 | 1. -O0 , -O1 , -O2 , -O3 : 指定优化级别(从无优化到高优化)。
2. -Og 是 GCC (GNU Compiler Collection)中的一个优化选项,通常用于在开发阶段进行优化,以提高编译速度同时保持生成的代码相对容易调试。这个选项的含义是优化等级 "Og",其中 "O" 表示优化,而 "g" 表示调试。 |
-Os | 指定目标体积优化 | 1. Os 是针对目标的体积进行优化,尽可能减小体积。
2. Os 是把 O2 中所有选项,除了那些会增加体积的优化选项,都打开。 |
调试信息 | ㅤ | ㅤ |
-g | 指定生成调试信息。 | ㅤ |
- gdwarf-2 | 指定调试信息格式的版本 2 | 采用 DWARF 格式版本 2 的调试信息。在实践中,你可能会看到其他版本的 DWARF,如 -gdwarf-3 、-gdwarf-4 等,它们分别代表 DWARF 调试信息格式的不同版本。更高版本通常提供了更多的功能和改进,但可能会占用更多的空间。 |
ffunction-sections 和 fdata-sections : | 将每个函数和数据放置到单独的段,以便在链接时进行更细粒度的优化。 | ㅤ |
预处理选项 | ㅤ | ㅤ |
D<macro> | 定义预处理宏。 | C_DEFS = \
-DUSE_HAL_DRIVER \
-DSTM32L476xx |
I<include_path> | 添加头文件搜索路径。 | C_INCLUDES = \
-IInc \
-IDrivers/STM32L4xx_HAL_Driver/Inc \
-IDrivers/STM32L4xx_HAL_Driver/Inc/Legacy \
-IDrivers/CMSIS/Device/ST/STM32L4xx/Include \
-IDrivers/CMSIS/Include |
编译选项 | ㅤ | ㅤ |
-MMD, -MP, 和 -MF | 生成依赖关系文件 | -MMD 告诉编译器生成用于描述源文件和头文件之间依赖关系的 Makefile 规则,但不包括系统头文件。
-MP 生成虚拟目标,这有助于避免一些常见的 Makefile 问题。
-MF"build/system_stm32l4xx.d" 指定生成的依赖关系文件的名称,即 Makefile 规则文件。在这个例子中,规则将被写入 build/system_stm32l4xx.d 文件。 |
-Wa,-a,-ad,-alms=xxx.lst | 生成包含汇编代码和原始 C 代码注释的汇编输出 | -Wa : 这个部分告诉编译器将其后的选项传递给汇编器。
数
-a 生成汇编代码。
-ad 生成包含汇编代码和原始 C 代码注释的汇编输出。
-alms=build/system_stm32l4xx.lst 生成包含汇编代码和原始 C 代码注释的汇编输出,并将其写入 build/system_stm32l4xx.lst 文件。 |
链接选项 | ㅤ | ㅤ |
T<ld_script> | 指定链接脚本文件。 | -TSTM32L476RGTx_FLASH.ld |
nostartfiles | 阻止链接器使用标准启动文件。 | ㅤ |
Wl,<option> | 将 <option> 传递给链接器。 | Wl,--gc-sections: 在链接阶段,-Wl,–gc-sections 指示链接器去掉不用的代码(其中-wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小,且避免一些编译错误。 |
ㅤ | ㅤ | ㅤ |
-x | 选项允许你显式指定源文件的类型。 | AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
→ assembly_file.s 是包含汇编指令和 C 预处理器指令的源文件 |
-Map | 指定连接器选项 | -Wl: 这个部分告诉编译器将其后的选项传递给链接器(linker)。
-Map=build/Hal_template.map: 这个部分告诉链接器生成一个地图文件,地图文件的名称为 Hal_template.map,并且存放在 build 目录下。
--cref: 这个部分是链接器的选项,表示在地图文件中包含交叉引用(cross reference)信息,这有助于了解程序中的符号如何引用和定义。 |
警告和错误处理 | ㅤ | ㅤ |
- Wall , Werror | 开启所有警告或将警告视为错误。 | ㅤ |
- Wno-* | 关闭特定的警告。 | ㅤ |
- std=<standard> | 指定使用的语言标准,如c99。 | ㅤ |
- nostdlib | 不使用标准库 | ㅤ |
fno-exceptions 和 fno-rtti | 禁用C++异常和RTTI支持 | ㅤ |
二、STM32-base Poeject 使用
三、STM32F4xx_LED-Makefile
引用
- ARM芯片型号汇总 - 知乎 (zhihu.com) (架构和型号)
- Getting started with STM32 | STM32-base project
If you want to get started with the STM32-base project, you don’t have to make a lot of choices on the software side. The STM32-base project is designed to be used with the GNU Arm Embedded Toolchain. STM32-base can be used with you favorite code editor. A recommendation for an editor is Visual Studio Code.
- laneston/STM32F4xx_LED-Makefile: This is a learning template for Cross compilation chain. You can learn how to use gcc-arm-none-eabi in ubuntu to compile the bin file that can be run on STM32. (github.com) 说明