平台采用某米1代扫地机。 stm32f103真实项目程序。 c原程序 keil工程。 目前只有32端代码能实现延边避障防跌落充电等功能。 适合需要学习项目与代码规范的工程师 硬件驱动包含 陀螺仪姿态传感器bmi160、电源管理bq24733等。 软件驱动包括 IIC、PWM、SPI、多路ADC与DMA、编码器输入捕获、外部中断、通信协议、IAP升级、PID、freertos操作系统等。 代码注释清晰、代码规范好、每个函数必有输入输出范围参数解释。

本文基于对小米扫地机器人固件源码(版本 2.0)的深度分析,从系统架构、核心模块、通信协议及安全机制等多个维度,全面解读其嵌入式软件设计思路与实现要点。该系统基于 ARM Cortex-M3 内核的 STM32F10x 系列微控制器,采用 FreeRTOS 实时操作系统作为任务调度核心,整体架构清晰、模块化程度高,充分体现了消费类智能硬件在资源受限环境下的工程实践水平。


一、系统基础架构

1.1 实时操作系统支撑

系统以 FreeRTOS v9+ 作为底层调度引擎,充分利用其轻量、可裁剪、高可靠性的特点。通过配置 FreeRTOSConfig.h,启用了包括任务管理、队列通信、软件定时器、事件组等核心功能,并关闭了动态内存分配失败钩子、运行时统计等非必要特性,以优化资源占用。

平台采用某米1代扫地机。 stm32f103真实项目程序。 c原程序 keil工程。 目前只有32端代码能实现延边避障防跌落充电等功能。 适合需要学习项目与代码规范的工程师 硬件驱动包含 陀螺仪姿态传感器bmi160、电源管理bq24733等。 软件驱动包括 IIC、PWM、SPI、多路ADC与DMA、编码器输入捕获、外部中断、通信协议、IAP升级、PID、freertos操作系统等。 代码注释清晰、代码规范好、每个函数必有输入输出范围参数解释。

值得注意的是,系统未启用 MPU(内存保护单元),表明其运行在单一特权模式下,简化了权限管理,但也对应用层代码的健壮性提出了更高要求。

1.2 硬件抽象与驱动层

固件基于 ST 官方 STM32F10x 标准外设库(StdPeriph Driver) 构建硬件驱动,涵盖 GPIO、USART、I²C、SPI、ADC、TIM、FLASH、IWDG(独立看门狗)等关键外设。这种做法虽不如现代 HAL 库抽象度高,但在资源受限场景下具有代码体积小、执行效率高的优势。

驱动层封装良好,例如 ADC 用于采集悬崖传感器(Drop Sensor)模拟信号,TIM 用于电机 PWM 控制,USART 用于主控与上位机或模块间通信,为上层业务逻辑提供了稳定可靠的硬件接口。


二、核心功能模块

2.1 异常检测与安全控制

系统实现了完善的 异常状态监控机制,由独立的 vErrorAbnormalCheckTask 任务周期性执行。该任务负责:

  • 悬崖检测:通过 ADC 读取前后左右四个位置的红外传感器值,判断是否处于悬空边缘。采用差值阈值(gFALLDIFFERENTTHRESHOLD)与绝对阈值(gDROP_THRESHOLD)双重判据,提升抗干扰能力。
  • 碰撞检测:结合物理碰撞开关与超声波传感器数据,识别障碍物接触。
  • 电机故障诊断:监控驱动轮、滚刷、边刷、风机等电机的运行状态(如堵转、过流),一旦检测到异常,立即触发机器人状态机切换至安全模式(如后退、停止清扫)。

该机制是保障扫地机器人在复杂家居环境中安全运行的核心防线。

2.2 固件升级(IAP)机制

系统实现了完整的 In-Application Programming (IAP) 功能,支持通过串口等接口进行远程固件更新。其架构包含以下关键组件:

  • 双区存储:Flash 空间划分为 Bootloader 区(起始地址 0x08000000)与 Application 区(起始地址 APP_ADDR = 0x08010000,即 64KB 之后)。
  • 产品密钥验证:在固定地址 PASSWORDADDR = 0x08005000 存储产品应用密钥(PRODUCTAPP_PASSWORD = 0xFee1Dead),用于验证合法固件并作为跳转条件。
  • 环形缓冲写入:采用多缓冲区(TMPBUFNUM = 5,每块 TMPBUFSIZE = 2KB)构成环形队列,实现数据接收与 Flash 写入的异步解耦,避免因 Flash 编程延时阻塞通信。
  • 安全跳转:升级完成后,校验新固件栈顶地址合法性(检查是否位于 SRAM 区域 0x20000000 起始),随后重写密钥并跳转至新固件入口。

此 IAP 设计兼顾了可靠性与效率,是设备可维护性和功能迭代的基础。


三、通信协议设计

系统定义了一套 自定义帧结构通信协议,用于主控与外部模块(如上位机、充电座、传感器模组)的数据交互。协议特点如下:

  • 帧头标识:固定为 0xAA,便于帧同步。
  • 功能类型:通过 FrameFunction 字段区分命令帧(ffCommand)、数据帧、响应帧等。
  • 序列号机制:每帧包含递增序列号(FrameSequence),支持接收方检测丢帧或乱序。
  • 数据长度与校验:明确指示有效载荷长度(DataLength),并采用 字节累加和校验(Checksum) 保证传输完整性。
  • 错误反馈:定义了多种错误码(如 FrameFromatErrFrameCheckErrFrameSeqErrFrameLengthErr),便于快速定位通信问题。

该协议结构紧凑、解析高效,适用于低带宽、高实时性要求的嵌入式串行通信场景。


四、系统安全与健壮性

  • 看门狗守护:启用 IWDG,要求主任务定期“喂狗”,防止程序跑飞导致设备死锁。
  • 异常中断处理:对 HardFaultHandlerMemManageHandler 等关键异常中断进行了空实现(进入死循环),虽未实现复杂恢复逻辑,但可防止系统在严重错误下继续执行不可预知行为。
  • 堆栈溢出检测:FreeRTOS 配置中启用了 configCHECKFORSTACK_OVERFLOW(虽默认为 0,但架构支持),可在开发阶段辅助排查任务堆栈不足问题。

五、总结

小米扫地机器人固件展现了典型的嵌入式实时系统设计范式:以 FreeRTOS 为调度核心,构建模块化、层次化的软件架构;通过严谨的异常检测与安全控制策略保障设备物理安全;利用高效的 IAP 机制支持远程升级;并设计轻量可靠的通信协议实现内外部数据交互。整个系统在性能、资源占用与功能完整性之间取得了良好平衡,为其稳定、智能的清扫体验提供了坚实的软件基础。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐