参考文章:http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=603753&highlight=ubuntu
准备工具:
arm-none-eabi-gcc
https://launchpad.net/gcc-arm-embedded/+download
stm32f4官方库
http://www.stmcu.org/document/list/index/category-150#524(搜索STSW-STM32065)
vs code(看代码用)
建立工程文件夹
stlib/inc和stlib/src这两个文件夹是官方库文件夹里面的inc和src,分别对应.h和.c
stlib/cminc里面是官方库里面的
startup_stm32f40xx.S(后缀S要改成大写)是使用官方库里面TrueStudio的启动文件(注:不可以使用MDK的)
stm32f4xx_conf.h, stm32f4xx.h, system_stm32f4xx.c, system_stm32f4xx.h这几个文件到官方库相应地方复制过来就好了。
STM32F407ZET6_FLASH.ld是从官方库的project/STM32F4xx_stdPeriph_Templates/TrueSTUDIO/STM32F40_41xxx/STM32F417IG_FLASH.ld改名而来的,后面还会修改该文件,使得可以用在407ZET6上
根目录中的main.c,Makefile是自己创建的main。c写自己的程序,Makefile用于编译工程
stm32f4xx_it.c, stm32f4xx_it.h是从官方库中拿来负责写中断函数
arm-none-eabi-gcc安装
解压到任意文件夹,把arm-none-eabi-gcc里的bin文件夹添加到环境变量,注销然后在命令行中输入arm-none-eabi-gcc -v如果显示了版本就说明安装成功
编写Makefile
# 添加包含路径
vpath %.S stlib
vpath %.c stlib stlib/src
vpath %.h stlib stlib/cminc stlib/inc
DEFS += -DUSE_STDPERIPH_DRIVER
INCS += -Istlib -Istlib/cminc -Istlib/inc
# 使用其他外设在这里添加
OBJS += main.o
OBJS += stlib/startup_stm32f40xx.o
OBJS += stlib/system_stm32f4xx.o
OBJS += stlib/src/stm32f4xx_syscfg.o stlib/src/stm32f4xx_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:blink.bin
clean:
@rm -f $(OBJS) $(OBJ_FLASH) $(OBJ_SRAM)
@rm -f blink.bin blink.elf blinks.bin blinks.elf
blink.bin:blink.elf
@arm-none-eabi-objcopy -O binary -S $< $@
blinks.bin:blinks.elf
@arm-none-eabi-objcopy -O binary -S $< $@
blink.elf:$(OBJS) $(OBJ_FLASH)
@arm-none-eabi-gcc $(LFLAGS) $^ -Tstlib/STM32F407ZET6_FLASH.ld -o $@
@arm-none-eabi-size $@
burn:blink.bin
@st-flash write $< 0x08000000
%.o:%.S
@echo cc: $<
@arm-none-eabi-gcc $(CFLAGS) -c $< -o $@
%.o:%.c
@echo cc: $<
@arm-none-eabi-gcc $(CFLAGS) $(DEFS) $(INCS) -c $< -o $@
修改STM32F417IG_FLASH.ld文件
该文件是定义了芯片内存中的代码的存放位置
我们的芯片是stm32f407zet6,RAM是192k(128K SRAM , 64K CCMRAM),flash是512K
修改地方如下
34行 _estack = 0x20020000; /* end of RAM */
43到46行
MEMORY
{
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
}
修改stlib/stm32f4xx.h
70行去掉#define STM32F40_41xxx的注释
186行添加#define __FPU_USED 1开启芯片的FPU(硬件浮点运算)
编写main函数
打开main.c
#include "stm32f4xx.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_gpio.h"
int main(void)
{
return 0;
}
最后make一下就可以生成.bin文件,然后就可以使用openocd烧写进芯片