第二章 嵌入式系统选型:MCU选型策略与RTOS抉择
好,咱们进入第二章。这一章我打算聊聊选型这件事。
很多人觉得选型嘛,无非就是看看主频、Flash、RAM,哪个便宜用哪个。但说实话,在医疗设备这个行当里,选型要是这么简单,就不会有那么多项目翻车了。我见过太多因为选型失误导致产品重做、认证重跑的案例,那叫一个痛。
2.1 MCU选型:STM32、GD32还是国产化方案?
先说说MCU。目前市面上主流的方案,无非就是ST的STM32、国产的GD32,以及一些其他国产替代。我个人的习惯是,先看项目阶段,再看成本压力。
2.1.1 STM32:老牌劲旅,生态成熟
STM32的优势不用我多说。CubeMX、HAL库、LL库,再加上海量的社区资源,开发效率确实高。我在做上一款理疗仪原型机时,用的就是STM32F407。为什么选它?因为当时时间紧,我需要快速验证算法和通信协议。STM32的生态能让我把精力放在业务逻辑上,而不是跟底层寄存器较劲。
但STM32也有短板。这两年缺货涨价,大家心里都有数。而且,如果你做的是二类、三类医疗设备,供应链风险是必须要考虑的。我曾经有个项目,就因为ST芯片交期拉长,硬生生拖了三个月。
我的建议:如果项目处于原型验证阶段,或者对上市时间要求极高,STM32依然是首选。但量产阶段,尤其是年产量超过10K的,一定要考虑备选方案。
2.1.2 GD32:国产替代的扛把子
GD32这几年势头很猛。说白了,它就是STM32的“平替”。内核一样是Cortex-M系列,外设寄存器也高度兼容。我测试过GD32F103和STM32F103的对比,在相同主频下,性能差距在5%以内,完全够用。
但要注意,GD32不是100%兼容。比如ADC的采样率、DMA的触发源,有些细节不一样。我曾经在移植代码时,发现GD32的SPI时钟极性跟ST是反的,查了两天才找到原因。嗯,这里要提醒大家:不要直接拿STM32的二进制文件烧到GD32上跑,一定要重新编译,并且仔细核对外设驱动。
避坑指南:我建议在项目初期就引入GD32的样片,跟STM32并行开发。这样一旦ST断供,你可以快速切换。别等到量产了才想起来验证,那时候就晚了。
2.1.3 其他国产方案:兆易创新、华大、国民技术
除了GD32,还有兆易创新的GD32系列(其实是一家的)、华大半导体的HC32、国民技术的N32。这些芯片各有特色。比如华大的HC32,低功耗做得不错,适合电池供电的便携式理疗仪。国民技术的N32,内置了硬件加密引擎,对数据安全有要求的设备可以考虑。
我个人觉得,国产MCU的生态正在快速追赶。虽然文档和工具链还有差距,但性价比确实高。如果你做的是成本敏感型产品,比如家用理疗仪,国产方案值得一试。
2.2 RTOS选型:FreeRTOS还是RT-Thread?
说完MCU,咱们聊聊RTOS。理疗仪这种设备,通常需要同时处理UI显示、按键扫描、治疗波形生成、安全监控等多个任务。裸机跑?不是不行,但代码会变得非常复杂,而且难以维护。所以,上RTOS是明智的选择。
2.2.1 FreeRTOS:轻量、稳定、全球通用
FreeRTOS是我用得最多的RTOS。它轻量、稳定,而且有Amazon背书。我在多个医疗项目中都用过FreeRTOS,包括那个理疗仪原型机。为什么选它?因为它的内核非常精简,任务切换开销极小,而且对Cortex-M的MPU支持很好。
FreeRTOS的缺点呢?说白了,它就是一个内核。任务管理、队列、信号量、互斥量,这些基础功能都有。但如果你想用文件系统、TCP/IP协议栈、USB协议栈,就得自己移植或者找第三方库。这其实增加了开发工作量。
我的经验:如果你的项目功能相对单一,比如就是一个简单的理疗波形发生器,FreeRTOS足够了。但如果你需要复杂的文件管理、网络通信,那就要考虑RT-Thread了。
2.2.2 RT-Thread:国产之光,组件丰富
RT-Thread这几年在国内很火。它不仅仅是一个RTOS,更像是一个物联网操作系统。它内置了文件系统、网络协议栈、USB协议栈、图形界面等组件。你想想看,如果你用FreeRTOS,这些组件都得自己搞。但用RT-Thread,直接开箱即用。
我在一个需要记录治疗日志的项目中用过RT-Thread。它自带的FATFS文件系统,让我可以直接把数据写到SD卡里,省了不少事。而且它的设备驱动框架很规范,写驱动的时候思路很清晰。
但RT-Thread也有代价。它的内核比FreeRTOS大,ROM和RAM占用也更多。如果你的MCU只有64KB Flash、16KB RAM,跑RT-Thread会比较吃力。另外,RT-Thread的社区虽然活跃,但遇到深层次的问题,可能还是得自己啃源码。
选型建议:我个人习惯这样选——如果MCU资源充裕(比如256KB Flash以上),且需要文件系统、网络等组件,优先考虑RT-Thread。如果MCU资源紧张,或者项目对实时性要求极高,FreeRTOS更稳妥。
2.3 外设资源规划:别等画板了才发现不够用
选完MCU和RTOS,接下来就是外设资源规划。这一步很多人容易忽略,觉得“反正MCU引脚多,不够用可以复用”。但实际项目中,外设冲突是导致改板的主要原因之一。
2.3.1 理疗仪的核心外设需求
以我做的理疗仪为例,核心外设包括:
- PWM输出:用于生成治疗波形。至少需要2路,频率范围1Hz-1MHz。
- ADC采样:用于检测输出电流、电压,确保安全。至少需要3路,采样率不低于100Ksps。
- DAC输出:用于生成参考电压或模拟信号。至少1路。
- UART:用于与蓝牙模块或Wi-Fi模块通信。至少1路。
- I2C/SPI:用于连接传感器(如温度、压力)或显示屏。至少各1路。
- GPIO:用于按键、LED指示、继电器控制等。至少8个。
这些只是基本需求。如果你还要加触摸屏、音频播放、USB通信,那外设需求会更多。
2.3.2 外设冲突的典型案例
我遇到过最坑的一次,是选了一款STM32F103,它的ADC1和TIM1的PWM输出共用了一些引脚。当时没注意,画完板子才发现,ADC采样和PWM输出不能同时使用。最后只能改板,多花了两周时间。
所以,我建议你在选型阶段,就画一张外设资源分配表。把每个外设需要的引脚、定时器、DMA通道都列出来,然后对照MCU的数据手册,确认没有冲突。
重要提醒:不要只看引脚功能表,还要看复用功能冲突。比如,有些MCU的USART1_TX和SPI1_SCK是同一个引脚,但你不能同时用USART和SPI。这种坑,数据手册里不会直接告诉你,得自己仔细看。
2.3.3 预留余量:给未来留条后路
最后,我想说一个原则:外设资源要预留20%的余量。为什么?因为产品迭代过程中,很可能会增加新功能。比如,客户突然说要加一个心率监测模块,需要额外的I2C和GPIO。如果你当初把外设用满了,那就只能换MCU或者改板。
我现在的习惯是,选型时选比需求多一个档位的MCU。比如,需求是64引脚,我就选100引脚的。多出来的引脚,可以作为备用GPIO,或者用于调试。虽然成本会高一点,但比起改板的代价,这点成本完全可以接受。
一个小技巧:在原理图设计时,把备用引脚都引到测试点上。这样即使后期需要飞线,也有地方焊。我曾经靠这个技巧,救回了一个差点报废的样板。
好了,这一章就聊到这里。选型这件事,说白了就是平衡性能、成本、风险和开发效率。没有完美的方案,只有最适合你项目的方案。下一章,咱们聊聊系统架构设计,看看怎么把这些选好的零件搭起来。