【前言】
最近入手了mac min,所以不能使用keil来开发Mini-F5265了。在macOS下面通常解决的方式有vscode+arm-none-eabi-gcc编译工具链来开发,当然也可以使用Clion+arm-none-eabi-gcc来开发。但是vscode是免费的,所以是最优做法。而且这套组合可以在不同的操作系统中无缝转移。
【软件准备】
1、安装vscode。这个教程是非常多的,略过。
2、安装make。我使用brew来安装。
3、安装arm-none-eabi-gcc编译工具链,我是下载到pkg可以直接安装好的。但是需要配置本地环境。
4、安装pyocd。使用brew来安装,安装好后,也是需要配置环境变量的,在~/.zshrc文件中的配置如下:
liujianhua@liujianhuadeMac-mini My_gcc_template % cat ~/.zshrcexport ARM_GCC_HOME="/Applications/ArmGNUToolchain/14.2.rel1/arm-none-eabi" # arm-none-eabi-gccexport PATH=$PATH:$ARM_GCC_HOME/binexport PYOCD_HOME="/Users/liujianhua/Library/Python/3.9/" # pyocdexport PATH=$PATH:$PYOCD_HOME/bin
【工程准备】
1、从官网下载示例工程。
2、获取GCCdemo,主要是拿到.ld ,.S,.svd
3、从官网下载到.pack包,这个下载到开发板,还有调试也需要用到。
【工程创建】
首先创建文件夹gcc_template文件夹,下面创建Devcie文件夹,存放驱动等文件,下面创建CMSIS和MM32F5260分别用于存放系统头文件与驱动。
复制官方库的HAL_LIb、Source、Include到MM32F5260文件夹下,最后其目录如下:
在Soucre目录下, 复制官方给出的GCC_StartAsm到文目录下面,提供启动的汇编文件。
同时复制mm32f5260_flash.ld到该目录下面,提供连接算法文件。
在工程的根目录再创建Core目录,下面创建app目录用于存入用户的代码文件,其结构如下:
在工程的根目录下面创建Debug目录,复制.pack包与寄存器文件MM32F5260.svd。
到此工程的文件准备完毕。
【makefile的编写】
1、Makefile我采用分块的书写,首先在device目录下面创建Device.mk,内容如下:
# 模块名_DIR 是上一层传递下来的参数,# 是从工程根目录到该模块文件夹的路径# 向 C_SOURCES 中添加需要编译的源文件C_SOURCES += $(wildcard $(Device_DIR)/MM32F5260/HAL_Lib/Src/*.c)C_SOURCES += $(wildcard $(Device_DIR)/MM32F5260/Source/system_mm32f5260.c)C_SOURCES += $(wildcard $(Device_DIR)/st7735/lcd_st7735.c)# 向 C_INCLUDES 中添加头文件路径C_INCLUDES += -I$(Device_DIR)/CMSIS/Core/IncludeC_INCLUDES += -I$(Device_DIR)/MM32F5260/IncludeC_INCLUDES += -I$(Device_DIR)/MM32F5260/HAL_Lib/IncC_INCLUDES += -I$(Device_DIR)/st7735# 向 LIBDIR 中添加静态库文件路径# LIBDIR += -L$(Libraries_DIR)/Libå# 向 LIBS 中添加需要链接的静态库# LIBS += -lxxxx# link scriptLDSCRIPT = $(Device_DIR)/MM32F5260/Source/mm32f5260_flash.ld# 汇编文件宏定义AS_DEFS +=# 汇编头文件目录AS_INCLUDES +=# 汇编源文件(starup)ASM_SOURCES += $(Device_DIR)/MM32F5260/Source/GCC_StartAsm/startup_mm32f5260.S
主要是添加了驱动的头文件路径、.c的路径以及汇编的路径。
2、Core目录下面创建Core.mk,内容如下:
# 模块名_DIR 是上一层传递下来的参数,# 是从工程根目录到该模块文件夹的路径# 向 C_SOURCES 中添加需要编译的源文件C_SOURCES += $(wildcard $(Core_DIR)/app/*.c)# 向 C_INCLUDES 中添加头文件路径C_INCLUDES += -I$(Core_DIR)/app
这个文件比较简单就是添加了头文件路径以及.c的路径。
2、Makefile编写:
# 项目编译目标名TARGET = template# 调试信息DEBUG = 1# 优化等级OPT = -O1# 链接时优化LTO = -flto# 编译临时文件目录BUILD_DIR = buildEXEC_DIR = build_exec# 模块导入Core_DIR = Coreinclude Core/Core.mkDevice_DIR = Deviceinclude Device/Device.mk# C源文件宏定义C_DEFS += -DUSE_STDPERIPH_DRIVER -DCUSTOM_HSE_VAL# C头文件目录C_INCLUDES +=# C源文件C_SOURCES +=# 链接库LIBS += -lc -lm -lnosys# 库文件路径LIBDIR +=######################################## 编译器指定#######################################PREFIX = arm-none-eabi-# 启用下一项以指定GCC目录#GCC_PATH = /Applications/ARM/bin/ifdef GCC_PATHCC = $(GCC_PATH)/$(PREFIX)gccAS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cppCP = $(GCC_PATH)/$(PREFIX)objcopyDUMP = $(GCC_PATH)/$(PREFIX)objdumpSZ = $(GCC_PATH)/$(PREFIX)sizeelseCC = $(PREFIX)gccAS = $(PREFIX)gcc -x assembler-with-cppCP = $(PREFIX)objcopyDUMP = $(PREFIX)objdumpSZ = $(PREFIX)sizeendifHEX = $(CP) -O ihexBIN = $(CP) -O binary -S######################################## 目标单片机配置信息######################################## cpuCPU = -mcpu=cortex-m33# fpuFPU = #none# float-abiFLOAT-ABI = #none# mcuMCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)# compile gcc flagsASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sectionsCFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sectionsifeq ($(DEBUG), 1)CFLAGS += -g -gdwarf-2endif# Generate dependency informationCFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"NO_COLOR = \033[00mOK_COLOR = \033[32mERR_COLOR = \033[31m######################################## LDFLAGS######################################## librariesLDFLAGS = $(MCU) -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref \-Wl,--gc-sections -ffunction-sections --specs=nano.specs --specs=nosys.specs $(LTO) # 打开浮点打印LDFLAGS += -lc -lrdimon -u _printf_float# default action: build allall: $(EXEC_DIR)/$(TARGET).elf $(EXEC_DIR)/$(TARGET).hex $(EXEC_DIR)/$(TARGET).bin POST_BUILD######################################## build the application######################################## list of objectsOBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))vpath %.c $(sort $(dir $(C_SOURCES)))# list of ASM program objectsOBJECTS += $(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 $@$(EXEC_DIR)/$(TARGET).elf: $(OBJECTS) Makefile | $(EXEC_DIR)@echo "[LD] $@"@$(CC) $(OBJECTS) $(LDFLAGS) -o $@$(EXEC_DIR)/%.hex: $(EXEC_DIR)/%.elf | $(EXEC_DIR)@echo "[HEX] $< -> $@"@$(HEX) $< $@$(EXEC_DIR)/%.bin: $(EXEC_DIR)/%.elf | $(EXEC_DIR)@echo "[BIN] $< -> $@"@$(BIN) $< $@$(BUILD_DIR):@mkdir $@$(EXEC_DIR):@mkdir $@.PHONY: POST_BUILDPOST_BUILD: $(EXEC_DIR)/$(TARGET).elfifeq ($(DEBUG), 1)@echo "[DUMP] $< -> $(EXEC_DIR)/$(TARGET).S"@$(DUMP) -d $< > $(EXEC_DIR)/$(TARGET).Sendif@echo "[SIZE] $<"@$(SZ) $<@echo -e "$(OK_COLOR)Build Finish$(NO_COLOR)"######################################## 清除临时文件#######################################.PHONY: cleanclean:@rm -rf $(BUILD_DIR)@echo -e "$(OK_COLOR)Clean Build Finish$(NO_COLOR)".PHONY: cleanallcleanall: clean@rm -rf $(EXEC_DIR)@echo -e "$(OK_COLOR)Clean Exec Finish$(NO_COLOR)"######################################## 烧录程序#######################################.PHONY: flashflash: $(EXEC_DIR)/$(TARGET).elf@echo -e "$(OK_COLOR)Start pyOCD$(NO_COLOR)"@pyocd flash $<######################################## 构建并烧录程序#######################################.PHONY: runrun:@make -j12@make flash######################################## 依赖文件#######################################-include $(wildcard $(BUILD_DIR)/*.d)# *** EOF ***
在Makefile中,大部分与其他的工程都是一样的下面主要讲一下修改的地方
1、就是CPU的信息,由于MM32F5260是兼容cortex-m33的,所这我指定了CPU 为cortex-33。
2、就是指定汇编文件编译时要与提供的后缀一样,需要修改为.S(大写的S)
修改好这些后就可以执行make了
【下载】
在根目录下面创建pyocd.yaml文件:
pack: ./Debug/MindMotion.MM32F5260_DFP.0.2.0.pack target_override: MM32F5265E8PV frequency: 24000000
执行make flash,就可以下载程序到开发板:
liujianhua@liujianhuadeMac-mini My_gcc_template % make flash -e Start pyOCD 0000198 I Loading /Users/liujianhua/mypro/My_gcc_template/build_exec/template.elf [load_cmd] [==================================================] 100% 0000711 I Erased 0 bytes (0 sectors), programmed 0 bytes (0 pages), skipped 60416 bytes (59 pages) at 115.05 kB/s [loader]
【调试】
安装cortex-debug插件,配置launch.json,其内容如下:
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Cortex Debug", "cwd": "${workspaceFolder}", "executable": "./build_exec/template.elf", "request": "launch", "type": "cortex-debug", "targetId": "MM32F5265E8PV", "runToEntryPoint": "main", "servertype": "pyocd", "cmsisPack": "./Debug/MindMotion.MM32F5260_DFP.0.2.0.pack", "svdFile": "./Debug/MM32F5260.svd", "postRestartCommands": [ "monitor reset" ], } ] }
按F5键,就可以进入调试了:
【总结】
由于MM32只提供了Keil、IAR的基础环境,所以需要在跨平台进行开发的,自己搭建开发环境还是必须的。笔者也是经过半个月的摸索才把环境搭建好。在此分享出来,希望能帮到在非win下面开发的朋友们。
附工程源码: