1. 项目背景与硬件选型
某米1代扫地机器人作为早期智能清洁设备代表,其主控采用STM32F103C8T6这款经典Cortex-M3内核MCU。这款芯片之所以被选中,核心在于其72MHz主频、64KB Flash和20KB RAM的配置完全满足扫地机的基础需求:实时处理多传感器数据(红外、碰撞、陀螺仪)、控制电机PWM输出、管理电池充放电逻辑,同时还能留出足够资源运行简单的路径规划算法。
从工程角度看,STM32F103系列的优势在于:
- 丰富的外设资源:4个USART、2个SPI、2个I2C接口,完美适配扫地机的传感器阵列
- 多达7个定时器,其中包含3个带PWM输出的高级定时器,可直接驱动电机
- 10位ADC用于电池电压监测和悬崖传感器采样
- 低至2.0V的工作电压,配合内置电压调节器,适合移动设备供电场景
实际开发中发现,某米1代的硬件设计有个巧妙之处:利用TIM1的互补PWM输出控制两个驱动电机,同时通过TIM1的刹车功能实现紧急制动,这种设计既节省了外部驱动IC成本,又提高了系统可靠性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Keil工程架构解析
原始工程采用Keil MDK-ARM开发环境,目录结构如下:
code复制Project/
├── CMSIS/ // Cortex微控制器软件接口标准
├── FWlib/ // ST标准外设库
├── User/
│ ├── main.c // 主循环与任务调度
│ ├── motor_ctrl.c // 电机驱动逻辑
│ ├── sensor_fusion.c // 多传感器数据处理
│ └── power_mgr.c // 电源管理
└── Output/ // 编译输出
关键配置要点:
-
在Options for Target → Target选项卡中:
- 正确设置晶振频率(某米使用8MHz外部晶振)
- 勾选"Use MicroLIB"以减小代码体积
- 设置正确的Flash算法(STM32F10x Medium-density)
-
在C/C++选项卡中:
makefile复制#define STM32F10X_MD // 中容量设备宏定义 #define HSE_VALUE 8000000 // 外部晶振8MHz -
分散加载文件(Scatter File)的特殊处理:
scatter复制LR_IROM1 0x08000000 0x00010000 { ; Flash区域 ER_IROM1 0x08000000 0x00010000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00005000 { ; RAM区域 .ANY (+RW +ZI) } }由于扫地机需要保存运行参数(如清洁模式、定时设置),实际工程中还保留了最后1页Flash(1KB)作为参数存储区。
3. 电机控制子系统实现
扫地机的运动控制采用双轮差速转向方案,核心代码如下:
c复制// motor_ctrl.h
typedef struct {
int16_t left_pwm; // 左电机PWM占空比(-1000~1000)
int16_t right_pwm; // 右电机PWM占空
