STM32 HAL + FreeRTOS 实战:基于 GNU/Linux 工具链
从裸机外设到实时操作系统——一份 STM32F103 全栈嵌入式实战记录。
大多数教程
这个仓库
开发环境
Windows + Keil MDK(一键下载)
Linux + VS Code + CMake + arm-gcc
构建系统
IDE 自动管理,不透明
CMake + Ninja ,完全可控
烧录调试
Keil 内置
OpenOCD + ST-Link ,Python 脚本驱动
版本管理
通常没有
226+ commits ,每个外设/RTOS 特性独立提交
可复现性
依赖特定 IDE 版本
任何装了 arm-gcc + OpenOCD 的 Linux 机器都能构建
编辑体验
Keil 编辑器
VS Code + clangd (语法高亮、自动补全、跳转定义)
核心价值 :这个仓库证明了你理解编译-链接-烧录的全流程 ,而不是只会点 Keil 的下载按钮。当你换到 RISC-V、换到其他 ARM 芯片、换到 Zephyr RTOS——工具链思想完全复用。
第二部分:FreeRTOS 实时操作系统(8 个示例 + 模板)
编辑器: VS Code + clangd(代码补全/跳转/诊断)
编译器: arm-none-eabi-gcc(GNU Arm Embedded Toolchain)
构建: CMake 3.22+ + Ninja
调试: OpenOCD + ST-Link V2 + arm-none-eabi-gdb
烧录: Python 脚本驱动 OpenOCD(一键 Flash)
RTOS: FreeRTOS Kernel(CMSIS-RTOS v1 / v2 API)
# Ubuntu/Debian
sudo apt install cmake ninja-build gcc-arm-none-eabi openocd python3
# Arch
sudo pacman -S cmake ninja arm-none-eabi-gcc openocd python3
# 进入任意示例目录
cd 4-8_Tim_OC_PWM
# 配置(Debug 模式)
cmake --preset Debug
# 构建
cmake --build build/Debug -j$( nproc)
# 烧录(需要连接 ST-Link)
cmake --build build/Debug --target flash
或者使用 VS Code 快捷键:Ctrl+Shift+B → 选择 Build / Flash / Build & Flash。
# HAL 裸机项目
cp -r stm32_linux_template my_new_project
# FreeRTOS 项目
cp -r FreeRTOS_template my_freertos_project
# 修改 CMakeLists.txt 中的项目名,在 Core/ 下添加你的代码
MCU : STM32F103C8T6(Blue Pill / 最小系统板)
调试器 : ST-Link V2
移植到其他 STM32F1 芯片 :修改 CMakeLists.txt 中的 STM32F103XB_FLASH.ld 链接脚本和启动文件即可
HAL 裸机示例/
├── .vscode/ # VS Code tasks(Build / Flash / Debug)
├── .scripts/ # Python 构建和烧录脚本
├── cmake/ # 工具链文件(gcc-arm-none-eabi.cmake)+ STM32 CMake 模块
├── Core/
│ ├── Inc/ # 用户头文件(main.h 等)
│ └── Src/ # 用户源码(main.c + 外设初始化)
├── Drivers/ # STM32 HAL 库(CMSIS + HAL)
├── CMakeLists.txt # 顶层构建配置
├── CMakePresets.json # Debug / Release 预设
└── startup_stm32f103xb.s # 启动代码(GNU 汇编风格)
FreeRTOS 示例/(在 HAL 基础上增加)
├── Core/
│ ├── User/ # main.c —— 用户任务入口
│ ├── Sys/ # FreeRTOSConfig.h + 系统时钟配置
│ └── Hw/ # 硬件驱动(LED、Key、UART、Timer 等)
├── FreeRTOS/ # FreeRTOS Kernel 源码
└── Middlewares/ # CMSIS-RTOS 适配层
免费开源 ——没有授权费,在任何机器上都能搭建
理解底层 ——从编译、链接到烧录,每一步你都看得见。面试时被问到"程序是怎么从 C 代码变成 MCU 上运行的二进制",你能讲清楚
跨架构复用 ——这套 CMake + GCC 工作流切换到 RISC-V、ESP32、Zephyr RTOS 几乎零成本
CI/CD 就绪 ——命令行构建天然适合自动化测试和持续集成
简历信号 ——"会用 GNU 工具链独立搭建 STM32 开发环境,从裸机 HAL 一路做到 FreeRTOS"比"会用 Keil"有说服力得多
时钟 → GPIO → UART(轮询/中断/DMA)
↓
定时器 12 连击(从基本定时到编码器模式)
↓
ADC / I2C / SPI / RTC 通信外设
↓
FreeRTOS:任务调度 → 中断管理 → 信号量
→ 队列集 → 事件标志组 → 任务通知 → 软件定时器
MIT
如果你也在用 GNU 工具链学习 STM32,欢迎 Star / Fork。有问题可以提 Issue。