第一章:项目概述与开发环境搭建

各位同学,欢迎来到《从零写一个智能按摩仪固件》的第一课。

做嵌入式开发这么多年,我见过太多人一上来就撸代码,结果硬件不匹配、工具链报错、烧录失败...折腾半天连个灯都点不亮。所以,咱们这节课先把地基打牢。

说白了,这一章就是回答三个问题:我们要做什么?用什么做?怎么开始做?

1.1 智能按摩仪项目介绍

先说说这个项目是干嘛的。

智能按摩仪,说白了就是一个能根据你的疲劳程度,自动调整按摩力度和模式的设备。它不像传统按摩仪那样只有几个固定档位,而是能感知你的肌肉状态,给出最合适的按摩方案。

我去年帮朋友做过一个类似的理疗仪项目,当时踩了不少坑。比如电机振动频率和人体舒适度的匹配问题,调了好几个版本才搞定。这些经验我会在后续章节里一一分享。

这个项目的核心功能包括:

  • 多模式按摩:敲击、揉捏、推拿、震动,四种模式可切换
  • 力度自适应:根据压力传感器反馈,自动调节电机转速
  • 定时保护:单次运行15分钟后自动停止,防止过度按摩
  • 蓝牙控制:手机APP可调节参数、查看使用记录
  • 电量管理:锂电池供电,低电量提醒

项目定位:这是一个中等复杂度的嵌入式项目。它涉及PWM控制、ADC采集、I2C/SPI通信、蓝牙协议栈、低功耗设计等多个知识点。做完这个项目,你基本能应对市面上80%的消费类电子产品开发。

1.2 功能需求分析

做项目之前,一定要把需求写清楚。我见过太多开发到一半改需求的,那叫一个痛苦。

咱们这个按摩仪,具体需求如下:

功能模块 具体需求 优先级
电机控制 4路独立PWM输出,频率20Hz-200Hz可调 P0(必须)
压力检测 ADC采样,分辨率10位以上,采样率100Hz P0
蓝牙通信 BLE 4.2以上,数据传输速率不低于10KB/s P1(重要)
按键交互 3个物理按键:模式切换、力度+、力度- P0
OLED显示 0.96寸128x64,显示当前模式、力度、电量 P1
电池管理 锂电池充电管理,电量检测精度±5% P1

嗯,这里要注意:P0是必须实现的,否则产品没法用。P1是锦上添花,但咱们课程里都会讲到。

1.3 硬件选型

选型这块,我个人的习惯是:先定主控,再定外设。主控决定了你能做什么,外设决定了你能做多好。

主控芯片:STM32F103C8T6

为什么选它?

  • 性价比高:淘宝几块钱一片,学习成本低
  • 资源够用:72MHz主频、64KB Flash、20KB RAM
  • 外设丰富:3个定时器、2个ADC、2个I2C、3个USART
  • 生态成熟:资料多、例程多、遇到问题好解决

我记得有一次项目赶工期,用STM32F103做原型验证,从画板到调通只用了三天。这芯片虽然老,但胜在稳定可靠。

电机驱动:DRV8837

按摩仪用的是微型直流振动电机,驱动电流不大(200mA以内)。DRV8837是TI的H桥驱动芯片,体积小、效率高,还带过流保护。

我曾经踩过一个坑:一开始用L298N驱动,结果板子做得跟砖头一样大。后来换成DRV8837,面积缩小了80%。所以选驱动芯片时,一定要考虑封装尺寸。

传感器:薄膜压力传感器 + HX711

压力检测用的是薄膜压力传感器,配合HX711模数转换芯片。HX711是24位高精度ADC,专门用于称重传感器,精度完全够用。

小提示:HX711的通信协议是类I2C的,但时序要求比较严格。我建议直接用GPIO模拟时序,这样移植起来更方便。

1.4 开发环境搭建

环境搭建这块,我推荐用Keil MDK + STM32CubeMX的组合。Keil负责编译调试,CubeMX负责生成初始化代码。

第一步:安装Keil MDK

  1. 去Keil官网下载MDK-ARM最新版(目前是5.38)
  2. 安装时选择默认路径,注意勾选「C51」和「ARM」两个组件
  3. 安装完成后,打开Pack Installer,下载STM32F1系列的DFP包

警告:Keil的License激活比较麻烦。如果你用的是正版,直接输入序列号就行。如果是学习用途,可以用评估版(代码限制32KB),咱们这个项目完全够用。

第二步:安装STM32CubeMX

CubeMX是ST官方出的图形化配置工具。用它配置时钟、外设、引脚,能省下大量时间。

  1. 从ST官网下载STM32CubeMX,安装过程一路Next
  2. 安装完成后,打开软件,点击「Help」→「Manage embedded software packages」
  3. 下载STM32CubeF1固件包(建议选最新版)

我个人习惯是:先用CubeMX生成工程框架,然后在Keil里写业务逻辑。这样既保证了底层配置的正确性,又保留了代码的灵活性。

第三步:创建工程模板

咱们创建一个标准模板,后续所有章节都基于这个模板开发。

// 工程目录结构
SmartMassager/
├── Core/
│   ├── Inc/          // 头文件
│   ├── Src/          // 源文件
│   └── startup/      // 启动文件
├── Drivers/
│   ├── CMSIS/        // ARM内核抽象层
│   └── STM32F1xx_HAL_Driver/  // HAL库
├── Middlewares/       // 中间件(蓝牙协议栈等)
├── User/             // 用户代码(main.c等)
└── Project/          // Keil工程文件

用CubeMX生成工程时,记得做以下配置:

  • 时钟配置:HSE 8MHz外部晶振,PLL倍频到72MHz
  • 调试接口:SWD模式,PA13/PA14
  • 外设使能:TIM2(PWM)、ADC1、I2C1(OLED)、USART1(蓝牙)
  • 中断配置:SysTick 1ms中断、TIM2更新中断

重点:生成代码后,记得在Keil里把优化等级设为-O0(不优化)。调试阶段千万别开优化,否则变量值都看不到,排查问题会非常痛苦。

1.5 验证环境

环境搭好了,怎么知道对不对?

写一个最简单的点灯程序:

// main.c
#include "main.h"

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    
    while (1)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // 板载LED
        HAL_Delay(500);  // 500ms闪烁
    }
}

编译下载后,如果板子上的LED以1Hz频率闪烁,恭喜你,环境搭建成功了!

如果没反应,别慌。先检查这几个地方:

  • 烧录器是否连接正确(SWD的4根线:VCC、GND、SWDIO、SWCLK)
  • 芯片供电是否正常(3.3V和GND)
  • 启动模式是否设置正确(BOOT0接GND)

嗯,我记得第一次用STM32时,折腾了一下午才发现是BOOT0没拉低。这种低级错误,犯过一次就记住了。

小结

这一章我们完成了三件事:

  1. 明确了智能按摩仪的项目目标和功能需求
  2. 完成了硬件选型:STM32F103 + DRV8837 + HX711
  3. 搭建了Keil + CubeMX的开发环境,并验证通过

下一章,咱们开始写第一个驱动——PWM电机控制。到时候我会详细讲讲怎么调出舒服的按摩频率,以及我当年踩过的那些坑。

公众号:蓝海资料掘金营,微信deep3321