390 字
2 分钟
从零搭建 STM32 嵌入式开发环境:工具链、调试与工程化
从零搭建 STM32 嵌入式开发环境
告别 CubeIDE,拥抱命令行
很多嵌入式开发者习惯了 STM32CubeIDE 的图形界面,但当你需要自动化构建、CI/CD 集成、或者跨平台开发时,命令行工具链是更好的选择。
GNU ARM 工具链配置
# macOS 安装brew install --cask gcc-arm-embedded
# Linux 安装wget https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/\arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xztar -xf arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xzexport PATH=$PATH:/opt/arm-gnu-toolchain/bin
# 验证arm-none-eabi-gcc --versionCMake 构建系统
现代的 STM32 项目应该使用 CMake 管理。一个典型项目的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)project(stm32f4-blink C ASM)
set(CMAKE_SYSTEM_NAME Generic)set(CMAKE_SYSTEM_PROCESSOR arm)set(CMAKE_C_COMPILER arm-none-eabi-gcc)set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
# 处理器配置set(CPU_FLAGS "-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16")set(CMAKE_C_FLAGS "${CPU_FLAGS} -Os -Wall -ffunction-sections -fdata-sections")set(CMAKE_EXE_LINKER_FLAGS "${CPU_FLAGS} -T${CMAKE_SOURCE_DIR}/STM32F407VGTx_FLASH.ld -Wl,--gc-sections")OpenOCD 调试实战
# 启动 OpenOCDopenocd -f interface/stlink.cfg -f target/stm32f4x.cfg
# GDB 连接(另一个终端)arm-none-eabi-gdb build/stm32f4-blink.elf(gdb) target extended-remote :3333(gdb) monitor reset halt(gdb) load(gdb) continueFreeRTOS 集成要点
在 STM32 上跑 FreeRTOS 需要注意三件事:
-
SysTick 冲突:FreeRTOS 使用 SysTick 作为心跳,HAL 库也依赖 SysTick。解决方式是让 HAL 使用一个硬件定时器,把 SysTick 留给 RTOS。
-
中断优先级:STM32 使用 NVIC 优先级分组。确保
configMAX_SYSCALL_INTERRUPT_PRIORITY设置正确,允许在临界区中调用 FromISR 函数。 -
栈溢出检测:开启
configCHECK_FOR_STACK_OVERFLOW = 2,在任务栈底部放置 canary 值。
持续集成
用 GitHub Actions 自动化构建:
name: Buildon: [push, pull_request]jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install toolchain run: | sudo apt-get install gcc-arm-none-eabi cmake - name: Build run: | mkdir build && cd build cmake .. && make -j$(nproc)嵌入式开发不是”能跑就行”。完善的工具链和工程化实践,才是从 demo 走向产品的关键一步。
从零搭建 STM32 嵌入式开发环境:工具链、调试与工程化
https://mizuki.mysqil.com/posts/stm32-embedded-guide/