第1章:硬件架构设计——主控芯片选型与存储分区规划
大家好,我是你们的讲师。今天咱们聊聊血糖仪固件升级里最基础、也最要命的一环——硬件架构设计。
你想想看,固件升级说白了就是往芯片里写新程序。但芯片里原来就有程序在跑,怎么做到一边跑一边写?写坏了怎么办?断电了怎么办?这些问题,都得靠硬件架构来兜底。
我个人习惯,做任何嵌入式项目,第一步不是写代码,而是先把芯片选型和存储分区定死。这一步错了,后面全白干。好,咱们直接进入正题。
1.1 主控芯片选型——别光看主频
选主控芯片,很多人第一反应是看主频、看RAM大小。嗯,这些当然重要,但做血糖仪这种医疗设备,有几个坑你得先避开。
核心选型三要素:
- Flash容量:至少预留2倍于App大小的空间给Bootloader和参数区
- 低功耗性能:血糖仪是电池供电设备,待机电流要控制在μA级
- 安全特性:支持读保护、写保护,防止固件被恶意篡改
我在项目中遇到过一件事。有次选了一款性价比很高的国产芯片,主频80MHz,Flash 256KB,看着挺美。结果一做双区升级,Bootloader占32KB,App占120KB,参数区占16KB,剩下那88KB根本不够做备份区。最后只能砍功能,搞得狼狈不堪。
所以我建议你,选型时按这个公式算:
所需Flash = Bootloader区(32KB) + App区(实际大小×1.5) + 参数区(16KB) + 备份区(App实际大小)
举个例子,如果你的App编译出来是100KB,那至少需要:32 + 150 + 16 + 100 = 298KB。选个512KB的芯片比较稳妥。
小提示:别卡着极限选。Flash用太满,后期加功能、修bug都没空间。留30%余量是明智的。
1.2 存储分区规划——三个区,各司其职
存储分区,说白了就是把Flash切成几块,每块干不同的事。血糖仪固件升级,我一般分三个区:Bootloader区、App区、参数区。
为什么会这样分?
你想想看,升级过程中如果突然断电,App区写到一半坏了。下次开机,Bootloader还在,它一检查发现App校验不过,就会进入等待升级模式。用户重新连上手机,再刷一次就好了。这就是分区设计的精髓——容错。
1.2.1 Bootloader区
Bootloader区,我习惯叫它「看门大爷」。它不干别的,就管两件事:
- 上电检查App是否完整
- 如果App坏了,进入升级模式等待新固件
这个区的大小,我一般给32KB。为什么是32KB?因为Bootloader代码量不大,但需要包含Flash擦写驱动、通信协议栈(比如I2C或UART)、以及校验算法。32KB绰绰有余。
注意:Bootloader区一定要做写保护。我曾经见过一个产品,Bootloader区没锁,结果升级时误操作把Bootloader给擦了,直接变砖。那叫一个惨。
1.2.2 App区
App区就是放主程序的地方。这里有个关键设计——双区备份。
我建议把App区再分成两个子区:
| 分区 | 大小 | 作用 |
|---|---|---|
| App-A区 | 实际App大小 | 当前运行的程序 |
| App-B区 | 实际App大小 | 升级时写入的新程序 |
升级流程是这样的:
- 新固件下载到App-B区
- 校验App-B区的完整性(CRC或MD5)
- 校验通过后,把App-B区的内容复制到App-A区
- 重启,从App-A区启动
如果第2步校验失败,App-A区纹丝不动,设备照常运行。用户甚至不知道升级失败了,只会收到一个「升级失败,请重试」的提示。
嗯,这里要注意:双区方案会吃掉双倍Flash空间。如果你的芯片Flash实在紧张,也可以做单区升级,但风险高很多。我个人强烈建议用双区。
1.2.3 参数区
参数区,存的是用户数据。比如:
- 血糖历史记录
- 校准参数
- 设备序列号
- 蓝牙配对信息
这个区有个特点——升级时不能动。你想想,用户测了三个月的血糖数据,一升级全没了,那不得骂娘?
我一般给参数区16KB,用EEPROM模拟的方式管理。每次写入前先擦除一个扇区,再写入新数据。如果Flash的擦写寿命是10万次,16KB按512字节一个扇区算,可以擦写3200万次。够用一辈子了。
避坑指南:参数区最好单独放在一个物理扇区里。我曾经把参数区和App区放在同一个扇区,结果升级擦除App时,参数区也被连带擦掉了。后来改设计,把参数区放在Flash的最后几个扇区,App区怎么擦都碰不到它。
1.3 分区地址规划示例
说了这么多,给个实际例子吧。假设你选了一款512KB Flash的芯片,地址从0x08000000开始:
0x08000000 - 0x08007FFF (32KB) Bootloader区
0x08008000 - 0x08027FFF (128KB) App-A区
0x08028000 - 0x08047FFF (128KB) App-B区
0x08048000 - 0x0804BFFF (16KB) 参数区
0x0804C000 - 0x0807FFFF (208KB) 保留区(备用)
这个布局,Bootloader和App之间留了明确的地址边界。App-A和App-B大小一致,方便做镜像升级。参数区放在最后,远离App区,安全。
保留区是干嘛的?说白了就是给未来留余地。万一哪天要加个OTA日志功能,或者存个设备证书,直接往保留区里放就行,不用重新规划分区。
1.4 小结
好,这一章的内容就这些。总结一下:
- 芯片选型,Flash容量宁大勿小,留足余量
- 存储分三个区:Bootloader、App、参数,各司其职
- App区建议做双区备份,升级失败也不影响运行
- 参数区要独立保护,升级时不能动
下一章,咱们聊聊Bootloader的具体实现——怎么跳转到App、怎么校验固件完整性。到时候我会分享一个我踩过的坑,保证让你印象深刻。
今天就到这儿。有问题随时交流。