第1章:MCU选型与资源规划

做血糖仪,第一步就是选MCU。这事儿我干过不少次,每次都得掂量掂量。选对了,后面开发顺风顺水;选错了,那真是给自己挖坑。今天咱们就聊聊主流MCU怎么选,资源怎么规划。

1.1 主流MCU对比:STM32、NXP、TI

市面上MCU多得是,但做医疗设备,我一般只看这三家:ST、NXP、TI。为什么?稳定、供货靠谱、生态成熟。你想想看,血糖仪是要过医疗认证的,芯片说换就换?不现实。

对比项 STM32(ST) NXP(LPC/Kinetis) TI(MSP430/CC系列)
内核 Cortex-M0/M3/M4/M7 Cortex-M0/M4/M7 自有16位/Cortex-M4
主频 48MHz~216MHz 48MHz~150MHz 16MHz~48MHz
功耗 中等 中等 超低(MSP430)
ADC精度 12位(部分16位) 12位/16位 12位/16位
开发工具 STM32CubeMX + HAL MCUXpresso + SDK CCS + DriverLib
成本(批量) 中等 中等偏高 中等
医疗认证支持 非常好

我个人习惯,做血糖仪首选STM32。为什么?生态太成熟了。CubeMX一键生成代码,HAL库文档齐全,遇到问题网上随便一搜就有答案。但如果你做的是超低功耗的连续血糖监测(CGM),那TI的MSP430系列更合适。我记得有一次做一款需要纽扣电池撑半年的设备,最后选了MSP430,休眠电流才0.1μA,真香。

我的建议: 如果团队经验不足,优先选STM32。开发效率比那点芯片差价重要得多。

1.2 Flash/RAM需求估算

资源估算这事儿,很多新手容易拍脑袋。我见过有人直接选了个512KB Flash的芯片,结果代码才用了80KB,白白浪费成本。也见过有人选了64KB Flash,结果功能加不进去,只能换芯片重新画板子。

血糖仪的代码量,我一般这么估算:

  • Bootloader: 8~16KB(含升级协议)
  • RTOS内核: 8~12KB(FreeRTOS或uCOS)
  • 驱动层: 12~20KB(ADC、SPI、I2C、UART、Timer等)
  • 应用层: 20~40KB(测量算法、UI逻辑、数据管理)
  • 协议栈: 8~16KB(BLE或私有协议)
  • 预留空间: 20%~30%

算下来,一个功能完整的血糖仪,Flash至少需要128KB。我建议选256KB,留足余量。RAM的话,8KB起步,16KB比较稳妥。如果你要用图形界面,那RAM至少32KB。

经验公式: Flash = 估算代码量 × 1.3(预留30%),RAM = 最大堆栈深度 + 全局变量 + 缓冲区 × 2

举个例子。我之前做的一款血糖仪,用了STM32F103C8T6,64KB Flash、20KB RAM。刚开始觉得够用,结果加了BLE协议栈和OTA升级后,Flash只剩2KB了。后来换成了STM32F103RCT6,256KB Flash、48KB RAM,才彻底解决问题。嗯,这里要注意,千万别卡着上限选芯片。

1.3 外设资源分配

血糖仪的外设,说白了就这几样:ADC测血糖、SPI/I2C接传感器和存储、UART通信、Timer做定时和PWM。分配起来有讲究。

ADC:血糖测量的核心

血糖仪的核心就是电化学测量,ADC是重中之重。我建议用12位以上的ADC,采样率不用太高,100Hz就够。但精度一定要高,尤其是低血糖范围(2~4mmol/L),误差不能超过±0.3mmol/L。

我遇到过一个问题:ADC参考电压不稳定,导致测量值漂移。后来加了外部基准电压芯片,问题才解决。所以,如果你用MCU内部ADC,一定要确认参考电压的稳定性。

避坑指南: 我曾经因为ADC采样时间设置太短,导致结果波动大。后来把采样周期从1μs调到5μs,数据就稳了。ADC采样,别图快。

SPI:高速通信首选

SPI一般接什么?显示屏、Flash芯片、或者高精度ADC。血糖仪的显示屏如果是TFT彩屏,那SPI时钟至少10MHz。我习惯把SPI1留给显示屏,SPI2留给外部Flash或传感器。

// SPI配置示例(STM32 HAL库)
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;  // 18MHz
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
HAL_SPI_Init(&hspi1);

I2C:省引脚的好选择

I2C适合接那些不需要高速通信的器件,比如温度传感器、EEPROM、RTC。两根线能挂一堆设备,省引脚。但要注意,I2C总线上设备多了,容性负载会变大,通信容易出错。

我记得有一次,I2C总线上挂了4个设备,结果通信时好时坏。查了半天,发现是总线电容太大,上拉电阻没选对。后来把4.7kΩ换成2.2kΩ,问题解决。

UART:调试和通信的命脉

UART至少需要两路:一路给调试串口(打印日志),一路给蓝牙模块或上位机通信。我习惯把UART1设为调试口,波特率115200;UART2给蓝牙,波特率9600或115200。

这里有个坑:蓝牙模块的波特率一定要和MCU匹配。我遇到过蓝牙模块默认9600,但代码里配了115200,结果死活连不上。嗯,这种低级错误,犯一次就记住了。

Timer:时间基准和PWM

Timer的分配,我一般这么来:

  • Timer1: RTOS系统滴答(1ms中断)
  • Timer2: ADC采样定时(10ms触发一次)
  • Timer3: 按键消抖和长按检测
  • Timer4: PWM输出(背光调节或蜂鸣器)

如果你用RTOS,系统滴答必须用一个硬件Timer。别用SysTick,因为SysTick在低功耗模式下会停。我吃过这个亏,设备休眠后醒不过来,查了两天才发现是SysTick的问题。

小技巧: 把不用的Timer关掉,能省不少电。血糖仪是电池供电,每一微安都珍贵。

1.4 总结一下

MCU选型这事儿,没有标准答案。但有几个原则:

  1. 别贪便宜: 医疗设备,稳定第一。省那几块钱,后面出问题赔不起。
  2. 留足余量: Flash和RAM至少预留30%,功能迭代时你就知道多重要了。
  3. 外设分配要合理: 别把所有高速外设挤在同一个总线上,容易出问题。
  4. 参考电压要稳: ADC的精度,一半靠芯片,一半靠参考电压。

好了,这一章就聊到这儿。下一章咱们讲讲血糖仪的系统架构设计,到时候我会拿一个实际项目的架构图来拆解。有什么问题,欢迎交流。