ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

芯片烧录全解析:ISP、ICP、IAP原理、接线与实战选型

芯片烧录全解析:ISP、ICP、IAP原理、接线与实战选型 1. 芯片烧录到底是个什么手艺从一次痛苦的焊板经历说起我入行第一年在一家做智能硬件的公司做固件开发。当时带我的老师傅丢给我一块焊好的板子、一个下载器和一根杜邦线说把这板子烧一下。我一脸懵烧什么怎么烧焊的不是好好的吗老师傅看了我一眼里面没程序芯片就是个空壳你把它点亮。这就是芯片烧录最朴素的解释往芯片里写入程序让一块硬件有了思想。称它为烧录是因为早年用紫外线擦除的EPROM芯片写入前需要用紫外线灯照射擦除而写入时一旦出错可能真的会把芯片烧坏这个叫法就这么留下来了。放到今天不管你是往Flash里写固件、往OTP区写配置字、还是往EEPROM里写校准参数大家统称烧录。这篇文章想帮新手一次性理清三个特别容易搞混的概念ISP、ICP、IAP。它们都是烧录方式但适用场景、硬件连接、底层原理完全不同。很多刚入行的朋友做完一个项目会用JTAG下载程序却分不清它到底算ISP还是ICP又或者听别人说你这产品要支持IAP升级根本不知道和普通烧录有什么关系。这篇我会从原理、接线、操作流程、选型思路和踩坑经验几个维度全讲透配套按文末的方式去实践基本能覆盖你工作中80%的烧录需求。2. 三种烧录方式的本质差异为什么烧的方法还不止一种要想搞懂ISP、ICP、IAP先得理解一个背景芯片在不同生命周期阶段能采用的写入方式不一样。这就好比给一本书印刷内容可以是在装订之前用印刷机印也可以是书已经订好之后用补印的方式加页甚至可以让读者自己按需更新。芯片烧录也遵循类似逻辑。对比维度ISPICPIAP全称In-System Programming在系统编程In-Circuit Programming在电路编程In-Application Programming在应用编程烧录时机芯片已焊到电路板上、系统可运行芯片已焊到电路板上但通常不需系统运行产品交付后用户手里运行中升级是否需要专用设备需要通常用USB转串口或专用ISP下载器需要如JTAG/SWD调试烧录器不需要靠芯片自己写自己的Flash触发方式芯片进入ISP模式后由主机引导写入调试接口直接控制芯片写入应用程序里触发跳转Bootloader再写入典型芯片厂家举例STC、AVR、部分STM32的串口ISPSTM32/S32K等带JTAG/SWD接口的芯片各类带Bootloader的MCU、手机、路由器固件适合场景产线批量烧录、升级现场维护开发调试、小批量量产远程升级、用户自助升级、OTA很多人第一反应是ISP和ICP不都是在电路板上烧吗有什么区别区别核心在于谁在控制这次写入。ISP是芯片内部出厂固化的Bootloader引导程序在配合你。你用串口把数据发进去芯片里那段出厂时写好的Bootloader接收数据、擦除应用区、再把新程序写进去。整个过程芯片是可以上电运行的甚至主时钟都在跑。ICP是外部调试器直接接管芯片。JTAG/SWD接口就是专门造出来给外部工具直接控制芯片的调试器可以暂停CPU、读写内存、擦写Flash不需要芯片里预先有任何程序配合。芯片里是空的没关系甚至Flash里没程序、时钟没初始化都行调试器靠自身的时钟协议就能操作。IAP则是让应用自己烧自己。芯片运行时在某一个特定条件下跳转到Bootloader区由Bootloader完成对新固件的接收和写入然后再跳回应用区跑新的App。打个比方ISP相当于厂方售后上门给你换主板ICP相当于直接用工程钥匙进入机房换设备IAP则相当于设备自己下载更新包然后自己拆自己装。搞清这一层区别你会发现后面所有接线、软件选择、操作步骤都是顺理成章的事。3. ISP在系统烧录的原理与实操串口线也能烧程序3.1 ISP的硬件基础哪些引脚参与怎么接ISP最常见的载体是串口UART也有用SPI/I2C做ISP的但主流MCU用户接触最多的是串口ISP。拿最经典的51单片机STC系列和STM32来说STC的典型ISP接线目标板的RXD接USB转串口模块的TXD目标板的TXD接模块的RXD共地。部分型号还需要在下载时对某些引脚做电平配合比如STC有些型号需要P1.0、P1.1接地才能进入ISP模式不过现在新出的STC8系列大部分型号在串口下载时会自动复位进入Bootloader不用手动拉电平了。STM32的串口ISP通过BOOT0引脚拉高、BOOT1拉低后复位芯片从系统存储器启动运行出厂Bootloader然后通过USART1或USART2接收数据。烧完再把BOOT0拉低复位回到正常Flash启动。操作步骤一般是这样断开目标板电源把USB转串口模块和板子对应引脚接好并确认共地。按住下载软件里的开始下载按钮不同工具操作时机不同STC是软件点下载之后才给板上电STM32的串口ISP工具通常先复位进入Bootloader再连接。给目标板上电或按复位键。软件检测到芯片、擦除、写入、校验提示完成。一个关键经验串口ISP对电平匹配很敏感。如果你用的USB转串口模块是3.3V的目标板也是3.3V的MCU没事但如果模块是5V输出的直接接3.3V的MCU极大概率把引脚打坏或者至少烧不进去。务必确认逻辑电平一致不加转换的话就得用TTL电平匹配模块我早期就烧掉过两颗STM32F103原因就是拿5V的PL2303模块直连3.3V芯片的USART1引脚出来的数据全是乱码最后还把引脚搞短路了。3.2 ISP模式下芯片是怎么工作的Bootloader的出厂协议为什么要单独讲Bootloader因为ISP也好、IAP也好都绕不开这个概念。芯片出厂时原厂在芯片内部ROM区烧了一段小程序这段程序专门负责通过某个外设接口接收数据并写入Flash。芯片的上电启动顺序一般是从固定地址读取复位向量如果是正常模式会跳转到用户程序区如果检测到进入ISP的条件比如BOOT引脚电平或特定握手信号就跳转到Bootloader区。STM32F103为例它的系统存储器System Memory里那块出厂Bootloader支持USART1、USART2、USB DFU等接口。你通过串口发0x7F做同步握手它回0x79表示确认然后就可以发读命令、擦除命令、写命令。很多人在串口ISP失败时看LOG只会看到连接失败no response其实问题往往出在握手阶段——波特率不匹配、晶体频率不对、引脚接错、BOOT引脚没拉对。这里给大家一个排查串口ISP失败的顺序量BOOT0电压是否确实为高STM32或对应型号进入ISP模式的引脚电平是否正确。串口模块的TXD/RXD是否交叉连接是否共地。检查串口工具里选择的波特率是否与芯片匹配范围一致。STM32出厂Bootloader默认波特率由硬件决定自动波特率检测通常能适配但碰到有源晶振频率异常时会失败。排除目标板上其他外设占用USART引脚的情况有些板子调试串口和主串口是复用的接了485芯片没使能会拉死总线。如果板上跑的程序里把USART引脚重新映射或禁用了先强制进入ISP模式再连接。3.3 ISP的适用边界量产为什么常选它ISP最大的优点是不需要昂贵的专用调试器一个USB转TTL模块十几块钱就能搞定缺点是需要芯片里出厂有Bootloader且速度受串口限制一般几十KB/s烧大程序体感的慢。再加上每次烧录要手动进模式/复位产线上的节拍如果没有治具支撑会明显拉低效率。不过很多小批量产品线依然选择ISP因为成本低、治具简单。用一台电脑、一个USB转串口模块、一个按压式烧录座或者干脆飞线配合软件里的允许在下载时自动复位选项工人只要把板子放上去、点一下按钮、看到下载成功灯亮再取下来节拍也能做到十几秒一片。产线上用ISP做批量烧录时有一个容易忽略的点**不同板子的芯片如果用了不同频率的外部晶振ISP软件检测波特率时可能出现误差累积。**我遇到过一批板子晶振标称12M但实际偏差0.5%串口ISP在115200波特率下偶发校验失败降波特率到57600后问题消失。如果你在产线上遇到有的板子好烧、有的板子要试好几次优先怀疑晶振精度和波特率而不是像无头苍蝇一样换软件换接线。4. ICP在电路编程脱机、裸片、调试器一条龙4.1 ICP的物理载体JTAG与SWD这几根线藏着什么秘密ICP最常见的实现方式是JTAG和SWD。JTAG全称Joint Test Action Group是一个边界扫描测试标准原本是用来做PCB测试的后来扩展成调试接口。SWD是ARM公司搞的串行调试接口只用两根线SWDIO和SWCLK加上电源和地总共4根线就能实现和JTAG几乎一样的烧录调试功能。STM32上你用ST-Link烧录默认走的就是SWD模式。接4根线SWDIO、SWCLK、GND、3.3V。比串口ISP少一个BOOT0引脚也不要求芯片里有任何程序哪怕芯片已经读保护、或者Flash全空ICP照样能连上并写入。这就是为什么开发调试几乎都用ICP而不是ISP——ICP更硬核它在芯片最底层工作。SWD和JTAG在接口占用方面有个对比特性JTAGSWD最小接线数4根TMS、TCK、TDI、TDO2根SWDIO、SWCLK占用引脚较多很多芯片专门的调试脚就是这些与JTAG复用引脚可切模式速度高但受线束影响足够日常调试最高几十MHz调试能力完整边界扫描完整调试额外也能做SWO trace常见工具J-Link、ST-Link、DAP-Link同样这些默认优先SWD我个人建议新手直接认准SWD。现在市面上的调试器基本都是SWD优先省引脚、接线简单。它用的SWCLK信号在连线上如果走线太长或干扰大降低到1MHz以下往往就好了线缆越短越稳定。4.2 ICP的完整烧录链路从IDE到芯片内部用ICP烧录的流程一般是在IDE比如Keil、IAR、STM32CubeIDE里编译出hex或bin文件调用调试器软件把它通过SWD/JTAG口写入芯片内部Flash。具体到STM32CubeProgrammer操作流程用ST-Link连接板子到电脑选择ST-LINK接口类型。点击Connect软件自动读取芯片ID、Flash大小等信息。选择要烧录的文件hex/bin设置起始地址bin需要设起始地址hex自带地址。点Download写入完成后再点Verify校验一次。有时还需要点Set Read Protection选项设置读保护防止固件被读出来。命令行方式也很实用方便产线脚本化用STM32CubeProgrammer的CLI模式可以直接一行命令完成擦除、下载、校验、设置读保护比如把烧录命令写成批处理脚本产线工人只要双击一个图标就能完成操作。实际工作中ICP最常见的痛点是连接不上调试器。排查顺序一般是检查调试器驱动是否装好设备管理器里能否看到设备。看板子是否供电量3.3V是否稳定。确认SWDIO/SWCLK两个引脚没有被复用成普通GPIO后导致拉死很多开发者写程序时不注意把这两个脚初始化成了输出口导致第二次烧录直接连不上。遇到连不上时先用按住复位键再点击连接的方式试试——有些芯片复位期间调试口是保持可用的连接成功后再松开复位这个技巧在芯片程序跑飞时特别管用。如果完全无响应检查目标板上有没有其他芯片占用了SWD引脚或者调试口线序接反。4.3 ICP量产方式脱机烧录器的核心价值ICP也广泛用于量产但产线上不会每片都挂电脑连IDE而是用脱机烧录器。这类设备本身内置了Flash存储事先把固件灌进去拿到现场只需要用一个烧录座或者探针压到待烧录芯片的对应引脚上按一下按钮设备自动完成擦写校验亮绿灯就是成功。脱机烧录最大的好处有三个不依赖电脑、不受USB驱动、杀毒软件干扰稳定性远高于PC方案。烧录速度快很多脱机设备支持高速SWD几十KB的程序几秒完成。可以设置多区域烧录比如一次写入Bootloader区、应用区、配置字区还能顺带写MAC地址/序列号这类唯一ID。如果你负责的产品需要批量发货我强烈建议从每台电脑接一个ST-Link挨个烧升级成一台脱机烧录器工装夹具。两者效率差距是数量级的。算笔账人工用ST-Link连板子烧一片小程序大概也得20秒一天8小时最多烧1400片换探针式烧录座上料、按压、按键、取料一个周期5秒一天能多出近三倍产能而且出错率大幅下降因为烧录器自己会校验。4.4 ICP与ISP在产线里的配合思路先烧后贴 vs 先贴后烧这里我多说一个产线工艺概念很多新手可能没接触过。先烧后贴在PCB还没贴片之前把芯片放在烧录座上先用IC烧录器烧好程序再贴到板子上。这种方式适合芯片引脚已经可以通过烧录座直接接触的封装比如TSSOP、LQFP好处是烧录时可检测芯片好坏坏片直接拣掉不浪费后续贴片和组装成本。先贴后烧板子贴片焊接完成后再通过板上的调试口或串口头烧录。好处是烧完可以直接做整机功能测试坏板当场发现。坏处是如果烧录失败要重新修板返工成本高一些。具体选哪种取决于你的板子结构和量产规模。如果PCB空间允许把SWD接口引出来做成测试点那先贴后烧最舒服整机测试一条线搞定如果是空间非常紧凑的消费类产品或者固件刷错了容易报废就得考虑离线烧录座方案。5. IAP应用内编程让固件在用户手上自己升级5.1 IAP的架构Bootloader和App的双区切换前面提到ISP靠的是出厂BootloaderIAP则不然——IAP的Bootloader很可能就是你自己写的。IAP的典型架构是一个芯片Flash里分为两个区域Bootloader区通常放在0x08000000开头App区放在后面的地址。Bootloader负责检查有没有新固件、接收新固件数据、写入App区、最后跳转到App区运行。App运行期间如果收到升级指令会把标志位写到某个存储位置比如备份寄存器或Flash末尾然后软复位到BootloaderBootloader看到标志后进入升级流程。这个机制听起来简单但牵扯的实际问题很多App跳Bootloader前必须关闭所有中断、复位外设不然跳过去之后各种中断残留Bootloader会被打断。两个区域的起始地址和大小必须事先规划好Flash总容量有限Bootloader占太大App就小了。升级过程中断电会留下半成品固件必须做备份区和回滚机制否则变砖。5.2 升级包从哪来串口、蓝牙、Wi-Fi、USB的IAP流程差异IAP和OTA基本是孪生概念。OTAOver-The-Air就是通过无线方式做IAP升级。不管用哪种通道IAP的软件流程是相似的设备在App模式下收到升级包完整固件或差分包先校验CRC/签名。将升级包存入临时存储区可以是外部Flash、SD卡、或者内部Flash的暂存区。设置升级标志软复位进入Bootloader。Bootloader检查标志搬运新固件到App区擦除、写入、校验。校验通过后跳转新App校验失败则回退到旧App并上报错误。用串口做IAP是最常见的入门方式比如你的板子上没有网络模块但留了一个串口用户可以用PC工具或者手机蓝牙模块把升级包发给设备。用无线模块做OTA则是现在蓝牙Mesh设备、智能家居设备的标配好处是用户在App上点一下升级设备就给全屋的节点逐个推送固件不需要物理接触每台设备。5.3 为什么说IAP是产品思维的烧录这里我要特别强调一个观点ISP和ICP本质上还是生产环节的手段IAP则把烧录延伸到了产品的整个生命周期。做了IAP之后你的产品可以发布V1.0之后通过固件升级修bug、加功能不用召回硬件在产线上只烧一个出厂基础程序发货后根据不同地区客户的需求下发不同配置固件配合后端服务器像手机系统更新一样管理海量设备的固件版本最关键的一点配合安全签名机制能防止第三方篡改固件。从生态位来看IAP是你从开发工程师进阶到产品工程师绕不开的一项能力。如果你正在做联网设备无论Wi-Fi还是蓝牙迟早要用到OTA那IAP就是底层必须踏实的功夫。5.4 IAP实施中的地址规划与工程配置实操我以STM32G0系列为例把IAP的工程配置步骤简化一下。假设芯片Flash是64KBBootloader分配8KBApp区从0x08002000开始Bootloader工程需要设置链接脚本里FLASH起始地址0x08000000长度0x20008KB。编译产物是Bootloader的bin烧录到0x08000000。App工程需要设置链接脚本里FLASH起始地址0x08002000长度0xE00056KB。在系统初始化早期加入中断向量表重映射在启动代码或main开头执行SCB-VTOR 0x08002000。App里定义好跳转Bootloader的函数通常是设置标志位、关闭中断、复位外设然后调用NVIC_SystemReset()。实际踩过的坑提醒一下App的bin文件比hex更容易在IAP里处理因为IAP一般直接接收裸二进制流用hex还需要在设备端解析地址信息徒增复杂度。建议在IDE编译输出阶段就配置生成bin文件。Bootloader和App的波特率/通信协议要统一最好定义一个版本握手命令避免新旧混合升级时出现协议不兼容。给Bootloader加一个升级失败回滚机制最有效的做法是双App区运行A时升级B运行B时升级A哪个区校验通过就跳哪个区任何一次异常断电都不会变砖。代价是Flash容量要多一倍但这在Flash便宜的今天非常值得。6. 三种方法怎么选一张场景决策表帮你做判断市面上很多教程讲完概念就完了很多人看完依然不知道该用哪招。我的建议是拿一张决策表对着场景查你的情况推荐方案不推荐原因日常开发调试程序ICPSWDISP要进Bootloader操作麻烦IAP需要先写好Bootloader成本高芯片刚打样还没画好板想先验证芯片好坏ICP裸片烧录或选择支持烧录座的ISP没有板子没法谈IAP没有调试器手里只有串口线芯片出厂自带ISP BootloaderISP成本最低方案成熟量产中大批量烧录固件脱机IC烧录器ICP方式或带自动复位功能的ISP治具一台电脑一台ST-Link速度太慢产品已经交付用户后续可能功能升级IAP/OTA没IAP就只能返厂运营成本难以承受需要保护固件不被读取ICP方式设置读保护RDP或在ISP/IAP固件里加入软加密不做保护同行的板子能直接读出你固件逆向仿制看到这里你应该明白了这三种方案不是竞争关系而是产品生命周期不同阶段的配合关系开发时用ICP方便调试器单步跟踪量产时用ICP脱机烧录或者ISP流水线快速高效出货后用IAP远程修复和功能演进。一个成熟产品往往把三者都安排上了。比如一个带Wi-Fi的智能插座生产线上用脱机烧录器以ICP模式灌入Bootloader和出厂固件设置读保护RDP级别用户买到手后连上App云端推送固件升级包MCU里跑的Bootloader通过UART接收Wi-Fi模块转发的数据完成IAP升级。三个概念在这里串成了一条完整的链。7. 烧录不畅的常见疑难杂症与实战排查思路7.1 连接失败、校验失败、烧到一半卡死这三个问题是新手遇到最多的。我根据自己的经验把现象、原因、对策整理成一张实用性极强的排查指南故障现象常见原因快速对策ICP连接不上软件报No target detectedSWD引脚被程序复用、电源不稳、调试器线过长按住复位键再连接缩短线缆检查有无其他设备拉死引脚ISP握手失败发0x7F没有响应BOOT引脚没拉对、串口RX/TX接反、没共地优先检查引脚电平再查接线复位一次再试校验Verify失败Flash原本存在内容未擦除、电压太低写入不完整先Full Chip Erase再烧外接稳定3.3V降低烧录速率烧录过程中目标芯片发热明显内部短路、供电反接、IO对地短路立即断电量各电源引脚对地电阻排查焊接连锡烧录成功后设备不运行启动地址不对、App起始地址配错、BOOT引脚状态不对检查复位向量是否指向App区确认Boot配置引脚只有部分板子烧录异常晶振频率偏差、PCB布线影响时钟、个别芯片体质差异降低烧录速度检查晶振匹配电容统计不良率判断批次问题7.2 读保护和代码防抄该设置就设置如果你在做商用产品一定要养成发布固件时顺手设置读保护的习惯。STM32的RDPRead Protection分为Level 0无保护、Level 1禁止通过调试接口读Flash、Level 2永久保护不可回退。Level 1在量产时够用烧录完成后再设置日常也能通过ICP接口擦除重新烧录。Level 2则谨慎使用设置了烧录器就再也无法连接芯片了相当于彻底锁死只适合不需要返修的产品。设置读保护时有一个坑很多人在烧录时只在IDE里勾了Erase Full Chip没有单独去设置RDP结果固件被轻易读走。建议在量产烧录流程里把设置读保护做进烧录脚本里命令烧完之后自动设置这样产线上不可能忘记。7.3 一个典型排查实例新做的板子ST-Link突然连不上我自己遇到过一种情况画了一块新板子芯片用STM32F103C8T6第一次用ST-Link连也没问题烧了程序后能跑。然后我改了程序里一个GPIO初始化把之前没接的PB3/PB4拉高了再想下载却发现连接失败。花了大概一小时排查最后想起PB3和PB4分别是JTDO和NJTRST引脚——也就是JTAG口。我的程序初始化把这两个脚配成了普通输出JTAG接口被禁用SWD功能也一起被关了。解决路子很简单按住复位键让芯片不执行用户代码调试器趁机连上立即重烧一个不占用这些引脚的固件。这个案例特别典型强烈建议所有新手记住按住复位连接这招。它是STM32论坛上被问烂的问题却依然每天有人在踩。8. 再聊两点生产实践中的体会8.1 烧录测试点设计要趁早如果你在设计PCB一定在原理图阶段就把烧录接口规划好。SWD的4个信号SWDIO、SWCLK、GND、3.3V最好引出到一个4针的座子或至少做成测试焊盘。很多产品为了节省空间不留调试口结果开发阶段每烧一次程序都要飞线痛不欲生还容易因为飞线接触不良烧坏IO。更麻烦的是有些板子采用了屏蔽壳或者贴片电池覆盖调试焊盘位置后期想加测试点都加不了。我一般遵循的原则是调试口放在板边方向朝外方便探针/杜邦线夹持。串口ISP的话把TX/RX/GND留测试点即可有机会的话还是优先SWD。预留一个电阻位连接SWDIO到MCU这样量产时可以贴0欧电阻开发阶段可以拆掉电阻隔离干扰。如果板上有多个MCU尽量把每个MCU的调试口都引出来别共用一组否则量产测试和产线诊断时互相打架。8.2 烧录是基础功也是产品质量的第一道门芯片烧录乍一看是一件低级工作但仔细想想产品出厂后的第一道可靠性关口就在这里。烧录不良带来的售后成本往往很高板子没程序客户收到不能用、固件版本混淆导致功能异常、读保护没设程序被破解量产……每一个都能让产品口碑归零。反过来烧录方案设计得好产线效率和产品可维护性都会明显提升。所以我的建议是不管你是纯软件还是硬件出身把这三种烧录方式吃透对你的职业发展都很有帮助。尤其是IAP/OTA几乎是现在所有智能硬件的标配能力会这个和不会这个做出来的产品在运营层面的差距很大。最后分享一个我常用的习惯每接触一款新芯片第一件事就是翻它的Reference Manual里的Memory和System Memory / Boot mode章节搞清楚它的启动模式、Flash扇区布局、出厂Bootloader支持哪些接口。只要这几点摸清后面无论是ISP、ICP还是IAP都能一通百通。芯片型号千千万原理骨架不变剩下的都是具体寄存器配置而已。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进