
1. 芯片烧录到底在烧什么先把概念理清楚刚入行那会儿我第一次听到“烧录”这个词脑子里浮现的是拿烙铁往电路板上怼的画面。后来才知道这跟焊接没半点关系烧录的本质是把编译好的程序代码写进芯片的存储器里让芯片能按我们的意图跑起来。你可以把它理解成给芯片“装系统”——出厂时芯片是张白纸烧录就是往上写字的过程。芯片烧录这个词在产线上、在研发桌上、在维修台前含义其实略有差别。产线工人说的烧录通常指用脱机烧录器批量给芯片写固件研发工程师说的烧录可能是通过调试器给目标板下载程序而维修师傅说的烧录往往是把好的固件重新写进换过的芯片里。不管哪种场景核心动作都是一致的把二进制数据搬运到芯片内部的非易失存储区域。那为什么会有 ISP、ICP、IAP 这三个词因为它们描述的是“怎么烧”和“什么时候烧”的不同路径。ISP 是 In-System Programming在系统编程芯片焊在板子上就能烧ICP 是 In-Circuit Programming在电路编程通常借助调试接口直接操作芯片IAP 是 In-Application Programming在应用编程程序自己运行的时候去改自己的存储内容。这三个概念经常被混着用甚至有些厂商的文档也写得含糊但实际用起来差别很大选错了方案轻则效率低重则产线返工。我写这篇东西就是想把这几个概念掰开揉碎让刚接触嵌入式的朋友少走点弯路。不管你是做 STM32、GD32 还是 HC32 的底层逻辑是通的。看完你至少能明白什么时候该用 ISP什么时候必须上 ICPIAP 又适合解决什么刁钻问题。2. ISP、ICP、IAP 到底怎么选先搞懂底层逻辑2.1 从芯片启动流程看三种方式的本质区别要理解这三者的区别得先知道芯片上电之后干了什么。以常见的 ARM Cortex-M 系列为例芯片上电后内核会先从固定的地址取中断向量表然后跳转到复位处理函数。这个固定地址通常指向芯片出厂时预置的一段 Bootloader 代码这段代码是芯片厂商写死的用户改不了。ISP 利用的就是这段出厂 Bootloader。芯片厂商在 Bootloader 里实现了一套通信协议常见的有 UART、USB、CAN 等。你通过特定的引脚电平组合让芯片进入 Bootloader 模式然后上位机软件通过串口把固件发过去Bootloader 负责把数据写进主 Flash。整个过程不需要调试器一根串口线就能搞定。ICP 走的是另一条路。它不依赖出厂 Bootloader而是通过调试接口直接访问芯片内部的 Flash 控制器。JTAG 和 SWD 是最常见的两种调试接口。调试器把数据通过调试接口送进芯片芯片内部的调试模块直接操作 Flash 控制器完成写入。这种方式绕过了所有软件层只要芯片没被锁死就能烧。IAP 则是把“烧录”这个动作交给了用户程序自己。你的程序在运行过程中通过某种通信接口比如串口、网口、无线模块接收新的固件数据然后自己调用 Flash 擦写函数把数据写进去。写完之后跳转到新固件执行。整个过程不需要断电也不需要外部调试器。2.2 一张表看清 ISP、ICP、IAP 的适用场景对比维度ISPICPIAP全称In-System ProgrammingIn-Circuit ProgrammingIn-Application Programming依赖硬件串口/USB/CAN 等通信接口JTAG/SWD 调试接口任意通信接口是否需要调试器不需要需要不需要烧录时机芯片焊在板上即可芯片焊在板上即可程序运行过程中典型工具Flash Loader Demonstrator、STM32CubeProgrammerJ-Link、ST-Link、DAP-Link自定义 Bootloader适用阶段产线批量烧录、现场升级研发调试、产线首件远程升级、OTA速度中等快取决于通信接口灵活性受限于出厂 Bootloader高最高这张表是我自己踩坑之后总结的网上很多资料把 ISP 和 ICP 混为一谈实际上它们的硬件路径完全不同。ISP 走的是芯片的通信外设ICP 走的是调试模块。理解这一点后面很多问题就顺了。2.3 为什么有些项目必须用 ICP 而不能用 ISP我遇到过好几次这样的情况板子设计的时候没把 Bootloader 的进入引脚引出来或者引出来了但被其他功能占用了。这时候 ISP 就用不了只能上 ICP。还有一种情况是芯片被读保护了ISP 的 Bootloader 可能拒绝擦写但 ICP 可以通过调试接口先解除保护再烧。另外ISP 的速度受限于出厂 Bootloader 的实现质量。有些芯片的串口 ISP 只支持 115200 波特率烧个大固件要等好几分钟。ICP 用 SWD 接口速度可以跑到几兆赫兹烧同样的固件可能只要几秒。产线上时间就是钱所以很多批量烧录的场景会优先选 ICP。但 ICP 也不是万能的。它需要调试接口意味着板子上得留出 SWD 或 JTAG 的焊盘或排针。有些成本敏感的产品PCB 面积卡得很死多一个排针都是钱。这时候 ISP 的优势就出来了只需要一个串口甚至复用现有的通信接口就行。3. ISP 实操从硬件连接到软件配置的完整流程3.1 硬件层面需要做什么准备以 STM32 为例进入 ISP 模式需要满足两个条件BOOT0 引脚拉高BOOT1 引脚拉低有些型号不需要 BOOT1。然后复位芯片芯片就会从系统存储器启动运行出厂 Bootloader。实际操作中我通常会在板子上留一个跳线帽或者拨码开关来控制 BOOT0。如果没有留也可以用镊子短接 BOOT0 到 VDD然后按一下复位键。但这种方法在产线上不现实所以产品设计阶段就要考虑好。串口连接方面Bootloader 通常使用 USART1引脚是 PA9 和 PA10。你需要一个 USB 转串口模块TX 接 PA10RX 接 PA9GND 对接。注意电平匹配有些芯片是 3.3V 电平你接 5V 的串口模块可能会烧芯片。我一般用 CH340 或者 CP2102 的模块它们有 3.3V 输出档位。注意有些芯片的 Bootloader 对串口时序要求比较严格USB 转串口模块的晶振质量差的话可能会握手失败。遇到这种情况换一个好点的模块试试。3.2 上位机软件怎么配置ST 官方提供的 STM32CubeProgrammer 支持 UART、USB、SWD 等多种连接方式。打开软件后选择 UART然后选对应的 COM 口。波特率可以先试 115200如果连不上再降速。连接成功后软件会读取芯片的型号和 Flash 大小。这时候你可以选择要烧录的 hex 或 bin 文件点击下载。烧录完成后记得把 BOOT0 跳回低电平再复位芯片才会从主 Flash 启动。有些朋友会遇到“无法识别芯片”的问题。我总结下来八成是以下几个原因BOOT0 没拉高、串口线序接反、波特率不匹配、芯片被读保护了。挨个排查基本能解决。3.3 ISP 烧录的效率和稳定性优化如果你要在产线上批量烧录ISP 的效率是个大问题。我试过几种优化方法一是提高波特率有些芯片的 Bootloader 支持到 921600但需要上位机软件也支持二是减少握手次数有些软件可以配置“跳过握手”直接烧三是用脱机烧录器把固件存在烧录器里按一下按钮就烧一片不需要电脑。稳定性方面串口线不要太长最好在 30 厘米以内。电源要干净烧录过程中掉电是大忌。我见过因为电源纹波太大导致烧录失败的案例换了 LDO 就好了。4. ICP 实操调试器选型与烧录参数详解4.1 J-Link、ST-Link、DAP-Link 怎么选ICP 的核心工具是调试器。市面上常见的调试器有 J-Link、ST-Link、DAP-Link 等。J-Link 最贵但最稳支持芯片型号最多烧录速度也最快。ST-Link 是 ST 官方的便宜但只支持 ST 的芯片。DAP-Link 是开源的性价比高支持多种芯片。我个人的选择是研发阶段用 J-Link因为它的调试功能最全产线用 DAP-Link 或者脱机烧录器成本低。ST-Link 适合学生和爱好者价格便宜功能够用。选调试器的时候要注意接口电平。有些调试器是 5V 电平有些是 3.3V。接错电平可能烧调试器或者烧芯片。我一般会先用万用表量一下调试器的输出电平确认无误再接。4.2 SWD 接口的接线要点和常见故障SWD 接口只需要四根线SWCLK、SWDIO、GND、VCC可选。SWCLK 是时钟线SWDIO 是数据线。接线尽量短最好在 10 厘米以内。如果线太长信号质量下降会出现连接不稳定的情况。常见故障排查现象可能原因解决方法无法连接接线错误检查 SWCLK/SWDIO 是否接反连接不稳定线太长或干扰大缩短线长加屏蔽能连接但烧录失败Flash 被锁解除读保护烧录后不运行复位电路问题检查复位引脚电平识别不到芯片芯片没供电测量 VDD 电压这张表是我在实验室里贴墙上的遇到问题先对照排查能省不少时间。4.3 烧录参数里的门道速度、校验、复位ICP 烧录的时候软件里通常有几个参数可以调烧录速度、是否校验、复位方式。烧录速度不是越快越好。速度太快信号完整性变差容易出错。我一般先用默认速度如果稳定再逐步提高。J-Link 的速度可以设到 4000 kHz但有些板子跑到 2000 kHz 就不稳了。校验功能建议打开。烧录完成后调试器会把 Flash 里的数据和源文件对比确保写入正确。虽然多花一点时间但能避免很多莫名其妙的问题。复位方式有“硬件复位”和“软件复位”两种。硬件复位是通过复位引脚拉低再拉高软件复位是通过调试接口发送复位命令。有些板子的复位引脚接了电容硬件复位可能不干净这时候用软件复位更可靠。5. IAP 实操自己写 Bootloader 实现远程升级5.1 IAP 的基本原理和内存划分IAP 的核心思想是Flash 里有两段程序一段是 Bootloader一段是用户程序。Bootloader 负责接收新固件并写入用户程序区用户程序负责实现业务功能。内存划分通常是这样Bootloader 放在 Flash 起始地址比如 0x08000000大小 16KB 或 32KB。用户程序放在 Bootloader 之后比如 0x08008000。用户程序编译的时候链接地址要改成 0x08008000中断向量表也要偏移。Bootloader 启动后先检查是否有升级标志。如果有就进入升级模式接收新固件并写入如果没有就跳转到用户程序区执行。5.2 中断向量表偏移的坑和解决方法这是 IAP 最容易踩的坑。ARM Cortex-M 的中断向量表默认在 0x08000000但用户程序在 0x08008000如果不做偏移中断触发后还是会跳到 Bootloader 的向量表导致程序跑飞。解决方法是在用户程序的 main 函数开头调用SCB-VTOR 0x08008000;把向量表重定向到用户程序区。有些芯片的库函数提供了NVIC_SetVectorTable函数效果一样。另外链接脚本里也要改。以 GCC 为例在.ld文件里把FLASH的起始地址改成 0x08008000长度减去 Bootloader 的大小。IAR 和 Keil 也有对应的配置项。注意改完链接地址后生成的 bin 文件是从 0x08008000 开始的。烧录的时候要确保烧到正确的地址否则程序跑不起来。5.3 固件传输协议的设计要点IAP 的固件传输协议可以很简单也可以很复杂。最简单的就是串口接收每收到一包数据就写 Flash。但实际产品中要考虑很多因素数据校验、断点续传、版本管理、加密等。我一般会设计一个简单的协议包头 长度 数据 CRC 包尾。Bootloader 收到一包校验 CRC正确就写入错误就请求重传。全部写完后再整体校验一次确保固件完整。传输速度取决于通信接口。串口 115200 波特率下传 100KB 的固件大概要 10 秒。如果用 USB 或者网口可以快很多。无线升级的话还要考虑信号稳定性和功耗。5.4 IAP 升级失败后的恢复机制IAP 最怕的就是升级到一半断电Bootloader 写了一半用户程序也被擦了一部分整个设备变砖。为了避免这种情况我通常会在 Flash 里留一个备份区。升级前先把旧固件备份到备份区升级失败后从备份区恢复。还有一种方法是双区升级Flash 分成 A 区和 B 区当前运行 A 区升级时写 B 区写完后切换标志下次启动从 B 区运行。如果 B 区升级失败A 区还在可以回滚。这种方法更可靠但需要双倍的 Flash 空间。6. 常见问题与排查技巧实录6.1 烧录失败的那些坑我帮你踩过了烧录失败的原因五花八门我整理了一个速查表问题现象排查方向我的经验连接不上芯片供电、接线、时钟先量电压再查线序烧录到一半报错电源不稳、Flash 坏块换电源换芯片烧录成功但不运行启动模式、向量表检查 BOOT 引脚和 VTOR读保护无法解除调试接口被禁用批量擦除命令IAP 升级后死机向量表偏移、堆栈检查链接地址和栈顶串口 ISP 握手失败波特率、晶振降速换模块这张表里的每一条都是我实际遇到过的。特别是“烧录成功但不运行”新手很容易懵。其实大部分情况是启动模式不对或者中断向量表没偏移。6.2 芯片被锁死之后还能救吗芯片被读保护锁死是常见问题。有些芯片可以通过调试接口的“解除保护”命令恢复但会擦除所有 Flash 内容。有些芯片一旦锁死就彻底废了只能换新的。ST 的芯片一般可以通过 ST-Link 的“Unlock”功能恢复。GD32 的芯片类似。但有些国产芯片的保护机制比较狠锁死之后调试接口直接禁用只能通过 ISP 的批量擦除命令恢复。如果 ISP 也被禁了那就真没辙了。预防措施很简单烧录前确认读保护选项不需要保护就别开。产线烧录的时候最后一步再开保护避免中途锁死。6.3 产线批量烧录的效率提升技巧产线烧录讲究的是速度和一致性。我总结了几条经验第一用脱机烧录器。把固件存在烧录器里工人只需要放板子、按按钮不需要电脑。速度快还不容易出错。第二做烧录治具。把调试接口做成探针板子放上去就自动连接省去插线的功夫。第三固件合并。把 Bootloader 和用户程序合并成一个文件一次烧录完成减少工序。第四烧录后自动校验。烧录器自动比对数据不合格的板子直接报警避免不良品流入下一道工序。7. 几个容易混淆的概念澄清7.1 ISP 和 ICP 在产线上的实际分工很多资料把 ISP 和 ICP 混着讲但在产线上它们的分工其实很明确。ISP 适合没有调试接口或者调试接口被占用的板子只需要串口就能烧。ICP 适合有调试接口的板子速度快稳定性好。我见过一些产线先用 ICP 烧 Bootloader再用 ISP 烧用户程序。这样分工的原因是Bootloader 需要调试接口写入用户程序可以通过 Bootloader 的 ISP 功能写入。两道工序各司其职效率最高。7.2 IAP 和 OTA 的关系IAP 是在应用编程OTA 是空中升级。OTA 是 IAP 的一种实现方式特指通过无线方式传输固件。IAP 可以通过串口、网口、USB 等有线方式也可以通过无线方式。所以 OTA 是 IAP 的子集。做 OTA 的时候除了 IAP 本身的逻辑还要考虑无线模块的驱动、网络协议栈、断点续传、功耗管理等问题。复杂度比有线 IAP 高不少。7.3 不同芯片厂商的术语差异ST 的文档里ISP 通常指通过 UART 烧录ICP 指通过 SWD 烧录。但有些厂商的文档里ISP 和 ICP 是混用的甚至把 IAP 也叫成 ISP。看文档的时候要注意上下文别被术语绕晕。GD32 的 ISP 和 STM32 类似但 Bootloader 的进入方式可能略有不同。HC32 的 IAP 实现和 STM32 也有差异特别是 Flash 擦写函数的调用方式。做移植的时候这些细节要特别注意。8. 我个人的一些经验体会烧录这件事说简单也简单说复杂也复杂。简单是因为原理就那些复杂是因为实际场景千变万化。我做了这么多年最大的体会是提前规划比事后补救重要得多。产品设计阶段就要想好烧录方案。留不留调试接口留不留 BOOT 跳线Flash 怎么分区这些问题在画原理图的时候就要定下来。等到板子打回来才发现没留调试接口那就只能飞线了。另外不要迷信官方文档。官方文档写的是理想情况实际用起来总会遇到各种意外。多动手试多记录把每次踩的坑都记下来慢慢就形成自己的知识库了。最后说一个细节烧录完成后一定要做功能验证。我见过烧录成功但程序跑不起来的案例原因是晶振没起振。烧录器只负责写数据不负责验证硬件。所以烧录后的功能测试不能省。这个内容后续还可以这样扩展比如讲讲如何用脚本自动化烧录流程或者如何设计一个支持多种芯片的通用烧录治具。这些在实际工作中都很有用有机会再展开聊。