第1章 那个烧坏了三块开发板的入门者:嵌入式开发的First Blood
2019年夏的深圳南山,空调开在16度的工位里还飘着淡淡的酸味,林默站在工位前,手里攥着刚冒完烟的开发板,指节捏得发白。脚边摆着三块已经变形的板子:第一块的电源芯片烧成了一小撮黑渣,USB接口的金属外壳都融得变了形;第二块的RS485 PHY芯片焦黑一片,板角还留着被高温烫出的鼓包;第三块是刚测完SWD调试接口,MCU的I/O引脚像被烤化的巧克力一样缩成一团,丝丝白烟还从焊盘缝里往外冒。
他入职这家IoT公司刚满一周,手里攥着的智能门锁样机项目,下周就要给客户做Demo。入职那天老板拍着他的肩膀说“年轻人
他入职这家IoT公司刚满一周,手里攥着的智能门锁样机项目,下周就要给客户做Demo。入职那天老板拍着他的肩膀说“年轻人好好干,这个项目成了你就是公司的核心技术骨干”,现在可好,Demo还没做,先烧了三块开发板,加起来三千多块,相当于他两个月房租。
旁边的工位传来椅子滑动的声响,周哥端着个印着“Ctrl+C/Ctrl+V”的马克杯走过来,杯子里飘着云南小粒的香气,他瞥了一眼脚边冒着余温的三块板子,没像林默预想的那样劈头盖脸骂一顿,反而蹲下来捏了捏最惨的那块板的电源芯片:“哟,AMS1117-5V烧得挺彻底啊,黑渣都掉出来了,谁给你供的24V电?”<sup>[1]</sup>
林默的脸“唰”地红到了耳根。他刚才急着测试WiFi模块的通联,没看电源标签,把客户寄来的工业级24V供电电源直接怼到了板载的5V电源输入端——AMS1117-5V的输入耐压最高仅12V,24V的电压直接把它击穿,连带后面的MCU、WiFi模块、传感器接口全烧毁,板子冒烟的时候他吓得手忙脚乱拔电源,顺手把第二块板子的RS485 A/B线接反了,上电没两分钟PHY芯片也跟着冒了烟;第三块板子是他急着调SWD调试接口,嫌麻烦没接调试器的VDD
林默的头埋得低低的,指尖攥得发白,指甲缝里还沾着刚才拔板子时蹭到的PCB绿油,他预想中的劈头盖骂没来,反而闻到了周哥递过来的纸巾上淡淡的洗衣液味——周哥没给他擦汗,是把擦手的纸巾递了过来,还顺手把他脚边第三块冒烟的板子踢到了废品区的格子里,塑料板角磕在金属货架上发出“哒”的一声脆响。
“我入行第三个月烧过五块板,最贵的一块是TI的AM335x核心板,两千二,当时我半个月工资,比你惨。”周哥蹲下来,用镊子夹起第一块板子上融化的AMS1117-5V黑渣,放在放大镜下晃了晃,“你知道AMS1117的输入耐压上限是多少吗?”
林默的声音细得像蚊子叫:“12V……”
“对,12V,datasheet里写得清清楚楚,你接24V的时候哪怕花十秒钟翻一下原理图的电源标注,都不会出这个问题。”周哥把放大镜推到他面前,板子上电源输入端的丝印“VIN: 7-12V”还清晰可见,旁边本来应该贴的电源极性保护二极管的位置,空着一个焊盘——硬件工程师为了省两毛钱成本,把反接保护电路去掉了,“你看,硬件设计的时候偷了懒,你测试的时候没做前置检查,这不就烧了?”
旁边的几个老员工都凑过来看热闹,却没一个人嘲笑他,反而有个做测试的姑娘递过来一瓶冰矿泉水:“我刚入职的时候烧过七块,最离谱的是把12V电源接到3.3V引脚,直接把整个MCU烧成炭了,比你这还惨。”林默接过水,冰得他指尖一颤,刚才憋在眼眶里的泪硬生生憋了回去。
周哥拉过一张椅子让他坐下,转身从自己工位底下拖出一个纸箱子,里面整整齐齐码着十几块烧坏的板子,有电源烧的,有接口接反烧的,有静电打坏的,甚至有因为焊锡渣掉进去短路的。“你看,嵌入式开发的第一关就是烧板,烧得越多,踩的坑越多,后面就越稳。不过烧板也得烧得明白,不能白烧。”他抽出一张A4纸,在上面画了个圈,“咱们先搞明白,嵌入式开发到底是什么,你刚才踩的三个坑,本质上都是对这个本质理解不够。”
1.1 嵌入式开发的“软硬结合”从来不是一句口号
很多人对嵌入式开发的认知还停留在两个极端:要么觉得是“写C语言代码的”,和普通软件开发没区别,只要算法好、代码写得溜就行;要么觉得是“画电路板的”,只要硬件设计没问题,随便写写代码就能跑。这就像把汽车拆成发动机和变速箱,硬说哪个更重要——没有发动机的变速箱是废铁,没有变速箱的发动机也只能空转。
嵌入式开发的“软硬结合”从来不是简单的“硬件画完板子软件写代码”,而是从需求阶段开始,硬件工程师就要和固件工程师一起评估方案的可行性:比如你要做一个支持24V供电的工业级智能门锁,硬件选型的时候就要考虑MCU有没有足够的低功耗模式,固件开发的时候就要知道硬件的电源域划分,什么时候开什么外设,什么时候关电源,才能把待机功耗降到10μA以下;再比如你要做WiFi模块的数据传输,硬件设计的时候就要留好天线匹配电路,固件开发的时候就要知道天线的增益、频段,才能把传输距离做到最优。
这种配合不是线性的,而是贯穿整个产品生命周期的:硬件设计的时候要考虑固件的调试需求,要留SWD调试接口、串口打印接口、测试点;固件开发的时候要考虑硬件的边界条件,比如引脚的驱动能力、信号的时序要求、电源的纹波范围;测试的时候软硬件工程师要一起定位问题,是硬件信号有问题还是代码逻辑有bug;量产的时候还要一起优化可制造性,比如焊盘的尺寸、元器件的位置,既要方便贴片,又要方便测试。
根据2023年电子工程世界对国内1287家IoT企业的调研,嵌入式产品开发周期超期的原因里,34%是软硬件配合问题,21%是硬件设计缺陷,18%是固件稳定性问题,只有27%是需求变更或者供应链问题——也就是说,超过七成的开发问题,出在软硬配合的环节。林默烧的三块板,恰好踩中了三个最典型的软硬配合坑:第一块是硬件没做电源防护,固件没做电源检测,属于硬件设计缺陷;第二块是硬件没做接口保护,固件没做接口校验,属于软硬件配合问题;第三块是硬件没留调试器供电,固件没做调试接口电平匹配,属于设计规范缺失。
> 📖 纸书注:嵌入式开发的“软硬结合”本质,是打破软件和硬件的边界,让两个领域的知识互相支撑,而不是各干各的。这也是嵌入式开发和纯软件开发、纯硬件设计最大的区别。
1.2 从芯片上电到量产出货:嵌入式开发的完整链路
周哥拿马克笔在白板上画了一个流程图,从需求分析开始,一直画到批量出货,一共九个环节,每个环节后面都标着红色的感叹号,写着“容易踩坑”。
```mermaid graph TD A[需求分析] --> B[芯片/器件选型] B --> C[硬件原理图/PCB设计] C --> D[硬件打样/焊接调试] D --> E[固件Bootloader开发] E --> F[外设驱动开发] F --> G[业务逻辑开发] G --> H[功能/性能/环境测试] H --> I[EMC/安规认证] I --> J[小批量试产] J --> K[量产爬坡/良率优化] K --> L[批量出货] style A fill:#f9f,stroke:#333,stroke-width:2px style L fill:#9f9,stroke:#333,stroke-width:2px %% 标注每个环节的常见坑 A:::坑 -->|需求不明确| B B:::坑 -->|选型失误| C C:::坑 -->|设计缺陷| D D:::坑 -->|调试不到位| E E:::坑 -->|Bootloader有bug| F F:::坑 -->|驱动不兼容| G G:::坑 -->|逻辑漏洞| H H:::坑 -->|测试不充分| I I:::坑 -->|认证失败| J J:::坑 -->|DFM缺陷| K K:::坑 -->|良率低| L classDef 坑 fill:#fff,stroke:#f00,stroke-width:1px ```
“咱们就着你这三块板,把每个环节的坑都捋一遍。”周哥用笔点了点第一块烧了的板子,“首先是需求分析阶段,客户说要‘支持24V供电的工业级智能门锁’,这个需求你拿到之后有没有问清楚细节?比如24V供电的波动范围是多少?是7-32V还是9-36V?工作温度是多少?是室内还是室外?有没有防雷防浪涌的需求?这些你都没问,硬件工程师拿到需求就按普通的5V供电门锁设计,电源芯片选了AMS1117,输入耐压才12V,这不就踩坑了?”
然后是芯片选型阶段:“很多新手选型的时候只看参数,不看实际应用场景。比如这个项目的MCU选的是STM32L4,本身是低功耗的,但是硬件工程师选电源芯片的时候,为了省两毛钱,选了AMS1117,而不是支持24V输入的buck降压芯片,导致整个电源链路的耐压不够。还有的人选型的时候只看性能,不看供应链,比如选了个小众的MCU,性能强还便宜,结果后来缺芯,这个MCU涨价十倍还买不到,项目直接黄了,我之前有个朋友做工业项目,就踩过这个坑,项目亏了上百万。”
接下来是硬件设计阶段:“你烧的第二块板,RS485的A/B线接反就烧了PHY,说明硬件设计的时候没加接口保护。工业级的接口至少要加ESD保护芯片,最好加隔离电路,就算接反、有浪涌,也不会烧核心芯片。还有SWD调试接口,很多硬件设计的时候没给调试器供电,或者没加电平转换,导致调试的时候烧MCU,你第三块板就是这个问题。还有的人硬件设计的时候不考虑可测试性,没有留测试点,量产的时候测试要拆外壳,效率极低,良率也低。”
然后是固件开发阶段:“很多新手写代码的时候不考虑硬件的边界,比如STM32L4的I/O引脚最大驱动电流是25mA,你要是接个LED,限流电阻选大了,电流不够,灯不亮,选小了,电流超过25mA,就会烧引脚。还有中断服务函数,不能写太长的代码,不能调用printf,不然会影响实时性,甚至导致系统崩溃。我之前有个项目,固件工程师在中断里写了串口打印,导致中断响应太慢,设备死机,客户退货,损失了几十万。”
接下来是测试验证阶段:“很多新手只测功能,不测边界条件,比如电源电压从7V到12V,能不能正常工作,温度从-20度到60度,能不能正常工作,接口接反了会不会烧板,这些都要测,不然到客户手里出问题,损失更大。还有的人不做EMC测试,觉得产品卖得少不用做认证,结果卖了一万多台,被工商局查了,说辐射超标,全部召回,损失几百万。”
最后是量产爬坡阶段:“很多新手没考虑DFM(可制造性设计),比如元器件的位置太密,贴片机贴的时候容易短路,焊盘尺寸太小,焊接的时候容易虚焊,测试点没留,量产的时候测试效率低,良率低,亏本。我之前有个项目,PCB上的元器件贴得太密,良率只有60%,改板耽误了两个月上市,损失上千万。”
> 📱 电子版侧边栏【周哥的避坑笔记】:新人烧板三件套:电源接反、接口接反、调试器电源忘接,你中了几个?哈哈,开个玩笑,其实这些都是基础规范没做到位,上电前三步检查:1. 测电源电压和极性;2. 查接口线序;3. 确认调试器供电正常,能避免80%的烧板问题。
1.3 中级工程师的三大能力短板:你中了几条?
周哥画完流程图,扔给林默一块新的开发板,是刚才烧的那款的备用板,包装还没拆。“你现在入行一周,烧了三块板,其实很正常,但是如果你想成为能独立负责项目的工程师,得先补三个短板,不然就算给你十个板子,你也做不成项目。”
1.3.1 链路视野缺失:只会干自己的活,不知道全链路怎么走
很多工作3-5年的中级嵌入式工程师,普遍存在这个问题:只会做自己负责的环节,比如只会写固件,不知道硬件设计要考虑什么,不知道量产的时候要考虑什么。到了做项目负责人,整个链路走不通:比如选型的时候选了个冷门的MCU,供货要等三个月,项目直接黄了,他还觉得是供应链的问题,其实是他选型的时候没考虑供应链的稳定性;比如硬件设计的可测试性差,量产的时候测试效率极低,良率只有50%,他不知道怎么改,只能硬着头皮生产,亏了几十万。
这种短板本质上是“点状思维”,只盯着自己的一亩三分地,不知道整个产品从需求到出货的完整链路,也不知道每个环节的决策会影响后面的环节。比如你选了一个功耗低的MCU,但是硬件设计的电源纹波太大,固件跑起来还是功耗高,这就是前面环节的决策影响了后面的结果。
1.3.2 问题定位能力不足:只会看代码,不知道查硬件
很多中级工程师遇到问题,第一反应是查代码,比如系统死机了,先看有没有死循环,有没有内存泄漏,查了半天查不出来,才发现是电源纹波太大,或者信号有干扰。这种问题定位能力的缺失,本质上是知识面太窄,只懂软件,不懂硬件。
嵌入式开发的问题定位,从来不是“软件查代码,硬件查电路”,而是要从系统层面入手:先看电源是不是稳,再看信号是不是正常,最后看代码逻辑有没有问题。比如系统复位了,先测一下复位引脚的电压,是不是有毛刺,再看复位电路的电容电阻是不是选型正确,最后看代码里有没有看门狗喂狗不及时的问题。很多人一上来就看代码,浪费几天时间都查不出来,其实拿个示波器测一下复位引脚,两分钟就能找到问题。
1.3.3 成本意识淡薄:做设计只考虑性能,不考虑成本
很多中级工程师做设计的时候,总想着“选最好的,做最稳的”,比如选型的时候选最贵的芯片,觉得贵的肯定好;改板的时候随便改,一次改板要几万块,改三次就十几万,项目还没赚钱就先亏了。
成本意识不是让你偷工减料,而是要在满足需求的前提下,把成本做到最优。比如你要做一个消费电子的智能门锁,BOM成本要求控制在50块以内,你选了个50块的MCU,那整个产品的成本直接超标,根本卖不出去。这时候就要权衡:是不是可以用性能稍低但价格只有20块的MCU?是不是可以去掉一些没用的功能?是不是可以用更便宜的传感器?这些都需要成本意识。
> 📖 纸书注:中级工程师的这三个短板,本质上是“全局认知”的缺失。嵌入式开发从来不是一个环节的工作,而是从需求到出货的全链路协同,只有对整个链路有足够的认知,才能独立负责一个项目,成为高级工程师。
1.4 本书的叙事逻辑:用真实项目故事讲透实战方法
周哥把刚才烧的那块板的残骸收进废品箱,拍了拍林默的肩膀:“这本书就是讲