第一章:剃须刀嵌入式系统概述

各位同学好,我是老张。做嵌入式这行十几年了,从最早的8位单片机一路做到现在的双核处理器。今天咱们聊的这门课,说白了就是教你怎么把RTOS塞进剃须刀里。你可能会问:剃须刀也要操作系统?嗯,我当年第一次听到这个需求时也是这个反应。

但你想啊,现在的剃须刀早不是那个只会转的傻家伙了。智能感应、电量管理、甚至蓝牙连接手机App...这些功能堆在一起,裸机编程真的扛不住。我有个项目就吃过这个亏——功能越加越多,中断优先级调得我头秃,最后不得不推倒重来。

1.1 剃须刀产品功能需求分析

先说说剃须刀到底要干哪些活。别小看这个,需求分析做不好,后面全是坑。

  • 电机控制:这是核心。无刷直流电机(BLDC)的启停、转速调节、堵转保护。我见过不少方案用PWM直接驱动,但说实话,想要顺滑的调速体验,得用FOC(磁场定向控制)。
  • 电池管理:锂电池充电、电量检测、低电量提醒。这里有个坑——电量检测不能简单读电压,锂电池放电曲线不是线性的。我曾经用查表法做过,效果还行。
  • 人机交互:按键、LED指示灯、甚至OLED屏幕。高端点的还有触摸滑动调速。
  • 传感器采集:霍尔传感器测转速、压力传感器检测贴合力度。嗯,压力传感器这块我踩过雷,后面会细说。
  • 无线通信:蓝牙BLE连接手机App,记录剃须习惯、推送清洁提醒。这个功能现在基本是标配了。
  • 安全保护:过流保护、过温保护、防水检测。剃须刀嘛,总得在浴室用,防水等级至少IPX7。

核心要点:这些功能不是简单堆砌。它们对实时性要求不同——电机控制需要微秒级响应,蓝牙通信可以容忍毫秒级延迟。这就是为什么我们需要RTOS来调度。

1.2 嵌入式系统选型原则

选型这事儿,说白了就是平衡的艺术。我个人的习惯是,先列需求,再定方案。别一上来就选最贵的芯片,也别图便宜选个跑不动的。

几个关键原则:

  1. 性能够用就行:剃须刀不是手机,不需要跑Linux。Cortex-M系列足够了。我见过有人用i.MX做剃须刀,那真是杀鸡用牛刀。
  2. 外设要匹配:至少需要2路定时器(一路PWM,一路输入捕获)、1路ADC(电池检测)、1路UART(调试用)、1路I2C或SPI(连接传感器或蓝牙模块)。
  3. 功耗要低:剃须刀是便携设备,待机电流最好在微安级。有些芯片的休眠模式做得很好,比如STM32的Stop模式。
  4. 成本要控制:BOM成本直接决定产品利润。一颗芯片差几毛钱,量产十万台就是几万块。
  5. 供货要稳定:这个我深有体会。2021年芯片荒的时候,STM32F103从十几块涨到一百多,还买不到。所以现在我会考虑多源方案。

个人经验:选型时一定要留20%的性能余量。为什么?因为产品迭代时总会加新功能。我有个项目就是选型时卡得太紧,后来加了个OTA升级功能,Flash直接爆了...那叫一个尴尬。

1.3 MCU选型与对比:STM32 / GD32 / ESP32

好,咱们来硬碰硬地对比一下这三款主流芯片。这三款我都用过,各有各的脾气。

对比项 STM32F103 GD32F103 ESP32
内核 Cortex-M3 Cortex-M3(兼容) Xtensa LX6双核
主频 72MHz 108MHz 240MHz
Flash 64KB-512KB 64KB-512KB 4MB(外置)
SRAM 20KB-64KB 8KB-96KB 520KB
价格(批量) ¥8-15 ¥3-8 ¥10-20
功耗 低(Stop模式~10μA) 中等(Stop模式~50μA) 较高(Deep-sleep~10μA)
蓝牙 无(需外挂) 无(需外挂) 内置BLE+WiFi
生态 极好(HAL/LL库) 较好(兼容STM32) 好(ESP-IDF/Arduino)
RTOS支持 FreeRTOS/RT-Thread FreeRTOS/RT-Thread FreeRTOS(官方)

STM32F103:经典中的经典。我入行时第一个项目就是用它。生态太完善了,遇到问题网上随便一搜就有答案。但缺点也明显——贵,而且供货不稳定。如果你做的是高端剃须刀,不差钱,选它最稳。

GD32F103:国产替代的明星。说白了就是STM32的平替,引脚兼容,可以直接替换。我有个量产项目就用的它,成本直接砍了一半。但要注意——它的ADC精度不如STM32,而且有些外设寄存器地址有细微差异。我踩过这个坑,当时调试I2C死活不通,最后发现是GD32的I2C时序要求更严格。

ESP32:这个家伙有点特殊。它自带蓝牙和WiFi,如果你需要App连接,选它最省事。但功耗偏高,而且双核架构对RTOS移植有一定要求。我个人觉得,如果剃须刀需要频繁通信(比如实时上传剃须数据),ESP32是首选。但如果只是偶尔同步一下,还是STM32+外挂蓝牙模块更省电。

避坑指南:我曾经在一个项目中用GD32替换STM32,结果发现GD32的Flash擦写次数只有1万次,而STM32是10万次。如果你的产品需要频繁OTA升级,这点一定要注意。不然用着用着Flash就坏了,那可就麻烦了。

总结一下我的建议:

  • 做低端走量产品,选GD32,成本优先。
  • 做中高端产品,选STM32,稳定可靠。
  • 需要蓝牙功能,选ESP32,省掉一个外挂模块。

嗯,第一章就聊这么多。下一章咱们开始动手,讲讲怎么搭建开发环境。到时候我会把常用的工具链和调试方法都过一遍,保证你少走弯路。