arm-none-eabi-gcc,makefile,stm官方庫構建stm32f4xx工程


參考文章: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(看代碼用)

建立工程文件夾

image

stlib/inc和stlib/src這兩個文件夾是官方庫文件夾里面的inc和src,分別對應.h和.c

image
image

stlib/cminc里面是官方庫里面的

image

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燒寫進芯片


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM