從0開始搭建基於ARM GCC的軟件系統02——使用ARM GCC編譯SDK

本文以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文件即可。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章