第二章 硬件选型:STM32系列选型指南、常用加密芯片介绍与外围电路设计要点
好,咱们进入正题。做加密狗,第一步就是选硬件。这步要是走偏了,后面全白搭。我见过不少朋友,芯片选得太强,成本压不住;选得太弱,加密算法跑不动。说白了,就是个平衡的艺术。
2.1 STM32系列选型指南
STM32家族太大了,从F0到H7,几十个系列。做加密狗,我一般只看三个系列:STM32F4、STM32L4 和 STM32G4。为什么?往下看。
2.1.1 核心选型指标
我个人习惯,先看三个硬指标:
- 主频与算力:加密运算需要CPU算力。AES-256加解密,一次操作大概要几百个时钟周期。如果你还要跑USB协议栈,主频最好不低于48MHz。我建议选72MHz以上的型号。
- Flash与RAM:加密固件本身不大,但你要存密钥、证书、日志。我建议Flash至少64KB,RAM至少20KB。别抠这点空间,后面加功能时你会感谢我的。
- 硬件加密外设:这是关键!STM32的某些型号内置了硬件AES加速器和TRNG(真随机数发生器)。有硬件加速,加解密速度能快10倍以上。我在项目中吃过亏,一开始用软件AES,结果USB枚举时卡顿,后来换了带硬件AES的型号,问题秒解。
2.1.2 我推荐的型号
| 型号 | 主频 | Flash/RAM | 硬件加密 | 适合场景 |
|---|---|---|---|---|
| STM32F411CEU6 | 100MHz | 512KB / 128KB | 无(需软件实现) | 入门级加密狗,成本敏感 |
| STM32L4R5ZIT6 | 120MHz | 2MB / 640KB | AES-256硬件加速、TRNG | 中高端加密狗,需要低功耗 |
| STM32G474RET6 | 170MHz | 512KB / 128KB | AES-256硬件加速、TRNG、CRC | 高性能加密狗,需要高速运算 |
2.2 常用加密芯片介绍
光靠MCU本身做加密,够不够?说实话,不够安全。为什么呢?因为密钥存在MCU的Flash里,只要有人用JTAG/SWD读出来,就全完了。所以,我们需要一颗专门的加密芯片来保管密钥。
2.2.1 ATECC608A —— 加密狗的灵魂
这颗芯片,我愿称之为「加密狗的灵魂」。它是Microchip(原Atmel)的产品,专门做密钥存储和加密运算。它的核心优势:
- 硬件安全存储:密钥一旦写入,永远无法从外部读出。物理上防破解。
- 内置加密算法:支持AES-128/256、ECDSA、SHA-256。你只需要发指令给它,它算好把结果返回给你。
- 真随机数发生器:每次生成的签名都不一样,防重放攻击。
- I2C接口:与STM32通信只需要两根线,电路设计极简。
我记得第一次用ATECC608A时,被它的「锁定」机制坑了一把。芯片出厂时是开放状态,你可以写入密钥。但一旦你执行了锁定命令,密钥就永远不能改了。嗯,我当时测试时不小心锁了个测试密钥,结果量产时发现密钥不对……从那以后,我每次锁定前都会再三确认。
2.2.2 其他可选加密芯片
| 芯片型号 | 接口 | 特点 | 适用场景 |
|---|---|---|---|
| SE050 | I2C | NXP出品,支持ECC/RSA,通过CC EAL6+认证 | 高安全等级需求 |
| MAXQ1061 | SPI | Maxim出品,内置TCP/IP协议栈 | 需要网络通信的加密狗 |
| OPTIGA Trust M | I2C | 英飞凌出品,支持PSA Certified Level 1 | 物联网加密狗 |
2.3 外围电路设计要点
电路设计这块,我踩过的坑最多。你想想看,加密狗是插在电脑上的,静电、浪涌、热插拔,哪个都能要了它的命。下面我总结几个关键点。
2.3.1 电源与去耦
加密狗通常从USB取电,电压5V。STM32和加密芯片都是3.3V供电,所以需要一颗LDO。我推荐AMS1117-3.3,便宜又好用。
去耦电容不能省。每个芯片的VCC引脚旁边,放一个0.1μF的陶瓷电容,再在总电源入口放一个10μF的电解电容。我曾经因为省了0.1μF电容,导致加密芯片在高温下频繁复位,查了两天才找到原因。
2.3.2 I2C上拉电阻
ATECC608A和STM32通过I2C通信。I2C总线需要上拉电阻,阻值一般选4.7kΩ。但要注意:如果总线长度超过10cm,或者有多个从设备,阻值要适当减小到2.2kΩ。我习惯在PCB布局时,把上拉电阻放在靠近主控的位置。
// I2C初始化代码示例(HAL库)
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x00707CBB; // 100kHz标准模式
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
}
2.3.3 USB接口保护
USB接口是加密狗最脆弱的地方。我建议加以下保护:
- ESD保护二极管:在D+和D-线上各加一颗,型号如USBLC6-2SC6。
- 自恢复保险丝:在VBUS线上串一个500mA的PTC,防止短路烧坏电脑USB口。
- TVS管:在VBUS和GND之间加一个5V的TVS管,吸收浪涌。
2.3.4 调试接口保留
很多工程师做产品时,会把SWD调试接口去掉,觉得占地方。我强烈建议保留。哪怕只留4个测试点(SWDIO、SWCLK、VCC、GND),关键时刻能救命。你想想看,如果产品量产了才发现固件有bug,没有调试接口,你就只能拆芯片了。
2.4 总结与选型建议
好了,硬件选型这块就聊这么多。我最后给你一个「懒人包」:
- MCU:选STM32L4系列,带硬件AES和TRNG。
- 加密芯片:选ATECC608A,性价比之王。
- 电源:AMS1117-3.3 + 去耦电容。
- 接口保护:ESD二极管 + PTC保险丝 + TVS管。
- 调试:保留SWD接口,哪怕只留测试点。
下一章,我们会开始讲具体的电路原理图设计。到时候我会把每个元件的选型理由和布局技巧都掰开揉碎了讲。咱们下章见。