1. 项目全景与开发环境搭建:电动牙刷的硬件架构与软件分层
各位同学,欢迎来到《从零搭建电动牙刷嵌入式软件工程》的第一课。
说实话,做嵌入式开发这么多年,我见过太多人一上来就撸代码,结果硬件不匹配、外设驱动写死、后期维护想哭。电动牙刷这个项目,麻雀虽小五脏俱全。咱们先别急着敲键盘,把全景图看清楚,后面才能走得顺。
1.1 电动牙刷的硬件架构
先聊聊硬件。电动牙刷的核心部件,我总结为四大块:大脑、心脏、能量源、通讯口。
- MCU(大脑):负责控制逻辑、PWM 生成、蓝牙协议栈、ADC 采样。我个人习惯用 STM32G0 系列,性价比高,适合消费电子。
- 电机(心脏):通常是空心杯电机或声波电机。需要 MCU 输出高频 PWM 驱动 MOS 管,再驱动电机。注意,电机启动瞬间电流很大,我遇到过几次因为电容选小了导致 MCU 复位的情况。
- 电池(能量源):锂电池,3.7V 标称,需要充电管理芯片(比如 TP4056)和电量检测电路。ADC 采样分压电阻要选 1% 精度的,不然电量显示不准。
- 蓝牙(通讯口):低功耗蓝牙 BLE,常用芯片有 nRF52832 或 STM32WB 系列。负责和手机 App 通信,传输刷牙数据、固件升级。
硬件选型避坑指南
我曾经在一个项目中,为了省成本选了某款国产蓝牙芯片,结果射频性能不稳定,连接距离只有 2 米。后来换回 nRF 系列,问题才解决。嗯,这里要注意:蓝牙天线布局和阻抗匹配非常关键,别省这点功夫。
1.2 软件分层逻辑
软件架构怎么搭?我建议分三层,这样代码清晰,后期移植也方便。
| 层级 | 职责 | 举例 |
|---|---|---|
| 应用层 | 业务逻辑、状态机、用户交互 | 刷牙模式切换、电量显示、蓝牙指令解析 |
| 驱动层 | 硬件外设抽象、寄存器操作 | GPIO 控制、PWM 输出、ADC 读取、UART 收发 |
| 硬件层 | MCU 外设初始化、中断向量 | STM32CubeMX 生成的 HAL 库代码 |
说白了,应用层只管“我要做什么”,驱动层管“怎么做”,硬件层管“用什么做”。你想想看,如果哪天要换 MCU,只需要改硬件层和驱动层,应用层几乎不用动。这就是分层的价值。
我的个人习惯:在驱动层里,我会再封装一层“硬件抽象接口”,比如 Motor_Start()、Battery_GetLevel()。这样应用层调用时,根本不知道底层是 STM32 还是 GD32,移植起来特别爽。
1.3 Keil / IAR 环境配置
开发环境怎么选?Keil MDK 和 IAR EWARM 是主流。我个人更偏向 Keil,因为 STM32CubeMX 直接生成 Keil 工程,省事。但 IAR 的编译优化确实更强,适合对代码体积有要求的场景。
配置步骤其实不复杂,但有几个坑要注意:
- 安装芯片包:Keil 里需要安装对应的 STM32G0 系列 Pack,不然找不到芯片。
- 选择调试器:我习惯用 ST-Link,便宜又稳定。记得在 Debug 选项卡里选对型号。
- 优化等级:调试阶段用 -O0,发布阶段用 -Os 或 -O2。我曾经在调试时用了 -O2,结果变量被优化掉了,怎么看都不对,折腾了半天才发现是优化惹的祸。
- Flash 下载算法:如果下载失败,八成是算法没选对。Keil 里要选 STM32G0xx 128KB Flash 那个。
警告:IAR 环境下,如果使用 STM32CubeMX 生成的代码,记得手动把 HAL 库的源文件路径加进去。CubeMX 默认只生成 Keil 工程,IAR 需要自己配置。别问我怎么知道的,都是泪。
1.4 STM32CubeMX 初始化
STM32CubeMX 是个好东西,图形化配置外设,自动生成初始化代码。咱们这个项目,需要配置以下外设:
- RCC:外部晶振 8MHz,PLL 倍频到 64MHz 作为系统时钟。
- GPIO:电机控制引脚(推挽输出)、按键输入(上拉)、LED 指示(推挽输出)。
- TIM1:用于生成电机 PWM,频率 20kHz,占空比可调。
- ADC1:采集电池电压,使用内部参考电压 VREFINT 做校准。
- USART1:调试串口,波特率 115200,用于打印日志。
- RTC:记录刷牙时长和日期,使用 LSE 外部 32.768kHz 晶振。
配置完成后,点击生成代码。CubeMX 会生成一个 Keil 工程,里面包含 HAL 库和初始化函数。你只需要在 main.c 里添加自己的业务逻辑就行。
一个小技巧:生成代码后,别急着改 main.c。先在 User Code Begin 和 User Code End 之间写代码,这样下次重新生成时,你的代码不会被覆盖。我刚开始用 CubeMX 时不知道这个,每次重新生成都要重写一遍,烦死了。
好了,第一课就到这里。硬件架构清楚了,软件分层明白了,环境也搭好了。下一课咱们开始写驱动,让电机转起来。
记住,嵌入式开发,硬件是骨架,软件是血肉,分层是灵魂。别急着写代码,先把骨架搭稳。