4、主控芯片选型:STM32 vs 国产MCU、GPIO资源评估、定时器资源分配

好,咱们进入第四讲。这一节很关键,说白了就是给美容仪选“大脑”。

你想想看,振动马达要转得稳、模式要切得准、电池要省着用,这些全得靠主控芯片来调度。选错了,后面改板子可是要掉头发的。

4.1 STM32 vs 国产MCU,我该怎么选?

这个问题,几乎每个找我咨询的学员都会问。我的回答通常是:看量、看成本、看供货

STM32的优势:生态太成熟了。库函数、例程、社区资源,你要啥有啥。我早期做项目时,基本无脑选STM32,因为开发快,遇到问题网上搜一圈就能解决。

国产MCU的崛起:这几年国产芯片进步很大。像GD32(兆易创新)、AT32(雅特力)、APM32(极海)这些,性能上已经能对标STM32了。价格嘛,确实便宜不少,而且供货稳定——经历过2021年芯片荒的朋友应该深有体会。

我的个人建议

  • 小批量打样、验证方案:用STM32。省心,少踩坑。
  • 大批量量产、成本敏感:果断切国产MCU。但一定要先做完整的移植测试。

我记得有一次帮客户做一款美容仪,前期用STM32F103开发,一切顺利。到了量产阶段,客户要求降成本,我们换成了GD32F103。本以为引脚兼容直接烧程序就行,结果发现ADC的采样时序有点差异,折腾了两天才调好。嗯,这里要注意:兼容不是100%无缝

4.2 GPIO资源评估——数清楚你的“手脚”

选芯片前,得先算算你需要多少个GPIO口。别等到画PCB时才发现引脚不够,那就尴尬了。

以我们这款美容仪为例,我列个清单:

功能模块 所需GPIO数量 说明
振动马达控制(PWM) 1~2 1路PWM输出,如需独立使能再加1路
模式切换按键 1~2 轻触按键,检测电平变化
LED指示灯 2~3 显示当前模式或电量
电池电量检测(ADC) 1 模拟输入,分压后采样
温度检测(可选) 1 NTC热敏电阻,也是ADC通道
充电管理通信(I2C) 2 SCL、SDA,与充电IC通信
预留/调试口 2~3 SWD调试、串口打印等

算下来,大概需要 10~14个GPIO。这还不算多,市面上主流的MCU基本都能满足。但我建议你留出20%的余量,万一后期要加功能呢?

避坑指南:我曾经在一个项目里,GPIO算得死死的,一个不多一个不少。结果调试时发现某个引脚默认是JTAG功能,不能当普通IO用,硬生生飞了一根线。所以,选型时一定要看引脚复用功能表,别想当然。

4.3 定时器资源分配——PWM的“心脏”

振动马达的核心控制就是PWM。PWM靠什么产生?定时器。

STM32的定时器资源很丰富,但国产MCU的配置可能略有不同。咱们得提前规划好:

  • 高级定时器(TIM1/TIM8):功能最强,支持互补输出、死区插入。但咱们美容仪用不上这么复杂,有点浪费。
  • 通用定时器(TIM2~TIM5):最常用。每个定时器有4个通道,可以输出4路独立的PWM。咱们只需要1~2路,绰绰有余。
  • 基本定时器(TIM6/TIM7):只能做定时,不能输出PWM。别选错了。

我个人习惯用 TIM2TIM3 来做马达PWM。为什么?因为这两个定时器在大多数MCU上都有,而且引脚位置比较友好,不容易跟其他功能冲突。

举个例子,假设我们想让马达以 20kHz 的频率振动(这个频率人耳基本听不到噪音,用户体验好),系统时钟是72MHz:

// 定时器预分频和自动重装值计算
// 目标PWM频率 = 20kHz
// 系统时钟 = 72MHz

// 预分频器 (PSC) = 72 - 1 = 71
// 自动重装值 (ARR) = 50 - 1 = 49
// 实际频率 = 72MHz / (71+1) / (49+1) = 20kHz

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 71;      // 预分频
TIM_TimeBaseStructure.TIM_Period = 49;          // 自动重装值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

注意:不同模式下的PWM占空比是不一样的。比如“轻柔模式”占空比30%,“强力模式”占空比80%。这些值需要在代码里用数组或者结构体管理好,方便后期调整。

4.4 我的最终选型建议

综合以上分析,对于这款美容仪,我推荐以下方案:

  • 入门/学习:STM32F103C8T6(蓝色 pill板),便宜、资料多、好上手。
  • 量产/成本优先:GD32F103C8T6 或 AT32F403,引脚兼容,价格更低。
  • 低功耗需求:STM32L051 或 APM32L051,待机电流能到微安级。

好了,这一章的内容就这些。核心就是:先算GPIO,再分定时器,最后定型号。顺序别搞反了,不然容易翻车。

下一章咱们开始实战——搭建开发环境,点亮第一颗LED。准备好了吗?