| name | stm32-development-workflow |
| description | STM32通用程序开发完整流程,基于STM32CubeCLT命令行工具链。涵盖工具链安装、
HAL库配置、项目构建、固件编译和ST-Link烧录。适用于STM32F1/F4/H7等系列,
解决编译错误、链接错误、烧录失败等常见问题。
|
| author | EricSun |
| version | 1.0.0 |
| date | "2025-02-27T00:00:00.000Z" |
STM32 通用程序开发流程
概述
基于STM32CubeCLT命令行工具链的完整STM32开发流程,无需依赖Keil或STM32CubeIDE。
开发环境准备
1. 安装STM32CubeCLT
从ST官网下载并安装STM32CubeCLT,包含:
- arm-none-eabi-gcc 编译器
- STM32CubeProgrammer (烧录工具)
- ST-Link驱动
典型安装路径:C:\ST\STM32CubeCLT_1.21.0
2. 获取HAL库
从GitHub下载STM32Cube固件包:
git clone https://github.com/STMicroelectronics/STM32CubeF4.git
固件包目录结构:
STM32Cube_FW_F4_V1.28.0/
├── Drivers/
│ ├── STM32F4xx_HAL_Driver/ # HAL库源文件
│ ├── CMSIS/ # CMSIS核心文件
│ └── BSP/ # 板级支持包
├── Projects/ # 示例项目
└── Utilities/ # 工具
项目目录结构
my-stm32-project/
├── Core/
│ ├── Inc/ # 核心头文件
│ │ └── main.h
│ └── Src/ # 核心源文件
│ └── main.c
├── Drivers/
│ ├── STM32F4xx_HAL_Driver/ # HAL库
│ │ ├── Inc/ # HAL头文件
│ │ │ └── stm32f4xx_hal_conf.h # 关键配置文件
│ │ └── Src/ # HAL源文件
│ ├── CMSIS/ # CMSIS
│ │ ├── Core/ # CMSIS核心
│ │ └── Device/ST/STM32F4xx/ # 设备特定文件
│ │ ├── Include/ # 启动文件
│ │ └── Source/Templates/
│ │ ├── gcc/ # GCC启动文件
│ │ │ └── startup_stm32f429xx.s
│ │ └── system_stm32f4xx.c
│ └── BSP/ # 板级支持包(可选)
├── build/ # 构建输出
└── build.sh # 构建脚本
HAL库配置
关键配置文件 stm32f4xx_hal_conf.h
启用需要的HAL模块:
#define HAL_MODULE_ENABLED
#define HAL_GPIO_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_UART_MODULE_ENABLED
#define HAL_TIM_MODULE_ENABLED
#define HAL_I2C_MODULE_ENABLED
#define HAL_SPI_MODULE_ENABLED
#define HAL_ADC_MODULE_ENABLED
时钟配置(HSE_VALUE必须与硬件匹配):
#if !defined (HSE_VALUE)
#define HSE_VALUE 8000000U
#endif
构建脚本 build.sh
#!/bin/bash
TOOLCHAIN="/c/ST/STM32CubeCLT_1.21.0/GNU-tools-for-STM32/bin"
CC="${TOOLCHAIN}/arm-none-eabi-gcc"
AS="${TOOLCHAIN}/arm-none-eabi-gcc -x assembler-with-cpp"
LD="${TOOLCHAIN}/arm-none-eabi-gcc"
CP="${TOOLCHAIN}/arm-none-eabi-objcopy"
SZ="${TOOLCHAIN}/arm-none-eabi-size"
PROJECT_DIR="/path/to/project"
BUILD_DIR="${PROJECT_DIR}/build"
MCU="-mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard"
DEFS="-DUSE_HAL_DRIVER -DSTM32F429xx"
INCLUDES="-I${PROJECT_DIR}/Core/Inc \
-I${PROJECT_DIR}/Drivers/STM32F4xx_HAL_Driver/Inc \
-I${PROJECT_DIR}/Drivers/CMSIS/Device/ST/STM32F4xx/Include \
-I${PROJECT_DIR}/Drivers/CMSIS/Include"
CFLAGS="${MCU} ${DEFS} ${INCLUDES} -O2 -Wall -fdata-sections -ffunction-sections"
ASFLAGS="${MCU} ${DEFS} ${INCLUDES} -Wall"
LDSCRIPT="${PROJECT_DIR}/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/linker/STM32F429ZITx_FLASH.ld"
LDFLAGS="${MCU} -specs=nano.specs -T${LDSCRIPT} -lc -lm -lnosys -Wl,--gc-sections"
HAL_SRCS=(
"${PROJECT_DIR}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c"
"${PROJECT_DIR}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c"
"${PROJECT_DIR}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c"
"${PROJECT_DIR}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c"
)
CORE_SRCS=(
"${PROJECT_DIR}/Core/Src/main.c"
"${PROJECT_DIR}/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c"
)
ASM_SRCS=(
"${PROJECT_DIR}/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f429xx.s"
)
compile_c() {
local src=$1
local obj="${BUILD_DIR}/$(basename ${src%.c}.o)"
echo " CC ${src}"
${CC} -c ${CFLAGS} -o ${obj} ${src}
echo "${obj}"
}
compile_asm() {
local src=$1
local obj="${BUILD_DIR}/$(basename ${src%.s}.o)"
echo " AS ${src}"
${AS} -c ${ASFLAGS} -o ${obj} ${src}
echo "${obj}"
}
echo "Building project..."
mkdir -p ${BUILD_DIR}
OBJECTS=""
for src in "${HAL_SRCS[@]}"; do
obj=$(compile_c "${src}")
OBJECTS="${OBJECTS} ${obj}"
done
for src in "${CORE_SRCS[@]}"; do
obj=$(compile_c "${src}")
OBJECTS="${OBJECTS} ${obj}"
done
for src in "${ASM_SRCS[@]}"; do
obj=$(compile_asm "${src}")
OBJECTS="${OBJECTS} ${obj}"
done
echo "Linking..."
${LD} ${OBJECTS} ${LDFLAGS} -o ${BUILD_DIR}/project.elf
${CP} -O ihex ${BUILD_DIR}/project.elf ${BUILD_DIR}/project.hex
${CP} -O binary -S ${BUILD_DIR}/project.elf ${BUILD_DIR}/project.bin
${SZ} ${BUILD_DIR}/project.elf
echo "Build complete!"
烧录流程
1. 检查ST-Link连接
STM32_Programmer_CLI.exe -l stlink
2. 升级ST-Link固件(如需要)
cd C:\ST\STM32CubeCLT_1.21.0
java -jar STLink-gdb-server/bin/STLinkUpgrade.jar -sn [序列号]
3. 烧录固件
STM32_Programmer_CLI.exe \
-c port=SWD sn=[序列号] \
-w build/project.hex 0x08000000 \
-v -rst
参数说明:
-c port=SWD: 使用SWD接口
-w: 写入文件
-v: 验证
-rst: 复位运行
常见编译错误及解决
| 错误 | 原因 | 解决 |
|---|
unknown type name 'DMA2D_HandleTypeDef' | HAL模块未启用 | 在hal_conf.h中定义#define HAL_DMA2D_MODULE_ENABLED |
undefined reference to 'SystemCoreClock' | 缺少system文件 | 添加system_stm32f4xx.c到编译 |
undefined reference to 'FMC_SDRAM_Init' | 缺少LL库 | 添加stm32f4xx_ll_fmc.c到编译 |
multiple definition of 'Font8' | 字体重复定义 | 检查是否重复包含字体源文件 |
cannot open linker script file | 链接器脚本路径错误 | 检查LDSCRIPT路径 |
调试技巧
1. 验证HAL配置
#if !defined(HSE_VALUE)
#error "HSE_VALUE not defined!"
#endif
2. 使用LED指示程序状态
BSP_LED_Init(LED3);
while (1) {
BSP_LED_Toggle(LED3);
HAL_Delay(500);
}
3. 检查时钟配置
printf("System Clock: %lu Hz\n", HAL_RCC_GetSysClockFreq());
参考资源