40. 固件架构与 FreeRTOS 任务¶
40.1 学习目标¶
从程序入口追踪初始化、中断和 FreeRTOS 任务,知道速度命令在哪接收、电机在哪更新、状态在哪发送,自检失败又在哪阻止电机使能。
固件是存放在控制板中、上电后直接运行的程序。WHEELTEC 底盘常用的 STM32 是一系列MCU:它把处理器、存储器和串口、定时器等外设集成在一块芯片内,适合按固定周期读取传感器并控制电机。FreeRTOS 是面向微控制器的实时操作系统(Real-Time Operating System, RTOS),负责按优先级和周期调度多个任务。
40.2 适用范围¶
WHEELTEC STM32 底盘固件。不同控制板的外设和任务名会变化,本文讲职责,不假定函数名完全一致。
40.3 操作前检查¶
- 只读当前匹配控制板的源码,不先改代码。
- 保存工程、编译器版本和宏定义。
- 能从源码恢复到出厂固件。
40.4 工作原理¶
初始化与任务调度¶
典型固件由启动初始化、周期任务和中断组成。中断会在外设事件发生时暂时打断当前任务,先处理接收数据或计时等紧急工作。串口/CAN 接收也可能使用DMA,让外设在较少占用处理器的情况下把数据写入内存。控制任务按周期更新运动学与 PI,传感器任务读取 IMU/编码器,通信任务发送状态,人机任务刷新 OLED、蜂鸣器和按键。
实时性取决于任务能否按约定周期及时运行。控制周期忽快忽慢会影响编码器测速、PI 参数和里程计积分;增加任务数量并不会改善实时性。
40.5 固件实验记录¶
STM32 串口、PWM 与编码器最小实验¶
这组三个实验把完整底盘固件拆成可观察的外设边界:先证明串口能收发,再证明定时器能输出 PWM,最后证明编码器能够计数和辨别方向。完成这些实验不等于完整底盘固件兼容,也不能据此形成烧录建议。
- 静态校对:只确认源码、目标芯片、引脚和计算关系;
- 历史构建:只证明某个旧环境曾经生成目标文件;
- 当前构建:证明当前工作副本在记录的工具链中编译通过;
- 实机验证:同一板卡、同一固件、同一接线下得到测量记录。
前三项都不能推出当前板卡适合烧录,也不能推出 C30D、C50 或 R680 兼容。本文不是独立固件或烧录教程;没有板卡匹配固件、原理图和回滚文件时,不得进入烧录步骤。
使用边界¶
本节使用教材代码仓库中的完整实验工程,不提供可直接烧录的固件文件。用于校对流程的基线工程面向 STM32F103C8T6 核心板,工程记录使用 Keil MDK 5.33、Arm Compiler 5.06 update 7 和 STM32F1 标准外设库。C30D、C50A/B/C、R680 或其他控制板的芯片、引脚、时钟、下载地址和电平可能不同,不能直接套用。
开始前必须记录:
| 项目 | 需要确认的内容 |
|---|---|
| 目标板 | 完整型号、MCU 丝印、供电电压和原理图版本 |
| 工程 | 目标芯片、启动文件、Flash/RAM 地址、库和编译器版本 |
| 下载 | ST-Link/串口下载方式、SWD/BOOT 接线和可用回滚文件 |
| 测量 | 万用表或示波器量程、探头衰减、逻辑地连接 |
| 安全 | 电机断开或失能、急停可用、没有未知外设占用测试引脚 |
先核对板卡,再接线或烧录
PA0、PA9、PA10、PB6 和 PB7 只描述本文校对基线,不适用于未经核对的 C30D、C50 或 R680。若当前板卡原理图、MCU、匹配固件或现有接线不能确认,实验状态保持“待实机验证”,不要连接探头、串口模块、编码器或烧录工程。
每项实验开始前还要写下数值验收门槛,例如允许的逻辑电平、频率误差、静止计数和重复测量偏差。门槛来自当前芯片/板卡规格、时钟误差和仪器精度;“接近”“明显”或“偶尔”不能单独作为通过标准。普通验收失败应停止本项并排查,过压、发热、复位、机械运动等安全停止条件则应立即断电。
统一实验记录¶
| 字段 | 记录内容 |
|---|---|
| 实验 | 串口 / PWM / 编码器 |
| 板卡与 MCU | 丝印、原理图版本、供电 |
| 工程基线 | 工程副本、目标芯片、编译器、库、提交或文件哈希 |
| 接线 | MCU 引脚、外设端、地和电平 |
| 配置 | 串口帧格式 / TIM 时钟、PSC、ARR、CCR / 编码器模式 |
| 预期值 | 手算结果或预期字节/方向 |
| 实测值 | 串口记录、波形截图、计数和时间窗 |
| 偏差 | 偏差大小、可能边界和复测结果 |
| 验收门槛 | 逻辑电平、频率误差、静止计数、重复测量误差 |
| 安全状态 | 执行器是否失能、急停、供电和停止条件 |
| 结论 | 通过 / 失败 / 待实机验证 |
只有同一控制板、同一工程和同一接线下的实测记录才能支持“实验通过”。没有硬件测量时,结论必须写成“待实机验证”;不能把静态源码阅读、历史构建日志或文件名扩展为当前板卡可烧录、可运行或与 R680 兼容。
40.6 验收标准¶
- 有一张命令到执行、反馈到上报的任务图。
- 控制周期和测速周期明确。
- 自检、急停、通信超时和电机失能路径可定位。
- 共享变量的生产者、消费者和更新时机明确。
40.7 故障排查¶
| 现象 | 检查 |
|---|---|
| 偶发速度跳变 | 接收帧一致性、共享变量和任务周期 |
| OLED 卡住但电机仍动 | 人机任务阻塞或优先级问题 |
| 通信正常但控制更新慢 | 控制任务延时、阻塞调用或优先级 |
| 自检偶发失败 | 初始化顺序、传感器稳定时间和电压 |
本章代码:固件证据记录
使用 stm32/labs/uart/stm32f103-stdperiph、stm32/labs/pwm/stm32f103-stdperiph 与 stm32/labs/encoder/stm32f103-stdperiph 的完整工程目录;本章只做静态核对。验收:记录 MCU、启动文件和工程文件;边界:无 Keil/Arm GCC 时不宣称构建或烧录。