本文以STM32L4VGT6为例,因为手上只有这么一块开发板。其它IC处理方法应该类似。
一、准备工作
1、打开官网https://www.st.com/content/st_com/en.html,下载对应芯片的SDK,本例中:STM32Cube_FW_L4_V1.14.0。不清楚怎么下载的同学可以参考“STM32L4VGT6官方软件包下载”
2、下载ARM GCC编译器。本例以windows下为例下载gcc-arm-none-eabi-5_4-2016q3-20160926-win32.rar。不清楚怎么下载的自行百度一下……
3、下载windows下的make工具。我下载的是:make-3.81-bin.zip。可自行百度下载,另外,后面使用时会用到两个dll文件,可先一并下载libicon2.dll和libintl3.dll。
4、其它辅助工具。我使用的是以下这些,从其它方案的SDK中找现成的。可百度查找。
二、编译环境设置
我使用的一个批处理文件设置环境变量:
set path=E:\ARM\gcc\STM32Cube_FW_L4_V1.14.0\tools\linux;E:\DevelopmentEnvironment\gcc-arm-none-eabi-5_4-2016q3-20160926-win32\bin;E:\DevelopmentEnvironment\gcc-arm-none-eabi-5_4-2016q3-20160926-win32\arm-none-eabi\bin;E:\ARM\gcc\STM32Cube_FW_L4_V1.14.0\tools\make-3.81-bin\bin;%path%
%ComSpec%
E:\ARM\gcc\STM32Cube_FW_L4_V1.14.0\tools\linux
第一步中第4点下载的工具路径。
E:\DevelopmentEnvironment\gcc-arm-none-eabi-5_4-2016q3-20160926-win32\bin;E:\DevelopmentEnvironment\gcc-arm-none-eabi-5_4-2016q3-20160926-win32\arm-none-eabi\bin
第一步中第2点下载的arc gcc工具路径。
E:\ARM\gcc\STM32Cube_FW_L4_V1.14.0\tools\make-3.81-bin\bin;
第一步中第3点下载的make工具路径。
批处理文件建好后,双击运行如下:
到这里,工具、环境的准备工作已差不多了。接下来就是准备SDK。
三、SDK搭建
1、从之前下载的官方SDK STM32Cube_FW_L4_V1.14.0目录中找到以下所需文件:
(1)系统启动文件,注意一定要选择gcc目录下的。Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\gcc\startup_stm32l496xx.s
(2)系统初始化文件。Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c
(3)编译连接脚本文件,本例中选择STM32L496ZGTx_FLASH.ld。Projects\NUCLEO-L496ZG\Templates\SW4STM32\STM32L496ZG_NUCLEO\STM32L496ZGTx_FLASH.ld
(4)HAL文件,根据需要选择,如果测试main为空,什么都没有的话,也可以先不用HAL。Drivers\STM32L4xx_HAL_Driver\Src\*
为后续方便,我是将所需要文件的目录结构与官方SDK保持一致,其目录结构如下:
如上图所示,我新建的工程目录为Projects/STM32L496VGT6。工作目录内容如下:
可以看到这里包含了启动文件和编译连接脚本,这里我是直接拷贝到工程目录来的,其实也可以不拷贝,保持原SDK路径。
注意红色框新添加了两个文件:
gccl2.bat:就是第二步中提到的配置环境变量的批处理文件。
Makefile:gcc编译所必需的文件。具体后面讲解。
四、书写Makefile
不了解Makefile的请先自行百度了解,网上资料很多。如:“GNU make中文手册.pdf”等。
因为如果不了解一下这个,后面的内容可能就会一脸蒙B了。^_^
直接上Makefile内容添加注解:
# 添加一些变量, TOP指令SDK根目录(以工程目录为基准); TARGET定义为目标输出文件
TOP = ../..
TARGET = STM32L496VGT6
# 添加包含路径. 需要编译的文件所在目录都需要添加到这里
vpath %.S .
vpath %.c ./Src $(TOP)/Drivers/STM32L4xx_HAL_Driver/Src
vpath %.h . ./Inc
# 添加宏定义STM32L496xx, 官方SDK中一些头文件中会用到
DEFS += -DSTM32L496xx
# 头文件路径. 需要引用的头文件所在目录都需要添加到INCS变量中,以方便引用
INCS += -I. -I./Inc
INCS += -I$(TOP)/Drivers/CMSIS/Include
INCS += -I$(TOP)/Drivers/CMSIS/Device/ST/STM32L4xx/Include
INCS += -I$(TOP)/Drivers/STM32L4xx_HAL_Driver/Inc
# 源文件生成的目标文件,都需要添加到OBJS变量中
OBJS += ./Src/main.o
OBJS += ./startup_stm32l496xx.o
OBJS += ./Src/system_stm32l4xx.o
OBJS += ./Src/stm32l4xx_it.o ./Src/stm32l4xx_hal_msp.o
OBJS += $(TOP)/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.o
OBJS += $(TOP)/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.o
OBJS += $(TOP)/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.o
OBJS += $(TOP)/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.o
OBJS += $(TOP)/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.o
# 编译参数。使用了编译优化和硬件浮点数
CFLAGS += -mcpu=cortex-m4 -mthumb -Wall
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS += -Os
CFLAGS += -ffunction-sections -fdata-sections
# 链接参数。
LFLAGS += -mcpu=cortex-m4 -mthumb
LFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
LFLAGS += -Wl,--gc-sections
# 最后生成的bin文件
all:$(TARGET).bin
clean:
rm -f $(OBJS) $(OBJ_FLASH) $(OBJ_SRAM)
rm -f $(TARGET).bin $(TARGET).elf $(TARGET)s.bin $(TARGET)s.elf
# 将elf文件转换为bin文件
$(TARGET).bin:$(TARGET).elf
@arm-none-eabi-objcopy -O binary -S $< $@
# 连接所有目标文件,生成elf文件
$(TARGET).elf:$(OBJS) $(OBJ_FLASH)
@arm-none-eabi-gcc $(LFLAGS) $^ -T./STM32L496ZGTx_FLASH.ld -o $@
@arm-none-eabi-size $@
# 编译生成目标文件
%.o:%.S
@echo cc: $<
@arm-none-eabi-gcc $(CFLAGS) -c $< -o $@
%.o:%.c
@echo cc: $<
@arm-none-eabi-gcc $(CFLAGS) $(DEFS) $(INCS) -c $< -o $@
五、编译
所有工作都准备好后,运行编译环境,执行make指令即可。编译过程可能会出现一些报错,逐一解决即可。
整个正常的编译过程如下:
编译完成后工程目录文件如下:
使用STM32 ST-LINK Utility工具烧录STM32L496VGT6.bin文件即可。