第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,真香。
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,一定要确认参考电压的稳定性。
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的问题。
1.4 总结一下
MCU选型这事儿,没有标准答案。但有几个原则:
- 别贪便宜: 医疗设备,稳定第一。省那几块钱,后面出问题赔不起。
- 留足余量: Flash和RAM至少预留30%,功能迭代时你就知道多重要了。
- 外设分配要合理: 别把所有高速外设挤在同一个总线上,容易出问题。
- 参考电压要稳: ADC的精度,一半靠芯片,一半靠参考电压。
好了,这一章就聊到这儿。下一章咱们讲讲血糖仪的系统架构设计,到时候我会拿一个实际项目的架构图来拆解。有什么问题,欢迎交流。