From 44f1fcc592a5c85617dc37ae885f7e7c1735552a Mon Sep 17 00:00:00 2001 From: LuChiChick <1084116302@qq.com> Date: Mon, 14 Sep 2026 20:11:48 +0800 Subject: [PATCH] commit for customized Makefile and build script. && Implemented a User_Main function call demo as a bridge to allow program execution to transition from main.c to C++ environment. --- Core/Inc/main.h | 3 + Core/Src/main.c | 3 + Tools/Makefile | 335 +++++++++++++++++++++++++++++ User/Main/Inc/Shared_Resources.hpp | 4 + User/Main/Src/User_Main.cpp | 12 ++ make&build.bat | 2 + 6 files changed, 359 insertions(+) create mode 100644 Tools/Makefile create mode 100644 User/Main/Inc/Shared_Resources.hpp create mode 100644 User/Main/Src/User_Main.cpp create mode 100644 make&build.bat diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 820d19a..7bf8f9e 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -75,6 +75,9 @@ void Error_Handler(void); /* USER CODE BEGIN Private defines */ +// 自定义函数入口 +void User_Main(void); + /* USER CODE END Private defines */ #ifdef __cplusplus diff --git a/Core/Src/main.c b/Core/Src/main.c index e3126cd..2ce1d28 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -103,6 +103,9 @@ int main(void) MX_SPI1_Init(); /* USER CODE BEGIN 2 */ + // 跳转到自定义函数入口 + User_Main(); + /* USER CODE END 2 */ /* Call init function for freertos objects (in cmsis_os2.c) */ diff --git a/Tools/Makefile b/Tools/Makefile new file mode 100644 index 0000000..172afe2 --- /dev/null +++ b/Tools/Makefile @@ -0,0 +1,335 @@ +# 目标文件名称 +TARGET_FILE_NAME = STM32G030F6P6_Evaluation + +# CPU架构 +CPU = -mcpu=cortex-m0plus + +# 浮点运算单元 +FPU = # NONE for Cortex-M0/M0+/M3 + +# 浮点运算方式 +FLOAT-ABI = # NONE for Cortex-M0/M0+/M3 + +# 编译目录 +BUILD_DIR = Build + +# Release 编译子目录 +SUB_DIR_RELEASE = Release + +# Debug 编译子目录 +SUB_DIR_DEBUG = Debug + +# Release 优化等级 +RELEASE_OPT = -Os + +# Debug 优化等级 +DEBUG_OPT = -Og + +# C编译标准 +C_STD = c23 + +# C++编译标准 +CXX_STD = c++23 + +# 源文件编码定义 +INPUT_CHAR_ENCODING = UTF-8 + +# 编译产物单字节字符(char)编码定义 +OUTPUT_CHAR_ENCODING = GBK + +# 编译产物宽字符(wchar_t)编码定义 +OUTPUT_WCHAR_ENCODING = UTF-16LE + +# 编译工具前缀 +TOOLCHAIN_PREFIX = arm-none-eabi- + +# C编译工具 +C_COMPLIER = $(strip $(TOOLCHAIN_PREFIX))gcc + +# C++编译工具 +C++_COMPLIER = $(strip $(TOOLCHAIN_PREFIX))g++ + +# 编译后处理工具 +AS = $(strip $(TOOLCHAIN_PREFIX))gcc -x assembler-with-cpp +CP = $(strip $(TOOLCHAIN_PREFIX))objcopy +SZ = $(strip $(TOOLCHAIN_PREFIX))size +HEX = $(CP) -O ihex +BIN = $(CP) -O binary -S + +################################################################################## + +# 链接库 +LIBS_LINK = \ +c \ +m \ +nosys \ + +# 额外链接库目录 +LIB_PATHS = \ + +# ASM 汇编文件 +ASM_SOURCES = \ +startup_stm32g030xx.s \ + +# 链接脚本 +LD_SCRIPT = STM32G030XX_FLASH.ld + +# C定义 +C_DEFS = \ +USE_HAL_DRIVER \ +STM32G030xx \ + +# C头文件目录 +C_INCLUDES_PATHS = \ +Core/Inc \ +Drivers/STM32G0xx_HAL_Driver/Inc \ +Drivers/STM32G0xx_HAL_Driver/Inc/Legacy \ +Middlewares/Third_Party/FreeRTOS/Source/include \ +Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS \ +Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0 \ +Drivers/CMSIS/Device/ST/STM32G0xx/Include \ +Drivers/CMSIS/Include \ + +# C源文件目录 +C_SOURCES_PATHS = \ + +# C额外单个源文件 +C_EXTERA_SOURCES = \ +Core/Src/main.c \ +Core/Src/gpio.c \ +Core/Src/app_freertos.c \ +Core/Src/dma.c \ +Core/Src/tim.c \ +Core/Src/usart.c \ +Core/Src/stm32g0xx_it.c \ +Core/Src/stm32g0xx_hal_msp.c \ +Core/Src/stm32g0xx_hal_timebase_tim.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_gpio.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cortex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_exti.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c \ +Core/Src/system_stm32g0xx.c \ +Middlewares/Third_Party/FreeRTOS/Source/croutine.c \ +Middlewares/Third_Party/FreeRTOS/Source/event_groups.c \ +Middlewares/Third_Party/FreeRTOS/Source/list.c \ +Middlewares/Third_Party/FreeRTOS/Source/queue.c \ +Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c \ +Middlewares/Third_Party/FreeRTOS/Source/tasks.c \ +Middlewares/Third_Party/FreeRTOS/Source/timers.c \ +Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c \ +Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c \ +Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c \ +Core/Src/sysmem.c \ +Core/Src/syscalls.c \ +Core/Src/i2c.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_i2c.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_i2c_ex.c \ +Core/Src/adc.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_adc.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_adc_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_adc.c \ +Core/Src/spi.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c \ + +# C++定义 +CXX_DEFS = \ +$(C_DEFS) \ + +# C++ 头文件目录 +CXX_INCLUDES_PATHS = \ +$(C_INCLUDES_PATHS) \ +User/Main/Inc \ + + +# C++源文件目录 +CXX_SOURCES_PATHS = \ +User/Main/Src \ + +# C++额外单个源文件 +CXX_EXTERA_SOURCES = \ + +################################################################################## + +# MCU编译选项 +MCU_FLAGS = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) + +# C编译选项 +C_FLAGS = $(MCU_FLAGS) \ + $(foreach text,$(C_DEFS),$(addprefix -D,$(text))) \ + $(foreach path,$(C_INCLUDES_PATHS),$(addprefix -I,$(path))) \ + -std=$(strip $(C_STD)) \ + -finput-charset=$(strip $(INPUT_CHAR_ENCODING)) \ + -fexec-charset=$(strip $(OUTPUT_CHAR_ENCODING)) \ + -fwide-exec-charset=$(strip $(OUTPUT_WCHAR_ENCODING)) \ + -Wall \ + -fdata-sections \ + -ffunction-sections \ + -MMD -MP -MF"$(@:%.o=%.d)" \ + +# C++编译选项 +CXX_FLAGS = $(MCU_FLAGS) \ + $(foreach text,$(CXX_DEFS),$(addprefix -D,$(text))) \ + $(foreach path,$(CXX_INCLUDES_PATHS),$(addprefix -I,$(path))) \ + -std=$(strip $(CXX_STD)) \ + -finput-charset=$(strip $(INPUT_CHAR_ENCODING)) \ + -fexec-charset=$(strip $(OUTPUT_CHAR_ENCODING)) \ + -fwide-exec-charset=$(strip $(OUTPUT_WCHAR_ENCODING)) \ + -Wall \ + -fno-rtti \ + -fno-exceptions \ + -fverbose-asm \ + -fdata-sections \ + -ffunction-sections \ + -MMD -MP -MF"$(@:%.o=%.d)" \ + +# 链接选项 +LD_FLAGS = $(MCU_FLAGS) \ + -specs=nano.specs \ + -T$(LD_SCRIPT) \ + $(LIB_PATHS) \ + $(foreach text,$(LIBS_LINK),$(addprefix -l,$(text))) \ + -Wl,-Map=$(basename $@).map,--cref \ + -Wl,--gc-sections \ + -Wl,--print-memory-usage \ + +################################################################################## + +# C目标文件及索引目录关联 +OBJECTS = $(notdir $(C_EXTERA_SOURCES:.c=.o)) +OBJECTS += $(subst .c,.o,$(notdir $(foreach path,$(C_SOURCES_PATHS),$(wildcard $(path)/*.c)))) +vpath %.c $(sort $(dir $(C_EXTERA_SOURCES))) $(sort $(C_SOURCES_PATHS)) + +# C++目标文件及索引目录关联 +OBJECTS += $(notdir $(CXX_EXTERA_SOURCES:.cpp=.o)) +OBJECTS += $(subst .cpp,.o,$(notdir $(foreach path,$(CXX_SOURCES_PATHS),$(wildcard $(path)/*.cpp)))) +vpath %.cpp $(sort $(dir $(CXX_EXTERA_SOURCES))) $(sort $(CXX_SOURCES_PATHS)) + +# ASM汇编目标文件及索引目录关联 +OBJECTS += $(notdir $(ASM_SOURCES:.s=.o)) +vpath %.s $(sort $(dir $(ASM_SOURCES))) + +# Release 目标文件 +RELEASE_OBJECTS = $(addprefix $(BUILD_DIR)/$(SUB_DIR_RELEASE)/,$(OBJECTS)) + +# Debug 目标文件 +DEBUG_OBJECTS = $(addprefix $(BUILD_DIR)/$(SUB_DIR_DEBUG)/,$(OBJECTS)) + +################################################################################## + +# all任务 目标为 release 和 debug 产物 +all: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).elf \ + $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).hex \ + $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).bin \ + $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).elf \ + $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).hex \ + $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).bin \ + + @echo ====== [All] Build Procedure Accomplished ====== + +# release任务 目标为 release 产物 +release: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).elf \ + $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).hex \ + $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).bin \ + + @echo ====== [Release] Build Procedure Accomplished ====== + +# debug任务 目标为 debug 产物 +debug: $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).elf \ + $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).hex \ + $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).bin \ + + @echo ====== [Debug] Build Procedure Accomplished ====== + +# 清理任务 +clean: $(BUILD_DIR) + powershell rm -r $(BUILD_DIR) + +# 构建目录生成 +$(BUILD_DIR): + powershell mkdir $@ + +# Release 工作目录生成 +$(BUILD_DIR)/$(SUB_DIR_RELEASE): | $(BUILD_DIR) + powershell mkdir $@ + +# Debug 工作目录生成 +$(BUILD_DIR)/$(SUB_DIR_DEBUG): | $(BUILD_DIR) + powershell mkdir $@ + +# Release 最终可执行文件编译任务 +$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).elf: $(RELEASE_OBJECTS) + @echo ====== [Release] All File Compiled. Now Linking... ====== + $(C++_COMPLIER) $(RELEASE_OBJECTS) -s -o $@ $(LIB_LINK) $(LD_FLAGS) + $(SZ) $@ + @echo ====== [Release] Program Link Finished ====== + +# Release Hex文件生成任务 +$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).hex: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).elf + $(HEX) $< $@ + +# Release Bin文件生成任务 +$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).bin: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).elf + $(BIN) $< $@ + +# Debug 最终可执行文件编译任务 +$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).elf: $(DEBUG_OBJECTS) + @echo ====== [Debug] All File Compiled. Now Linking... ====== + $(C++_COMPLIER) $(DEBUG_OBJECTS) -o $@ $(LIB_LINK) $(LD_FLAGS) + $(SZ) $@ + @echo ====== [Debug] Program Link Finished ====== + +# Debug Hex文件生成任务 +$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).hex: $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).elf + $(HEX) $< $@ + +# Debug Bin文件生成任务 +$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).bin: $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).elf + $(BIN) $< $@ + +# C Release 目标文件编译 +$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.c Tools/Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE) + @echo ====== [Release] C Source File "$<" Compiling... ====== + $(C_COMPLIER) -c $(C_FLAGS) $(RELEASE_OPT) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(notdir $(<:.c=.lst)) $< -o $@ + +# C++ Release 目标文件编译 +$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.cpp Tools/Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE) + @echo ====== [Release] C++ Source File "$<" Compiling... ====== + $(C++_COMPLIER) -c $(CXX_FLAGS) $(RELEASE_OPT) -Wa,-a,-ad,-ahlms=$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(notdir $(<:.cpp=.lst)) $< -o $@ + +# ASM Release 目标文件编译 +$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.s Tools/Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE) + @echo ====== [Release] ASM File "$<" Compiling... ====== + $(AS) -c $(C_FLAGS) $(RELEASE_OPT) $< -o $@ + +# C Debug 目标文件编译 +$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.c Tools/Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG) + @echo ====== [Debug] C Source File "$<" Compiling... ====== + $(C_COMPLIER) -c $(C_FLAGS) $(DEBUG_OPT) -g -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(notdir $(<:.c=.lst)) $< -o $@ + +# C++ Debug 目标文件编译 +$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.cpp Tools/Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG) + @echo ====== [Debug] C++ Source File "$<" Compiling... ====== + $(C++_COMPLIER) -c $(CXX_FLAGS) $(DEBUG_OPT) -g -Wa,-a,-ad,-ahlms=$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(notdir $(<:.cpp=.lst)) $< -o $@ + +# ASM Release 目标文件编译 +$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.s Tools/Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG) + @echo ====== [Release] ASM File "$<" Compiling... ====== + $(AS) -c $(C_FLAGS) $(DEBUG_OPT) $< -o $@ + +# 依赖关系 +-include $(RELEASE_OBJECTS:.o=.d) +-include $(DEBUG_OBJECTS:.o=.d) \ No newline at end of file diff --git a/User/Main/Inc/Shared_Resources.hpp b/User/Main/Inc/Shared_Resources.hpp new file mode 100644 index 0000000..3d981eb --- /dev/null +++ b/User/Main/Inc/Shared_Resources.hpp @@ -0,0 +1,4 @@ +#ifndef __SHARED_RESOURCES_HPP__ +#define __SHARED_RESOURCES_HPP__ + +#endif \ No newline at end of file diff --git a/User/Main/Src/User_Main.cpp b/User/Main/Src/User_Main.cpp new file mode 100644 index 0000000..52b9e2b --- /dev/null +++ b/User/Main/Src/User_Main.cpp @@ -0,0 +1,12 @@ +extern "C" +{ +#include "usart.h" +} + +// 自定义函数入口 +extern "C" void User_Main(void) +{ + HAL_UART_Transmit(&huart2, (const uint8_t *)"Hello world from C++ !!\r\n", 25, 1000); + + return; +} \ No newline at end of file diff --git a/make&build.bat b/make&build.bat new file mode 100644 index 0000000..74e3c33 --- /dev/null +++ b/make&build.bat @@ -0,0 +1,2 @@ +@echo off +.\Tools\mingw32-make.exe -f .\Tools\Makefile %* \ No newline at end of file