Linux搭建单片机开发环境

接下来以STM43F429IGT6为例子进行说明。

准备工作:

建立文件夹

创建文件夹如下图所示

  • 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.hstm32f429xx.hsystem_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文件名字要一致。

2 thoughts on “Linux搭建单片机开发环境

Leave a Reply to david Cancel reply

Your email address will not be published. Required fields are marked *