接下来以STM43F429IGT6为例子进行说明。
准备工作:
-
arm-none-eabi-gcc 下载 :https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
-
GitHub上ST官方库:https://github.com/STMicroelectronics/STM32CubeF4
建立文件夹
创建文件夹如下图所示
- drivers:存放我们自己写的驱动,如led等
- obj:存放编译产生的.o文件
- stlib:存放官方库文件
- user:存放main文件
- jlink.cfg:JLink下载时的配置文件
- Makefile:使用make编译代码
重点介绍stlib文件夹
-
cminc:存放 STM32CubeF4\Drivers\CMSIS\Include 路劲下的头文件
-
inc:存放 STM32CubeF4\Drivers\STM32F4xx_HAL_Driver\Inc 下面的头文件
-
src:存放 STM32CubeF4\Drivers\STM32F4xx_HAL_Driver\Src 下面的库文件
-
startup_stm32f429xx.S:位置路径 STM32CubeF4\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\gcc 并将后缀小写的 s 改为大写
-
将STM32CubeF4\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates 下面的 system_stm32f4xx.c ,以及 STM32CubeF4\Drivers\CMSIS\Device\ST\STM32F4xx\Include 下面的 stm32f4xx.h ,stm32f429xx.h ,system_stm32f4xx.h 文件复制出来
-
找到 STM32CubeF4\Projects\STM32F429I-Discovery\Templates\SW4STM32\STM32F429I_DISCO 下面的 STM32F429ZITx_FLASH.ld 文件,以及 STM32CubeF4\Projects\STM32F429I-Discovery\Templates\Inc 里面的 stm32f4xx_hal_conf.h 文件
至此,所必须的文件全部找到
如下图:
另外,inc和src里面的文件根据实际情况添加,这里只添加了常用的部分。
修改的地方
将原来启动文件的小写的s改为大写,否则后面编译回报错;
目标文件是STM32F429IGT6,这和官方库STM32F429I_DISCO很接近,所以这里选择STM32F429ZITx_FLASH.ld链接文件,需要修改的地方如下:
上面的FLASH和RAM大小通过芯片手册可以查询,修改为对应芯片即可。比如,STM32F429IGT6的flash大小是1M,RAM大小是256K(192K RAM+64K CCMRAM)
编写Makefile
# STM32 MCU Makefile
CROSS_COMPILE := arm-none-eabi-
CC =$(CROSS_COMPILE)gcc
CPP =$(CROSS_COMPILE)g++
LD =$(CROSS_COMPILE)ld
AR =$(CROSS_COMPILE)ar
OBJCOPY =$(CROSS_COMPILE)objcopy
OBJDUMP =$(CROSS_COMPILE)objdump
SIZE =$(CROSS_COMPILE)size
#设置全局变量
#固件库全局变量定义
#DEFS := -DUSE_STDPERIPH_DRIVER
#HAL库全局变量定义
DEFS := -DUSE_HAL_DRIVER -DSTM32F429xx
#-DSTM32F429_439xx
TARGET := test
#设置编译参数和编译选项
CFLAGS := -mcpu=cortex-m4 -mthumb -Wall -Os -ffunction-sections -fdata-sections
LDFLAGS := -mcpu=cortex-m4 -mthumb -Wl,--gc-sections
#添加文件路径
INCDIRS := stlib/cminc \
stlib/inc \
stlib/inc/Legacy \
stlib \
user \
drivers/led \
SRCDIRS := stlib \
stlib/src \
user \
drivers/led \
VPATH := $(SRCDIRS) $(INCDIRS)
#链接头文件
INCLUDE := $(patsubst %, -I %, $(INCDIRS))
#找到.S和.c文件
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
#去掉文件的路径
SFILENDIR := $(notdir $(SFILES))
CFILENDIR := $(notdir $(CFILES))
#将文件替换为.o文件
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
OBJS := $(SOBJS) $(COBJS)
#头文件依赖
DEPS := $(patsubst obj/%, .%.d, $(OBJS))
DEPS := $(wildcard $(DEPS))
#.PHONY:all
all : start_recursive_build $(TARGET)
@echo $(TARGET) has been build!
start_recursive_build:
@echo Hello
# @make -C ./ -f $(TOPDIR)/Makefile.build
$(TARGET):$(OBJS)
@$(CC) $^ -Tstlib/STM32F429ZITx_FLASH.ld -o $(TARGET).elf $(LDFLAGS)
@$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin
@$(SIZE) $(TARGET).elf
@$(OBJDUMP) -S $(TARGET).elf > $(TARGET).dis
#判断一下,防止重复包含头文件
ifneq ($(DEPS),)
include $(DEPS)
endif
#编译文件
$(SOBJS) : obj/%.o : %.S
@$(CC) $(CFLAGS) $(INCLUDE) $(DEFS) -c -o $@ $< -MD -MF .$(notdir $@).d
$(COBJS) : obj/%.o : %.c
@$(CC) $(CFLAGS) $(INCLUDE) $(DEFS) -c -o $@ $< -MD -MF .$(notdir $@).d
.PHONY:clean
clean:
@rm -f *.o *.bin *.elf *.dis .*.d obj/*
.PHONY:upload
upload:$(TARGET).bin
@make all
@JLinkExe jlink.cfg
.PHONY:mytest
mytest:
@echo INCLUDE= $(INCLUDE)
@echo CFILENDIR= $(CFILENDIR)
@echo SFILENDIR= $(SFILENDIR)
@echo OBJS= $(OBJS)
上述Makefile实现了头文件的依赖,可以解决在头文件中修改数据,不需要make clean,直接make即可。
编写main文件
#include "stm32f4xx.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_gpio.h"
int main(void)
{
return 0;
}
HAL库的添加.c和.h文件的玩法,都是通过 stm32f4xx_hal_conf.h 文件配置,如果编译报错,根据实际添加的情况修改。
在Linux下make就可以编译,最后可以生成一个test.bin文件。
JLINK下载的配置文件jlink.cfg :
device stm32f429ig
r
h
erase
loadbin ./test.bin,0x08000000
g
exit
如果要下载,先在Linux下安装JLink,在有JLink驱动的情况下,可以使用
make upload
下载程序。注意Makefile中的TARGET和jlink.cfg文件中bin文件名字要一致。
good!Thanks
thanks