Embedded-GCC-Template 第三方資源集合
STM32F407-GCC-Template
Arm-none-eabi-gcc + Makefile+OpenOCD+CMSIS-DAP+Vscode工程模板
一、本次環(huán)境搭建所用的軟硬件
1)Windows or Linux (本文以Windows為主)
2)JLink、Daplink、Wch-Link燒錄器
3)GNU Arm Embedded Toolchain交叉編譯器
4)Mingw-w64 GCC for Windows 64
5)Debug 調試工具 openocd
6)Visual Studio Code
二、軟件安裝配置
-
GNU Arm Embedded Toolchain交叉編譯器
進入arm開發(fā)者官網,往下滑動選擇下載解壓可用的ZIP壓縮包文件
下載鏈接: Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer
將下載好的壓縮包文件解壓在gcc-arm-none-eabi”文件夾中,并記住文件內“bin”文件的路徑,后續(xù)需添加到系統(tǒng)環(huán)境變量Path中。
添加完環(huán)境變量后,進行測試,檢測是否安裝好。
-
安裝Mingw-w64 GCC
點擊鏈接進入到SourceForge官網,往下翻可以找到很多版本的下載鏈接,選擇紅色框內型號即可,不同前后綴的具體差異請參考:
MinGW gcc下載鏈接及sjlj、dwarf、seh異同以及gcc安裝_AMDDMA的博客-CSDN博客_seh和sjlj
下載鏈接:
MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net
同樣,將下載好的文件解壓到“gcc-arm-none-eabi”文件夾下,記住目錄下的“bin”文件路徑
進入“bin”文件內找到“mingw32-make”應用程序文件,復制一份并重命名為“make”。這么做有利于在命令行執(zhí)行make指令,而不是輸入mingw32-make。
? 添加完環(huán)境變量后,進行測試,檢測是否安裝好。
3. 安裝調試軟件Download pre-built OpenOCD for Windows
默認安裝Vscode,安裝過程比較簡單,參考其他文章。有了以上三個軟件的支持,已經可以在VScode中編譯并生成bin文件和hex文件了,但眾所周知,程序員最大的工作是Debug,那就免不了需要一款調試軟件了。
Debug常用的硬件有STLink、JLink,WCH-Link,DapLink.
Download pre-built OpenOCD for Windows下載鏈接:OpenOCD for Windows
?
同樣將下載好的壓縮包解壓至“OpenOCD-20231002-0.12.0”,記住文件內“bin”文件的路徑。
添加完環(huán)境變量后,進行測試,檢測是否安裝好。
綜上所述,基本的軟件環(huán)境已經配置好。
三、STM32-GCC-Template工程配置
-
工程結構
STM32-GCC-Template 使用的標準固件庫開發(fā),當然你可以使用HAL開發(fā)(這個不重要,有庫就行了)
- Application
Application/inc
Application/src
- BspLibraries
BspLibraries/inc
BspLibraries/src
- FwlibLibraries
FwlibLibraries/CMSIS/Include
FwlibLibraries/inc
FwlibLibraries/src
- Kernel
Kernel/inc
Kernel/src
- SystemLibraries
SystemLibraries/inc
SystemLibraries/src
- Build
//編譯過程輸出文件
- tools
tools/startup_stm32f407xx.s
tools/STM32F407ZGTx_FLASH.ld
- Makefile
Makefile腳本文件,重點,構建全流程腳本
//OpenOCD 調試下載配置文件
cmsis-dap.cfg
stm32f4x.cfg
- Makefile文件編寫(重點)
Author = dele
######################################
# target 構建目標
######################################
TARGET = stm32f407-gcc-template
######################################
# building variables
######################################
# debug build?
DEBUG = 1
# optimization
OPT = -Og
#######################################
# paths
#######################################
# source path
# firmware library path
PERIFLIB_PATH =
# Build path
BUILD_DIR = Build
######################################
# source #
######################################
# 修改1 C源文件添加 參加文件工程,按照下面格式添加所有的c文件
# C sources
C_SOURCES = \
Kernel/src/stm32f4xx_it.c \
Kernel/src/system_stm32f4xx.c \
FwlibLibraries/src/misc.c \
FwlibLibraries/src/stm32f4xx_adc.c \
FwlibLibraries/src/stm32f4xx_can.c \
FwlibLibraries/src/stm32f4xx_crc.c \
FwlibLibraries/src/stm32f4xx_cryp_aes.c \
FwlibLibraries/src/stm32f4xx_cryp.c \
FwlibLibraries/src/stm32f4xx_cryp_des.c \
FwlibLibraries/src/stm32f4xx_cryp_tdes.c \
FwlibLibraries/src/stm32f4xx_dac.c \
FwlibLibraries/src/stm32f4xx_dbgmcu.c \
FwlibLibraries/src/stm32f4xx_dcmi.c \
FwlibLibraries/src/stm32f4xx_dma2d.c \
FwlibLibraries/src/stm32f4xx_dma.c \
FwlibLibraries/src/stm32f4xx_exti.c \
FwlibLibraries/src/stm32f4xx_flash.c \
FwlibLibraries/src/stm32f4xx_flash_ramfunc.c \
FwlibLibraries/src/stm32f4xx_gpio.c \
FwlibLibraries/src/stm32f4xx_hash.c\
FwlibLibraries/src/stm32f4xx_hash_md5.c \
FwlibLibraries/src/stm32f4xx_hash_sha1.c \
FwlibLibraries/src/stm32f4xx_i2c.c \
FwlibLibraries/src/stm32f4xx_iwdg.c \
FwlibLibraries/src/stm32f4xx_ltdc.c \
FwlibLibraries/src/stm32f4xx_pwr.c \
FwlibLibraries/src/stm32f4xx_rcc.c \
FwlibLibraries/src/stm32f4xx_rng.c \
FwlibLibraries/src/stm32f4xx_rtc.c \
FwlibLibraries/src/stm32f4xx_sai.c \
FwlibLibraries/src/stm32f4xx_sdio.c \
FwlibLibraries/src/stm32f4xx_spi.c \
FwlibLibraries/src/stm32f4xx_syscfg.c \
FwlibLibraries/src/stm32f4xx_tim.c \
FwlibLibraries/src/stm32f4xx_usart.c \
FwlibLibraries/src/stm32f4xx_wwdg.c \
BspLibraries/src/key.c \
BspLibraries/src/led.c \
SystemLibraries/src/delay.c \
SystemLibraries/src/usart.c \
SystemLibraries/src/sys.c \
SystemLibraries/src/timer.c \
Application/src/main.c \
# ASM sources
# 修改2 匯編啟動源文件添加
ASM_SOURCES = \
tools/startup_stm32f407xx.s
#######################################
# binaries
#######################################
# 修改3 gcc-arm-none-eabi工具鏈地址
PREFIX = arm-none-eabi-
GCC_PATH = /SoftwareApplication/gcc-arm-none-eabi/bin
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
#######################################
# CFLAGS
#######################################
# cpu 架構
CPU = -mcpu=cortex-m4
# fpu
FPU = -mfpu=fpv4-sp-d16
# float-abi
FLOAT-ABI = -mfloat-abi=hard
# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
# macros for gcc
# AS defines
AS_DEFS =
# C defines
# 修改4 全局宏定義 -DXXX
C_DEFS = \
-DSTM32F40_41xxx \
-DUSE_STDPERIPH_DRIVER\
# AS includes
AS_INCLUDES =
# C includes
# 修改5 H源文件添加 參加文件工程,按照下面格式添加所有的文件夾
C_INCLUDES =\
-I Kernel/inc \
-I FwlibLibraries/inc \
-I FwlibLibraries/CMSIS/Include \
-I BspLibraries/inc \
-I SystemLibraries/inc \
-I Application/inc \
# compile gcc flags
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif
# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)"
#######################################
# LDFLAGS
#######################################
# link script
# 修改6 link script 鏈接腳本文件添加 鏈接腳本如何獲取看參考stm32cubemx官方工程
LDSCRIPT = \
tools/STM32F407ZGTx_FLASH.ld
# libraries
LIBS = -lc -lm -lnosys
LIBDIR =
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
# default action: build all
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin
#######################################
# build the application
#######################################
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
@echo "[CC] $<"
@$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
@echo "[AS] $<"
@$(AS) -c $(CFLAGS) $< -o $@
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
@echo "[HEX] $< -> $@"
@$(CC) $(OBJECTS) $(LDFLAGS) -o $@
@$(SZ) $@
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
@echo "[HEX] $< -> $@"
@$(HEX) $< $@
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
@echo "[BIN] $< -> $@"
@$(BIN) $< $@
$(BUILD_DIR):
@mkdir $@
#######################################
# clean up
#######################################
# make clean 清除編譯中間文件
# Windows環(huán)境不支持 rm 因此寫成 -del
# Linux環(huán)境
clean:
-del /q $(BUILD_DIR)
# Openocd 調試下載工具
# 修改7 cmsis-dap.cfg -f stm32f4x.cfg
# 配置文件 修改成為自己使用的工具和芯片文件 如 stlink.cfg jlink.cfg stm32f1xx.cfg
flash:
openocd -f cmsis-dap.cfg -f stm32f4x.cfg -c init -c halt -c "program $(BUILD_DIR)/$(TARGET).bin 0x8000000" -c reset -c shutdown
#######################################
# dependencies
#######################################
-include $(wildcard $(BUILD_DIR)/*.d)
# *** EOF ***
四、STM32-工程測試
-
make 構建工程
-
make flash
接上串口線,打開串口軟件,查看終端輸出情況(如果是從MDK-Keil工程移植過來,printf應該是不支持的,因此終端沒有輸出,需要修改相關代碼,后面寫修改文件)(圖片中的情況是修改之后的效果)
-
make clean
清除工程,修改main.c代碼,重新構建代碼
-
注意修改的部分(僅我的工程,不代表全部)
(1)usart.c printf重定向問題
//重定向c庫函數(shù)printf到串口,重定向后可使用printf函數(shù) // int fputc(int ch, FILE *f) // { // /* 發(fā)送一個字節(jié)數(shù)據(jù)到串口 */ // USART_SendData(DEBUG_USART, (uint8_t) ch); // /* 等待發(fā)送完畢 */ // while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET); // return (ch); // } int _write (int fd, char *pBuffer, int size) { for (int i = 0; i < size; i++) { while((USART1->SR&0X40)==0);//等待上一次串口數(shù)據(jù)發(fā)送完成 USART1->DR = (uint8_t) pBuffer[i]; //寫DR,串口1將發(fā)送數(shù)據(jù) } return size; }
(2)sys.c 匯編代碼 (注意,由于工程來源于正點原子的工程修改,可能與其他工程模板不一樣,非不要)
//THUMB指令不支持匯編內聯(lián) //采用如下方法實現(xiàn)執(zhí)行匯編指令WFI __asm void WFI_SET(void) { WFI; } //關閉所有中斷(但是不包括fault和NMI中斷) __asm void INTX_DISABLE(void) { CPSID I BX LR } //開啟所有中斷 __asm void INTX_ENABLE(void) { CPSIE I BX LR } //設置棧頂?shù)刂?/span> //addr:棧頂?shù)刂?/span> __asm void MSR_MSP(u32 addr) { MSR MSP, r0 //set Main Stack value BX r14 }
修改后
//THUMB指令不支持匯編內聯(lián) //采用如下方法實現(xiàn)執(zhí)行匯編指令WFI void WFI_SET(void) { __ASM volatile("WFI"); } //關閉所有中斷(但是不包括fault和NMI中斷) void INTX_DISABLE(void) { __ASM volatile("CPSID I"); __ASM volatile("BX LR"); } //開啟所有中斷 void INTX_ENABLE(void) { __ASM volatile("CPSIE I"); __ASM volatile("BX LR"); } //設置棧頂?shù)刂?/span> //addr:棧頂?shù)刂?/span> void MSR_MSP(u32 addr) { __ASM volatile("MSR MSP, r0"); __ASM volatile("BX r14"); }
五、測試效果
? 使用Vscode進行工程修改編輯,編譯,下載代碼(可以使用Cortex-Debug進行調試)
文章來源:http://www.zghlxwxcb.cn/news/detail-770510.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-770510.html
到了這里,關于搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!