news 2026/9/29 9:24:37

芯片烧录详解:ISP、ICP、IAP三种方式原理与实操区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
芯片烧录详解:ISP、ICP、IAP三种方式原理与实操区别

芯片烧录、ISP、ICP、IAP,这几个词做嵌入式的几乎天天碰见,但真要把它们的区别讲清楚,不少干了几年的工程师也会一时语塞。同样是往芯片里写程序,为什么有的要断电再上电,有的拿两根线点一下就行,还有的能让板子自己在线上升级?这篇文章就把这三条路一条条掰开揉碎了讲,目标只有一个:让新手读完既能明白烧录背后的原理,也能在自己的板子上把 ISP、ICP、IAP 各自跑通。

这套东西能解决什么问题?说白了就三件事:一是搞清楚程序到底是怎么进芯片的,二是排查“为什么写不进去、写进去又不跑”这类经典问题,三是研发、量产、现场升级不同阶段该选哪种烧录方案。适合刚开始折腾 STM32、STC、GD32 等单片机的同学,也适合想补一补底层原理的工程师。文中还会顺带解释一个特别容易踩的坑——烧录里的 ISP 和图像处理里的 ISP 完全不是一回事,别被同名缩写带偏了。

1. 烧录到底在干什么:先把底图画出来

1.1 编译、烧录、运行:加电之后发生了什么

很多人一开始会混淆“编译”和“烧录”。写代码只是第一步,Keil、IAR、GCC 这类编译器负责把 C 语言翻译成目标芯片能执行的机器码,生成的文件常见是 HEX 或 BIN。但翻译完的文件只是躺在电脑硬盘里,芯片并不知道你的代码是什么。

烧录干的活,就是把这些机器码按固定格式搬运到芯片内部的 Flash 存储器里。芯片上电复位后,硬件会自动从复位向量指向的地址取第一条指令,然后开始跑你的程序。你可以把烧录想象成给一张光盘刻数据,刻录机把内容写进盘片,之后播放器一放就能读出来。编译解决的是“翻译”,烧录解决的是“搬运”,运行解决的是“执行”,这三步是严格分开的。

我见过不少新手调程序,发现“我代码改了,为什么板子还是不跑新功能”,最后发现根本没重新烧录,或者烧录到一半失败了。所以先把这条链路刻在脑子里:改代码 → 编译通过 → 烧录进 Flash → 复位运行,缺一步后面全白搭。

1.2 烧录写入的是一堆 0 和 1,但操作远不是“复制粘贴”

说到写入 Flash,这里有个很反直觉的点:Flash 不能像硬盘那样随便覆盖写。Flash 的物理特性决定了它只能按扇区擦除、按页写。擦除操作会把整个扇区变成全 1,写操作则是把需要的位写成 0。所以烧录器/下载脚本的底层逻辑永远是“先擦后写”,擦掉的扇区里不管是旧程序还是数据,全部消失。

你可以把 Flash 想成一块白板:擦除就是擦干净整面墙,写字只能往白墙上填墨。你没法在不擦掉旧字的情况下直接在某个角落覆盖新字,因为写操作只能“1 变 0”,不能“0 变 1”。

这也是为什么烧录过程中最怕掉电、断电、电压跌落。如果写到一半 Flash 供电异常,轻则校验失败,重则整扇区数据错乱,芯片启动直接进硬件错误。所以正规量产烧录器都有独立的电源检测和电压监控,开发用的下载器就没有那么严格,这也是“开发没事、量产翻车”的常见原因之一。

1.3 ISP、ICP、IAP 各自的“据点”不一样

三种烧录方式最本质的区别,是“谁来执行写入 Flash 这个动作”。

  • ISP(In-System Programming,在系统编程):芯片出厂时自带一段固化在 ROM/系统存储区的小程序,通常叫 ISP Bootloader。你通过串口、USB、SPI 等接口跟它通信,让它帮你把固件写进用户 Flash。它相当于物业配的备用钥匙。
  • ICP(In-Circuit Programming,在电路编程):不用芯片里任何程序,直接用外部的调试器(ST-Link、J-Link、DAP-Link 等)通过 SWD 或 JTAG 线“绕开大门”,访问芯片内部的调试端口(DAP),再操作 Flash 控制器。这相当于你有正门钥匙,直接开锁进屋。
  • IAP(In-Application Programming,在应用编程):芯片里跑的应用程序自己擦写自己的 Flash 区域。通常拆成 Bootloader 和 App 两个区,Bootloader 负责接收新固件、写入 App 区,然后跳转过去运行。这就相当于你在屋里装了智能锁,自己给自己换锁芯。

理解了这三个“据点”,后面所有操作细节都是围绕它们展开的。

2. ISP、ICP、IAP 到底是什么:逐个拆开讲

2.1 ISP:借芯片出厂自带的小管家来写程序

ISP 的原理并不复杂:芯片上电后,硬件会根据启动配置决定从哪里执行。如果进了 ISP Bootloader,这段小程序会初始化串口(或 USB 等接口),等待上位机发来握手命令,然后接收固件数据,调用片内 Flash 驱动函数,把数据写到指定地址。

以 STC 系列为例,STC 的 ISP 下载有个非常鲜明的特点:冷启动。下载软件 STC-ISP 点“下载/编程”后,要手动给板子断电再上电,这个动作是为了让芯片在上电瞬间检测到串口上有下载请求,同时检查某个特定引脚的电平状态,满足条件才进入 ISP 模式。STC 官方下载软件的弹窗比较多,比如烧录完成弹广告、升级提示等,可以在设置里找找相关选项关闭,实在关不掉就用旧版本或者绿色版,这个很多老工程师都干过。

STM32 也内置了 ISP 功能。F1 系列里把 BOOT0 拉高、BOOT1 拉低,复位后芯片就会从系统存储器启动,进入出厂 Bootloader,然后可以通过 USART1 口接收固件。用 STM32CubeProgrammer 的 UART 模式连接,就能完成下载。

ISP 的优点是省钱:只要板子上留了串口,不需要任何调试器,一条 USB 转 TTL 线就够。缺点是速度相对慢,而且对通信要求高,波特率太高、线太长、干扰大都会失败。我实测下来,普通串口 ISP 下载一个几十 KB 的固件通常要几秒到十几秒,调试器的 SWD 模式往往一秒内搞定。所以 ISP 适合前期验证、现场维护、以及产线上没有调试口只有串口的工装。

2.2 ICP:调试器直接接管 Flash,想写就写

ICP 是研发阶段用得最多的方式。它的硬件基础是 SWD(Serial Wire Debug)或 JTAG。SWD 只需要 SWDIO、SWCLK 两根线加 GND,非常适合空间紧张的小板子;JTAG 引脚多、速度上限高,在一些复杂芯片上更常用。调试器通过这几根线访问芯片的调试访问端口(DAP),再通过内存访问端口(MEM-AP)去操作 Flash 控制器,整个过程完全不需要芯片里跑任何程序。

所以 ICP 有个很关键的优势:哪怕芯片里的程序已经完全跑飞、死机、看门狗疯狂复位,只要调试口没被禁用,你依然能连上并重新烧录。这也是“板子变砖了救不回来”的兜底手段。

使用 ST-Link + STM32 时,接线一般就是 3.3V、SWDIO、SWCLK、GND,复位线可选。Keil 里点一下“Download”,或者用 STM32CubeProgrammer 的 ST-Link 模式,就能完成擦除、编程、校验。命令行方式也很适合产测脚本:

STM32_Programmer_CLI -c port=SWD mode=HOTPLUG -w firmware.hex -v -rst

这条命令的意思是:用 SWD 连接,写入 firmware.hex,校验,然后复位运行。

ICP 的坑也值得说。最常见的是“No target found”,原因有几种:目标板没供电、接线顺序错、SWDIO/SWCLK 被复用成了 GPIO 或用于其他功能、板子处于低功耗模式、调试器驱动不对。排查思路是先用万用表量电压,再把线剪短,最后查代码里有没有在系统初始化时把 SWD 引脚重新配置。很多国产芯片兼容 STM32 的引脚,但调试口默认配置可能不一样,最好看参考手册确认。

2.3 IAP:程序自己给自己升级,像手机 OTA 一样

IAP 和前面两种有本质区别:它不再依赖外部的电脑、调试器、串口线(虽然数据通道可以是这些),而是要求芯片里已经有一个“引导程序”在跑。这个引导程序就是 Bootloader。

典型布局:Bootloader 放在 Flash 起始地址,比如 0x08000000 占 16KB;App 从 0x08004000 开始占后面区域。上电后芯片先执行 Bootloader,Bootloader 可以马上跳转到 App(这是“正常启动模式”),也可以等待串口/网络/无线数据,收到新固件包后先擦除 App 区,再逐页写入,全部写完并校验通过,再跳转到 App。这样产品发到客户手上,只需要提供一份固件文件和一个升级指令,就能远程更新功能,和手机 OTA 升级是一个逻辑。

实现 IAP 需要芯片的 Flash 支持在程序运行的同时擦写非当前执行区域的 Flash。这个绝大多数 MCU 都支持,因为 Bootloader 和 App 在同一颗 Flash 的不同扇区,处理器在 Bootloader 里执行指令时,可以去擦写 App 所在的扇区。

IAP 带来的最大收益是“可远程升级”,省去了召回、返厂、上门烧录的成本。代价是你要多写一套 Bootloader,处理通信协议、分包、校验、超时、跳转,以及启动后的代码分区,难度和代码量都不小。我见过很多团队图省事,直接把 App 的起始地址不改、中断向量表不偏移,结果升级之后一进中断就死机,这就是没有真正理解 IAP 的底层机制。

2.4 一张表看清 ISP、ICP、IAP 的核心区别

对比项ISPICPIAP
谁来执行烧写芯片出厂固化的 Bootloader外部调试器直接控制 Flash 控制器用户自己写的 Bootloader / App 代码
使用的接口串口、USB、SPI 等通信接口SWD、JTAG 调试接口可以是串口、USB、网络、无线等任意通道
是否需要专用设备只需要 USB 转串口等低成本模块必须要有 ST-Link、J-Link 等调试器不需要额外硬件,用产品自身主控即可
能否在线调试不能可以,烧录后直接打断点调试不能直接调试 App,但 Bootloader 里可以加日志
典型应用场景低成本产线烧录、现场维护研发调试、产线在线烧录、救砖产品现场远程升级、设备维护
对芯片的额外要求出厂必须自带 ISP Bootloader有调试接口且未禁用用户 Flash 支持分区,芯片能从 App 区启动

这张表建议收藏。面试时候被问“ISP、ICP、IAP 有什么区别”,照着这张表的思路答,基本就能把面试官讲服。

3. 把三种方式实际跑一遍:操作流程与关键细节

3.1 串口 ISP 实操:以 STC 冷启动下载为例

STC 的 ISP 下载非常经典,也最容易踩坑。完整流程大概是这样的:

第一步,准备 USB 转 TTL 模块,接好 GND、TX、RX。注意交叉连接:模块 TX 接芯片 RX,模块 RX 接芯片 TX。第二步,打开 STC-ISP 软件,选择芯片型号,选择串口号,加载 HEX 文件,波特率可以先默认 115200 或更低。第三步,勾选“每次下载前重新连接目标芯片”之类的选项。第四步,点“下载/编程”,软件进入等待状态,这时候给板子断电,再重新上电。如果是调试助手自动控制电源的板子,可以省掉手动断电的麻烦。

很多人卡在“为什么点了下载没反应”,其实原因特别简单:没有在点下载之后给目标板重新上电。STC 的握手机制依赖于“冷启动”,也就是检测电源从无到有的上升沿,在上升沿附近去探测串口数据。如果你一直上着电点下载,芯片已经跳过 ISP 检测开始跑用户程序了,自然收不到你的请求。所以正确的姿势是先点下载、再上电,顺序不能反。

STC-ISP 软件的弹窗和广告确实让人头疼。新版本经常会弹“更新提示”“推荐下载”之类的浮窗,干扰产线操作。有几种土办法:第一,在软件设置里关掉所有“提示”“检测更新”选项;第二,用便携版或免安装版;第三,批量烧录时用脚本化工具替代手工点按钮。产线上我见过有人写了一个自动检测串口、自动触发冷启动的工装,配合 STC 官方命令行或第三方工具,效率能提高不少,这算是 ISP 烧录进阶玩法了。

STM32 的串口 ISP 过程类似,区别在于要用 BOOT0 引脚选择启动模式。把 BOOT0 拉高、BOOT1 拉低,复位后芯片进入系统存储器 Bootloader,然后用 STM32CubeProgrammer 的 UART 模式连接指定串口就能下载。下载完成后记得把 BOOT0 跳线复位低,否则下次上电又进 Bootloader 了,App 不启动。这个“烧完不跑”的问题,十有八九是 BOOT 引脚没恢复。

3.2 ICP 实操:以 STM32 + ST-Link 为例

ICP 是研发阶段效率最高的烧录方式,接线一次调试口,调试下载两不误。标准接法如下:

  • SWDIO → 芯片 PA13
  • SWCLK → 芯片 PA14
  • GND → 共地,这个绝不能少
  • 3.3V → 给目标板供电(可选,取决于你的板子是否独立供电)

连接好之后,在 STM32CubeProgrammer 左侧选择“ST-LINK”,点击 Connect,软件会读出芯片信息,包括器件型号、Flash 大小、读保护状态。然后选择固件文件,点下载即可。下载完成后点击 Reset Run,芯片立即运行。

如果用的是 Keil,把 Debug 选项里调试器选成 ST-Link,再在 Utilities 设置里勾选 Reset and Run,每次编译后 Ctrl+F5 就能直接下载并运行。日常开发效率极高。

ICP 最常见的问题是连接失败。我遇到过这么几个典型场景:一是板子供电不足,ST-Link 的 3.3V 输出能力很弱(一般几十 mA 级别),带不动带屏带传感器的板子,要外接电源;二是线太长,SWD 信号高电平驱动能力有限,夏天实验室里一米多的杜邦线乱飞,信号反射严重,把线剪到 20cm 以内问题立刻消失;三是复位电路影响,有些板子复位引脚外接大电容,调试器连不上,可以试试把复位线也接上,或者手动按住复位键再点连接,连接成功瞬间再松手。

还有一类问题是代码把 SWD 引脚复用掉了。比如某些低功耗工程会关闭调试口来省电,或者把这几个引脚配成普通 GPIO。一旦锁死后调试器连不上,唯一的救法是先拉低复位引脚并保持,再使用调试器的“Connect under reset”模式。J-Link 和 ST-Link 都支持这种模式,本质就是在复位期间抢先连上 DAP,再在复位释放前把 Flash 擦掉。

3.3 IAP 实操:Bootloader + App 双区工程的坑与设计

IAP 的实现,核心是系统里同时存在 Bootloader 和 App 两份固件,并且通过跳转完成交接。

以一个 STM32F103 为例,假设 Flash 起始 0x08000000,总共 64KB,Bootloader 占前半段 16KB(0x08000000~0x08003FFF),App 占后半段 48KB(0x08004000~0x0800FFFF)。App 工程里需要改两处:一是链接脚本/分散加载文件的 Flash 起始地址改成 0x08004000,二是中断向量表偏移量改成 0x4000。STM32 上可以用 SCB->VTOR 设置偏移,启用代码类似:

#define APP_BASE 0x08004000 void app_init(void) { SCB->VTOR = APP_BASE; /* 重新初始化栈指针和堆,这里仅为示意 */ }

如果用的是标准库早期版本,需要打开 system_stm32f10x.c 里VECT_TAB_OFFSET宏,把偏移值直接写进去。这都是老掉牙的坑了,但至今仍有一批批人在这里翻车——App 能启动但一进中断就跑飞,几乎都是 VTOR 没设置好。

Bootloader 接收固件时,按包接收、按扇区写入。流程大概是:Bootloader 初始化串口 → 启动后等待 1~3 秒,看主机是否发升级握手帧 → 没收到则直接跳转 App → 收到则开始接收固件包,接收完一包写一包 → 全部写完对整个 App 区做 CRC 校验 → 校验通过跳转,失败则重新接收或保留旧版本。

跳转代码是 IAP 里最容易出错的地方,直接附上核心跳转函数:

typedef void (*pFunction)(void); void jump_to_app(uint32_t app_addr) { uint32_t app_msp; pFunction app_reset; __disable_irq(); /* 关闭全局中断 */ /* 恢复外设状态:关闭滴答定时器、复位时钟、停 DMA 等 */ SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; /* 取 App 复位向量表的初始栈顶和复位函数地址 */ app_msp = *(volatile uint32_t *)app_addr; app_reset = (pFunction)(*(volatile uint32_t *)(app_addr + 4)); SCB->VTOR = app_addr; /* 切换中断向量表 */ __set_MSP(app_msp); /* 设置主栈指针 */ app_reset(); /* 跳转过去执行 */ }

为什么跳转前要关中断、关外设、重新设栈?因为 Bootloader 初始化过的外设(比如串口、定时器、DMA)在 App 里是未知状态,如果跳转时还开着中断,App 初始化到一半一个中断打进来,向量表指向新 App 的中断处理函数,但该外设还没初始化,直接进硬件错误。所以跳转要像交接仪式一样,先停掉自己手头的所有工作,再交钥匙。

GD32F103 的 IAP 思路和 STM32 几乎一致,只是厂商库和地址映射略有差异,读一遍数据手册的Memory map就能改过来。HC32L136 这类国产 MCU 也都有官方 IAP 例程,基本都是“Bootloader + App + 串口升级协议”这套。至于 STM32H750VBT6 这种 H7 系列,IAP 多了一个坑:主 Flash 扇区小、还有缓存和 ECC 问题,升级时要先处理 Cache 失效,否则擦写后读到的是旧缓存数据,编译怪问题。

3.4 一个经典疑问:Bootloader 里定义的变量复位后到底还在不在

这个问题是很多做 IAP 的人踩过坑之后才会认真去查的:Bootloader 里定义的全局变量,在跳转到 App 之后,值还能不能继续用?这要分两种情况讨论。

第一种情况,Bootloader 不执行系统复位,直接通过函数指针跳转到 App。这时 RAM 里的内容物理上还在,Bootloader 的变量值表面上“还在”。但 App 的启动代码会立刻执行__main/Reset_Handler,把 .data 段重新装载一遍、把 .bss 段清零。Bootloader 的程序段和全局变量很可能正处于 App 的 .data/.bss 区域内,App 一启动就把它们覆盖了。所以这种跳转方式下,Bootloader 的变量在 App 里没有保留意义,也不应该去访问。

第二种情况,Bootloader 完成写 Flash 后执行系统复位,比如NVIC_SystemReset(),让芯片像冷启动一样从 Bootloader 重新跑。这种情况下,Bootloader 里所有普通全局变量都会回到初始值,因为 C 运行时初始化会把 .data 段恢复为初值、.bss 清零。想“复位后仍然保留”的数据,必须放到不复位清零的存储区。

解决方案有几个。最常用的是 RO/RW 保留段,比如在 Keil 里用__attribute__((section(".noinit"), used))定义变量,这个段在启动时不会被初始化。也可以用 RTC 后备寄存器,只要 VBAT 有电,复位后数据还在。还有一个思路是把关键标志写进 Flash 的专门扇区,缺点是有擦写寿命限制,要自己做磨损平衡。

/* 放在 noinit 段,复位后值不清零 */ __attribute__((section(".noinit"), used)) volatile uint32_t boot_flag;

很多人做“升级标志”的时候就靠这个:Bootloader 判断 boot_flag 的值,如果是 0xA5A5,说明是刚升级完复位,就直接跳 App;否则说明是冷启动,就等几秒串口握手。这个技巧在 IAP 设计里非常实用,避免每次开机都白白等升级窗口。

4. 常见问题与避坑实录

4.1 烧录失败的几个高频原因速查

现象常见原因处理办法
串口 ISP 一直没反应没有在点击下载后重新上电点完下载再给板子冷启动,注意顺序
串口 ISP 握手成功但中途失败波特率太高、线太长、供电不稳降低波特率到 9600/19200,换短粗杜邦线
No target found / 连接失败接线错、没供电、SWD 被复用量电压、查线序、用 connect under reset
下载成功但不运行BOOT 引脚没恢复、启动地址错检查 BOOT0/BOOT1 跳线、检查 VTOR 和烧录地址
Verify 校验失败Flash 读保护、电压跌落、芯片加密解除读保护(会擦除全片)、检查电源
烧录时反复复位板上有看门狗且目标程序还在跑先进 Bootloader 模式再烧录,或断开复位期间
直接点击下载蓝屏/死机串口驱动冲突、USB 口供电不足换原生 USB 口、更新 CH340 等驱动

整理这些问题是希望各位明白:烧录失败九成是“环境问题”,不是芯片坏了。别一失败就怀疑芯片,先量电、查线、换串口、降波特率,一步一步来。

4.2 量产烧录:研发玩得转,产线不一定行

研发阶段随便用 ST-Link 下载没问题,但量产烧录要考虑效率和一致性。

大批量生产通常分两条路线。第一条是“先烧后贴”:用离线烧录器(比如专用编程器)把固件预先写入一片片芯片,然后再上贴片机。这种方案适合固件成熟、版本不变的产品,烧录器一次可以放几十颗芯片并行写入,效率很高。第二条是“贴后在线烧”:PCBA 完成贴片后,用产测工装的探针压到 SWD 或串口焊盘上在线烧录,烧完顺便做功能测试、写入序列号。这种方案适合固件还要微调、或者需要写入烧录日期、SN 码的场景。

量产烧录最需要注意的是固件文件的校验。HEX/BIN 文件在拷贝、传输过程中也有损坏的可能,产线上批量烧录前最好计算一遍 CRC32 或 MD5,和原始构建机核对一致再导入烧录器。另外很多烧录器支持脚本化操作,可以自动写入产品的唯一序列号到 Flash 的固定地址,App 启动时读取,这样每台设备都有独立身份,后面做远程运维和故障追踪都方便。

我见过一个反面案例:产品发出去几千台,突然发现有一部分设备串号全是 0,查了半天是产线上烧录器配置文件里没勾选“写入 UID”的选项,只有第一批老员工手动操作时写了,后面换人没注意配置就被覆盖了。所以量产工程文件一定要版本化管理,每次变更都走评审和试烧确认。

4.3 国产 MCU 的 ISP/IAP 方案差异

现在国产 MCU 用得越来越多,烧录方式基本是跟着 ARM 内核模板走的,但细节差异要注意。

GD32F103 的 IAP 与 STM32F103 几乎兼容,直接移植工程通常问题不大。要注意 Flash 扇区大小和地址映射可能和 ST 标称值不完全一致,用库函数擦写一般没事,如果用寄存器操作就必须对着 GD 的数据手册核对。GD 和 ST 的 Flash 等待周期、选项字节设置也有些区别,新品看GD32F10x User Guide里的 Flash 章节。

HC32L136 是华大半导体(现在叫小华)的 M0+ 内核芯片,官方提供的 IAP 例程一般基于串口通信,协议很清晰。这种国产芯片有个特点:出厂 Bootloader 或调试口的配置可能不是默认开放,比如需要先通过选项字节使能 SWD,或者 ISP 模式进入方式比较特殊。所以拿到新芯片第一步不是写代码,而是把用户手册的“启动配置”“选项字节”“系统存储区”这几章看完。

STC 的 IAP 型芯片(带 IAP 字样的型号)设计思路又不一样,它出厂时已经有一段 ISP 引导程序,但用户可以在自己的程序里调用库函数擦写另一个区域的数据 Flash,实现类似 IAP 的功能。这类芯片没有 ARM 的向量表偏移机制,跳转方式依赖编译器扩展和指针函数,STC 官方例程是很好的参考。

总的来说,换一颗新芯片做 IAP,先做三件事:确认 Flash 分区和扇区大小、确认中断向量表切换方式、确认烧录/调试口的默认状态。这三件事做明白,剩下就是体力活。

4.4 我的一些实操建议

这么多年下来,关于烧录我攒了几条经验,不一定都写在数据手册里,但对实际干活很有帮助。

开发板设计时,SWD 和串口两套烧录口都留出来。SWD 用来调试,串口用来备用和做 IAP 通道。引脚引出到排针或测试点上,量产的板子哪怕空间紧张,也至少要留 SWD 的 4 个过孔,不然出问题没法治具烧录。

IAP 升级必须带 CRC 校验、版本号判断和断电保护。收到的新固件先算一遍校验,写入过程中如果断电,Bootloader 再次启动时发现 App 区校验不对,就自动保持等待升级状态,而不是傻乎乎去跑一个半截程序。这种“双保险”设计能让升级失败时设备仍然有救。

烧录工具链尽量脚本化。不管是 CubeProgrammer 的命令行、J-Link 的 Commander,还是 STC 的自动化工具,都用脚本来做批量操作。手工点按钮这件事,人不是每次都可靠,脚本才是。

最后,不要轻易去“解锁”读保护。STM32 的 RDP 一旦从 Level 1 往 Level 0 回退,会强制全片擦除,Flash 里所有数据直接清空。很多人忘了这茬,想读一下芯片保护状态,结果把固件读没了。

5. 千万别把两个 ISP 搞混:烧录界的 ISP 和图像界的 ISP

5.1 图像处理领域的 ISP 到底是什么

这句话说出来可能有点绕,但确实有一大批人被同一个缩写搞晕过:在嵌入式、安防、摄像头领域,ISP 通常指 Image Signal Processor,图像信号处理器,跟芯片烧录里的 ISP 完全不是一回事。

图像处理领域的 ISP 是一条完整的数据流水线,行业内叫 ISP Pipeline。摄像头传感器(Sensor)输出的原始 RAW 数据,是一排排只有单色信息的 Bayer 图案,非常“生”。ISP 要依次完成黑电平校正(BLC)、镜头阴影校正(LSC)、坏点校正(DPC)、去马赛克(Demosaic)、白平衡(AWB)、降噪(NR)、色彩校正(CCM)、Gamma 校正、锐化、色调映射等一堆处理,最终输出人眼看着正常的 YUV 或 RGB 图像。

国内做监控、行车记录仪、AI 摄像头的公司里,ISP 是一个专门岗位,优化图像效果的核心是调 3A(自动曝光、自动白平衡、自动对焦)和各种降噪参数的平衡。热搜词里的“富瀚ISP”,指的就是富瀚微这类提供 ISP 芯片/方案的厂商。如果你面试时说的“做过 ISP”是烧录固件,对面面试官可能以为你懂的是图像信号处理,务必先交代清楚语境,否则很容易造成误会。

5.2 FPGA 的 ISP 和 MCU 的 ISP 也不是一回事

FPGA 圈子里也有人会说到“ISP”,含义更偏向“在系统可编程”。FPGA 通常没有内部 Flash,配置数据一般存在外部 SPI Flash 里,上电后由 FPGA 主动读出来加载。往这个外部 Flash 写配置数据的方式有几种:JTAG、AS、PS 模式,其中有的方式需要借助 FPGA 内部逻辑做“桥接”,把上位机发来的数据转发给 SPI Flash,然后把配置数据固化下来。很多人把这个过程也叫 ISP,但其实和 MCU 的ISP Bootloader机制完全不同。

如果你去搜“FPGA ISP”,可能看到两类内容:一类是 FPGA 做图像 ISP Pipeline,也就是拿 FPGA 去实现图像处理算法,这是高速视觉领域很热的方向;另一类是 FPGA 的在系统配置,讨论的是配置方式和下载流程。这两种差异很大,搜资料时看清楚上下文。

顺带提一个同样容易混淆的缩写:ICP。点云处理领域有一个经典配准算法叫 ICP(Iterative Closest Point,迭代最近点),是三维重建、激光雷达领域做的“点云对齐”算法,和烧录的 ICP(In-Circuit Programming)没有任何关系。搜索引擎不会帮你区分这些,自己去判断技术文章所属的领域,是嵌入式工程师的基本素养。

就我个人经验来说,烧录这件事的技术门槛其实不高,但细节密度极其高。一个成熟的嵌入式工程师,往往不是“会下载程序”,而是能把 ISP、ICP、IAP 三种方式在合适场景下用对,遇到连接不上、校验失败、跳转死机这些问题时不慌,能顺着原理一步步排查。如果你能把 STM32 的 ICP 调试、STC 的 ISP 冷启动、自定义的 IAP 跳转都亲手完整跑通一遍,那对底层硬件运作的理解就会上一个台阶,后面做 bootloader、做固件升级、做量产工具都会顺手很多。最后再留个小建议:给每块开发板都贴上标签写上烧录方式和串口号,别问我是怎么知道的,新一代工程师也该长个记性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 9:23:03

YOLOv5目标检测全解析:从网络结构到TensorRT部署实战

我记起来做目标检测那阵子,最焦头烂额的阶段不是调参,而是数据标到凌晨三点发现标错了一百多张图。后来项目上了 YOLOv5,流程图和结构图在我脑子里过了无数遍,踩过的坑也一个没落下。这篇就跟大家从原理拆到实战,把 YO…

作者头像 李华
网站建设 2026/9/29 9:23:00

PyTorch模型端侧优化四层漏斗工作流实战

1. 项目概述:这不是一个“一键压缩”的玩具,而是一套面向真实推理场景的模型瘦身工作流“Model-Optimizer”这个名字听起来像某个商业软件的宣传页标题,但在我过去三年深度参与十几个边缘AI部署项目的实操经验里,它从来不是点几下…

作者头像 李华
网站建设 2026/9/29 9:16:58

干货分享 | 手把手教你配置TSMaster软件网关,3分钟轻松上手!

随着工业自动化和信息化的快速发展,不同系统之间需要高效、灵活地进行数据交互与通信。然而,各系统往往采用不同的通信协议和报文格式,导致数据传输存在兼容性问题。软件网关应运而生,它通过图形界面配置、零代码开发的方式&#…

作者头像 李华