
1. 从一块“不合群”的板子说起市面上能跑神经网络的开发板两只手数不过来。树莓派、Jetson Nano、ESP32-S3、STM32H7系列甚至几十块钱的RP2040加个外设都能凑合跑个关键词唤醒。每次我在群里看到有人问“TinyML入门买哪块板子”底下回复清一色是“随便买块ESP32就行资料多还便宜”。这话没错但如果你真的动手做过几个TinyML项目就会发现一个尴尬的现实现成的板子要么太强、要么太弱要么功耗和接口刚好卡在一个让你难受的位置。我最初也是“拿来主义”的坚定拥护者。手头攒了七八种开发板从几十块到上千块的都有按理说做TinyML绰绰有余。但连续三个项目做下来每次都在硬件选型上卡壳——不是麦克风采集的时序对不上模型推理的节奏就是电池供电撑不过一个班次再不就是想加个传感器发现引脚全被占满了。折腾到最后我花了两个月时间自己画了一版板子专门针对TinyML场景做取舍。这篇文章就把整个思考过程、技术选型、踩过的坑和最终方案完整拆开讲一遍。如果你也在纠结“到底要不要自己画板子”或者“现成板子为什么总差一口气”这篇内容应该能帮你省下不少试错成本。先说清楚我不是劝所有人都去画板子。自己打板有门槛从原理图到PCB到焊接调试每一步都可能翻车。但如果你做的TinyML项目对功耗、尺寸、传感器时序有明确要求而现成方案总是让你妥协那自己定制一块确实是值得考虑的路。下面我从“为什么现成板子不够用”开始把整个决策链路和技术细节讲透。2. 现成开发板在TinyML场景下的三个硬伤2.1 功耗账算不过来待机电流和峰值电流的矛盾TinyML最典型的应用场景是“始终在线、偶尔推理”。比如关键词唤醒、异常振动检测、人员存在感知设备大部分时间在睡觉只有传感器触发或者定时唤醒时才跑一次模型。这种场景下平均功耗才是决定电池寿命的关键而不是峰值功耗。但现成开发板的设计逻辑往往不是这样。以常见的ESP32-S3开发板为例官方数据手册标称深度睡眠电流可以低到10微安左右听起来很美。但实际板子上还挂着USB转串口芯片、LDO稳压器、电源指示灯、Flash芯片这些外围器件的静态功耗加起来实测待机电流经常在几百微安到几毫安之间。我实测过一块市面上很流行的ESP32-S3开发板烧录一个只做深度睡眠的固件用高精度电流表测下来待机电流是1.8毫安。什么概念一块2000毫安时的锂电池理论上只能撑46天。如果再加上每天几十次模型推理的功耗实际续航可能连两周都不到。问题出在哪开发板为了通用性和易用性必须保留USB调试接口、必须留电源指示灯、必须用通用LDO而不是低静态电流的DC-DC。这些“便利性”在TinyML场景下全是负担。你自己画板子的话可以把USB转串口芯片换成只在调试时焊接的排针把LDO换成静态电流几百纳安的型号去掉电源指示灯Flash选低功耗版本。这一套组合拳下来待机电流做到50微安以内是完全可行的续航直接翻几十倍。2.2 传感器接口的时序陷阱I2S麦克风和模型推理抢总线做语音唤醒或者声音事件检测I2S数字麦克风几乎是标配。现成开发板通常会把I2S引脚引出来看起来很方便。但实际用起来你会发现一个很隐蔽的问题I2S麦克风在采集数据时DMA会持续占用总线带宽和内存而模型推理也需要访问内存和CPU。如果麦克风的采样率是16kHz、位深16位、单声道数据率是256kbps看起来不高但DMA的突发传输会打断CPU的缓存访问导致推理时间抖动。我在一块STM32H7开发板上做过测试单独跑模型推理一次前向传播耗时12毫秒同时开I2S采集推理时间变成18到25毫秒不等抖动超过100%。对于实时性要求高的场景这种抖动是不可接受的。更麻烦的是有些开发板的I2S引脚和SD卡、以太网引脚复用你用了麦克风就用不了存储想边采集边存数据都做不到。自己画板子的话可以把I2S麦克风直接连到支持PDM或I2S外设的专用引脚上避免和高速外设复用。更关键的是可以在硬件层面给麦克风单独供电用LDO隔离数字噪声减少音频底噪。这些细节在通用开发板上很难兼顾因为要照顾太多使用场景。2.3 物理尺寸和供电的尴尬要么太大塞不进去要么太小没法扩展TinyML的很多应用场景对尺寸极其敏感。比如可穿戴设备、植入式监测、微型机器人留给电路板的空间可能只有指甲盖大小。现成开发板最小的也有拇指大小而且形状固定很难塞进异形外壳。我做过一个鸟类鸣叫监测的项目需要把设备绑在树枝上要求防水、轻便、续航一个月。买了一圈开发板要么太大要么电池接口不匹配最后只能用洞洞板焊了一个最小系统丑不说可靠性还差。另一个极端是扩展性。有些超小型的开发板确实尺寸合适但引脚全做成半孔或者排针想接个传感器就得飞线稍微复杂一点的项目就变成蜘蛛网。自己画板子可以在设计阶段就把传感器直接布局在板上用FPC连接器或者弹簧针做外部接口既紧凑又可靠。这三个问题归结起来就是一句话通用开发板是为“学习和验证”设计的而TinyML产品化需要的是“场景定制”。当你从“跑通Demo”进入“做成产品”的阶段现成板子的妥协就会变成你的瓶颈。3. 自己画板子之前先想清楚这三件事3.1 你的项目真的需要定制硬件吗不是所有TinyML项目都需要自己画板子。如果你只是学习模型部署、验证算法效果或者项目对功耗、尺寸没有硬性要求那买现成开发板绝对是更明智的选择。时间成本、试错成本、工具成本加起来自己画板子的投入远高于买板子。我给自己定了一个简单的判断标准如果现成方案能满足以下所有条件就不自己画——待机电流低于100微安、尺寸小于3厘米见方、传感器接口不冲突、电池续航满足需求、成本低于自己打板的小批量单价。只要有一条不满足而且这一条对你的项目是刚需那就可以考虑定制。举个例子我做的一个“办公室工位占用检测”项目用ESP32-C3开发板加毫米波雷达模块插USB供电完全不需要考虑功耗和尺寸现成方案完美胜任。但另一个“牲畜活动监测”项目需要戴在牛脖子上太阳能充电续航要求三个月以上还要防尘防水现成板子根本没法用只能自己画。3.2 最小系统需要哪些核心器件一旦决定自己画第一件事是确定最小系统。TinyML板子的最小系统包括主控芯片、电源管理、时钟源、调试接口、启动配置、去耦电容网络。听起来简单但每个部分都有坑。主控芯片选型是第一步。TinyML常用的芯片有几类ARM Cortex-M系列STM32L4、STM32U5、nRF52系列、RISC-V内核ESP32-C3、CH32V系列、以及带NPU的专用芯片比如某些带Ethos-U55的MCU。选型时不能只看算力要看三个指标一是Flash和RAM够不够放模型二是外设接口能不能满足传感器需求三是低功耗模式下的唤醒时间和电流。我最终选了一款Cortex-M33内核带FPU和DSP指令的芯片Flash 1MB、RAM 256KB支持多种低功耗模式深度睡眠电流标称1.5微安。这个配置跑关键词唤醒模型大约50KB参数绰绰有余而且DSP指令能加速卷积运算。电源管理部分我用了一颗静态电流300纳安的DC-DC降压芯片加一颗低噪声LDO。DC-DC负责把锂电池电压降到3.3VLDO给模拟传感器和麦克风供电隔离数字噪声。这里有个细节DC-DC的开关频率要选高一点比如2MHz以上这样电感可以选小封装而且开关噪声落在音频频段之外不会干扰麦克风。时钟源方面如果芯片内部RC振荡器精度够用比如做关键词唤醒对时钟精度要求不高可以省掉外部晶振进一步降低成本和功耗。但如果要做精确的时间同步或者音频采样还是得加一颗32.768kHz的RTC晶振和一颗高频晶振。3.3 打样和焊接的现实成本自己画板子绕不开打样和焊接。现在打样很便宜5片10cm×10cm以内的双层板几十块钱就能搞定一周左右到手。但焊接是个门槛。QFN封装的芯片、0402的阻容、细间距的连接器手工焊接难度不小。如果没有热风枪和显微镜建议把阻容和芯片的焊接交给贴片厂自己只焊连接器和通孔器件。我第一版板子就是全部自己焊的结果有一颗QFN芯片的接地焊盘没焊好调试了两天才发现是虚焊。后来学乖了阻容和主控让贴片厂焊自己只焊排针和电池座良率一下子从50%提到95%以上。成本方面小批量10片的话均摊下来每片大概80到120元比买高端开发板贵但比买多块开发板拼凑方案便宜而且尺寸和功耗是量身定制的。4. 从原理图到能跑模型的完整实操链路4.1 原理图设计把“低功耗”落实到每个网络画原理图的时候低功耗不是一句口号要落实到每个器件的选型和每个引脚的处理。我总结了几条硬规则第一所有未使用的引脚配置为模拟输入或者输出低电平不要悬空。悬空的CMOS输入引脚会因为电平不确定导致输入级振荡增加功耗。我在第一版板子上忘了处理几个未使用的GPIO实测待机电流比预期高了200微安后来在固件里把这些引脚配置为模拟输入才降下来。第二上拉和下拉电阻只在必要的地方加。I2C总线的上拉电阻是必须的但阻值要选大一点比如10kΩ而不是4.7kΩ减少静态电流。按键输入的上拉电阻同理能用100kΩ就不用10kΩ。第三电源指示LED坚决不加。一个0603的LED就算用1kΩ限流电阻3.3V供电下电流也有1到2毫安比主控深度睡眠电流还大。调试阶段可以用万用表看电压量产阶段完全不需要指示灯。第四调试接口用排针而不是USB转串口芯片。USB转串口芯片的静态电流通常在几百微安到几毫安而且增加成本。调试时外接一个USB转TTL模块就行量产时排针不焊零功耗。4.2 PCB布局模拟和数字的隔离比想象中重要PCB布局对TinyML板子的性能影响很大尤其是涉及模拟传感器和麦克风的时候。我的经验是数字部分和模拟部分严格分区地平面分割后单点连接。麦克风的模拟输出或者PDM时钟线要远离DC-DC电感和高速数字信号线最好包地处理。去耦电容的布局也很关键。每个电源引脚旁边都要放一个100nF的陶瓷电容尽量靠近引脚。主电源入口放一个10uF的钽电容或者MLCC。DC-DC的输入输出电容要按照芯片手册推荐值选不要随意改。我试过为了省空间把输出电容从22uF改成10uF结果纹波变大麦克风底噪明显上升。天线部分如果用到无线通信比如BLE要严格按照芯片手册的参考设计做阻抗匹配网络不能省。我见过有人为了省两个电容把匹配网络简化了结果通信距离从30米降到3米。4.3 固件层面的低功耗调优从启动到推理的每个环节硬件设计再好固件写不好也白搭。TinyML固件的低功耗调优有几个关键点启动阶段尽量缩短初始化时间。外设能不开就不开时钟能降就降。我习惯在启动后先把所有GPIO配置为模拟输入然后再按需初始化。传感器采集阶段能用DMA就不用中断能用硬件触发就不用软件轮询。比如麦克风采集配置I2S的DMA循环缓冲CPU只在缓冲半满或全满时被唤醒其他时间睡觉。模型推理阶段如果芯片支持尽量用硬件加速器比如CMSIS-NN的DSP指令或者NPU。推理完成后立即进入低功耗模式不要轮询等待。我实测过一个关键词唤醒的固件优化前平均电流8毫安优化后降到1.2毫安。优化手段包括把系统时钟从80MHz降到24MHz推理时间从15毫秒增加到40毫秒但平均功耗大幅下降、关闭未使用的外设时钟、用RTC定时唤醒代替看门狗轮询、把模型推理放在RAM中执行避免Flash访问功耗。4.4 模型部署的隐藏坑算子支持和内存对齐自己画板子意味着你可以选择最适合的芯片但也意味着你要自己处理模型部署的所有细节。TensorFlow Lite Micro是常用的推理框架但不同芯片对算子的支持程度不一样。有些芯片的DSP指令只支持特定的卷积核大小有些芯片的NPU只支持量化模型。我在选型时犯过一个错误选了一款带NPU的芯片结果发现它的NPU只支持8位量化而我的模型是16位量化的用不了NPU只能回退到CPU推理算力优势完全没发挥出来。后来重新训练模型做了8位量化才用上NPU。内存对齐是另一个坑。TFLite Micro的Tensor Arena需要按16字节或32字节对齐不同芯片要求不一样。如果不对齐推理结果可能完全错误而且不会报错。我调试了两天才发现是内存对齐问题加了一个alignas(16)就解决了。5. 实测数据定制板和现成开发板的硬碰硬5.1 待机电流和推理功耗对比我拿自己画的板子和手头三块现成开发板做了对比测试场景是关键词唤醒设备大部分时间在深度睡眠每100毫秒唤醒一次采集20毫秒音频跑一次模型推理如果检测到关键词就通过BLE发送通知。板子类型待机电流推理时平均电流单次推理耗时2000mAh电池预估续航定制板45微安3.2毫安18毫秒约28天开发板A1.8毫安12毫安15毫秒约3天开发板B850微安8毫安22毫秒约7天开发板C320微安6.5毫安25毫秒约14天定制板的待机电流比最好的开发板还低7倍续航从14天拉到28天。推理功耗的优势主要来自更低的系统时钟和更精简的外设。开发板A的待机电流高得离谱后来查出来是USB转串口芯片和电源指示灯吃掉了大部分电流。5.2 音频采集的信噪比和推理准确率音频质量直接影响关键词唤醒的准确率。我用同一段测试音频包含50个正样本和50个负样本在三块板子上跑同一个模型结果如下板子类型麦克风信噪比唤醒准确率误唤醒率定制板62dB96%2%开发板A55dB91%5%开发板B58dB93%4%开发板C52dB88%7%定制板的信噪比优势来自独立的模拟电源和更好的PCB布局。开发板C的信噪比最低因为它的麦克风和DC-DC电感离得太近开关噪声耦合进了音频通道。这个差距在安静环境下不明显但在嘈杂环境中3到5个百分点的准确率差距就是“能用”和“不能用”的区别。5.3 尺寸和扩展性的实际体验定制板的尺寸是2.5cm×1.8cm比一张SD卡还小可以直接塞进定制的3D打印外壳里。开发板最小的也有3.5cm×2.5cm而且形状不规则外壳设计很受限。扩展性方面定制板预留了四个传感器接口I2C、SPI、UART和两个GPIO。传感器可以直接插在板子上不需要飞线。开发板虽然引脚多但位置固定接多个传感器时线缆容易打架而且没有固定的安装孔在振动环境下可靠性差。6. 如果你也想自己画一块这些坑我替你踩过了6.1 第一版板子最容易犯的五个错误回顾我第一版板子的调试过程有五个错误很典型几乎每个自己画板子的人都会遇到第一个错误是忘记加复位电路。有些芯片内部有上电复位但如果不加外部复位按键和RC电路调试时没法手动复位只能拔插电源非常麻烦。而且某些情况下电源波动会导致芯片进入异常状态没有复位电路就恢复不了。第二个错误是调试接口引脚复用。我把SWD调试引脚和I2C传感器接口复用了结果调试的时候传感器没法用用传感器的时候没法调试。后来改版把调试接口独立出来虽然多占了两个引脚但省心很多。第三个错误是电源切换电路没做。我想同时支持USB供电和电池供电但没加电源切换芯片结果插USB的时候电池也在放电拔USB的时候系统直接断电。正确的做法是用一颗负载开关或者理想二极管做电源优先级切换。第四个错误是晶振负载电容选错。32.768kHz晶振的负载电容要根据晶振手册的CL值计算我随便放了两个12pF的电容结果RTC走时一天差好几分钟。后来换成6pF的电容精度才达标。第五个错误是Flash和RAM的预留不够。第一版选了512KB Flash和128KB RAM的芯片跑一个稍微大一点的模型就放不下了。第二版换成1MB Flash和256KB RAM才勉强够用。建议至少预留50%的余量因为模型会越来越大而且TFLite Micro本身也要占几十KB的RAM。6.2 焊接和调试的实用技巧焊接QFN芯片时先用助焊剂涂满焊盘放上芯片对齐然后用热风枪350度吹30秒左右看到芯片自动归位就差不多了。焊完后用显微镜检查引脚有没有连锡特别是电源和地之间。调试时如果芯片不工作先量电源电压和复位引脚电压再量晶振有没有起振。如果晶振不起振检查负载电容和反馈电阻。如果SWD连不上检查调试引脚的复用配置和复位电路。固件下载后如果功耗异常先量各个电源轨的电流定位是哪部分在耗电。常见原因是GPIO配置不对、外设时钟没关、或者某个芯片进入了异常状态。我习惯在固件里加一个“低功耗自检”函数启动后把所有外设关掉进入深度睡眠量一下电流确认硬件没问题再逐步开启功能。6.3 小批量生产的成本控制如果项目要从一两块扩展到几十块成本控制就很重要。我的经验是PCB打样选便宜的国产厂商阻容用0402封装比0603便宜且省空间芯片选带Flash的型号省掉外部Flash连接器选国产替代。10片以内的总成本可以控制在1000元以内50片的话均摊到每片大概60到80元。焊接方面如果自己焊建议买一台带风枪的焊台和一台显微镜总投入大概一千多但能反复用。如果不想自己焊找小批量贴片厂10片起做每片加工费大概20到30元。7. 什么情况下我建议你直接买现成板子说了这么多自己画板子的好处但必须承认大多数情况下买现成开发板是更理性的选择。如果你符合以下任意一条就别折腾自己画了项目还在算法验证阶段硬件只是工具换板子不影响核心工作对功耗和尺寸没有硬性要求插着USB或者用大容量电池就能跑团队里没有硬件工程师自己也没有焊接和调试经验项目周期紧张没有时间等打样和调试预算有限不想承担打样失败的风险我自己的原则是先用现成开发板把算法和固件跑通确认模型效果和资源占用然后再评估硬件瓶颈。如果瓶颈在硬件而且现成方案无法解决才启动定制板子的流程。这样风险最小因为软件层面的问题已经在开发板上暴露和解决了定制板子只需要解决硬件问题。另外现在也有一些半定制的方案比如核心板加底板的形式。核心板负责主控和最小系统底板负责传感器和接口。这种方案比全定制简单比全现成灵活适合中等复杂度的项目。我下一个项目就打算用这种方式核心板直接买现成的底板自己画省一半事。8. 写在最后定制硬件的价值在于“刚刚好”回到标题的问题有那么多现成的开发板为什么还要费劲巴拉地重新做一款我的答案是因为现成板子是“通用解”而TinyML项目往往需要“特解”。通用解追求覆盖尽可能多的场景所以必须在功耗、尺寸、接口、成本之间做妥协。而特解可以针对你的具体场景把资源集中在最需要的地方把不需要的部分全部砍掉。这种“刚刚好”的价值在Demo阶段看不出来但在产品化阶段就是竞争力。续航从7天变成28天尺寸从塞不进去变成刚刚好信噪比从55dB变成62dB这些差距累积起来就是“能用”和“好用”的分界线。当然自己画板子不是目的只是手段。如果你的项目用现成板子就能满足需求那恭喜你省下了大量时间和精力。但如果现成板子总是让你在关键指标上妥协那不妨认真考虑一下定制硬件。我踩过的那些坑、总结的那些经验希望能帮你少走弯路。硬件这条路走通了之后你对整个系统的掌控力会上一个台阶。