ARM 代码烧录方案与原理详解 --- SWD/JTAG + Bootloader + OTA (ICP + ISP + IAP)

本文详细介绍了ARM MCU的代码烧录方式,包括ICP(在电路编程)、ISP(在系统编程)和IAP(在应用编程)。讲解了JTAG和SWD接口的区别,以及STM32的Bootloader和OTA空中升级原理。此外,还探讨了Bootloader如何通过UART和USB接口实现代码烧录,以及如何通过IAP实现在系统运行过程中更新代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我们常见的MCU / CPU 代码烧录方式主要有以下三种:

  • ICP(In Circuit Programing):在电路编程,可通过CPU的Debug Access Port 烧录代码,比如ARM Cortex的Debug Interface主要是SWD(Serial Wire Debug)或JTAG(Joint Test Action Group);
  • ISP(In System Programing):在系统编程,可借助MCU厂商预置的Bootloader 实现通过板载UART或USB接口烧录代码,比如STM32存储映射Code分区中的System memory可以预置厂商的Bootloader,让MCU支持通过UART下载(不限于UART,具体由厂商预置Bootloader实现而定);
  • IAP(In Applicating Programing):在应用编程,由开发者实现Bootloader功能,比如STM32存储映射Code分区中的Flash本是存储用户应用程序的区间(上电从此处执行用户代码),开发者可以将自己实现的Bootloader存放到Flash区间,MCU上电启动先执行用户的Bootloader代码,该代码可为用户应用程序的下载、校验、增量/补丁更新、升级、恢复等提供支持,如果用户代码提供了网络访问功能,IAP 还能通过无线网络下载更新代码,实现OTA空中升级功能。

一、ICP 与 JTAG / SWD

ICP 主要通过CPU的DAP(Debug Access Port) 烧录代码,下面以ARM Cortex-M3/M4 为例,展示Debug Interface 如下:
Cortex-M3/M4 Debug Interface
ARM Cortex 内部包含了CoreSight 调试架构,CoreSight 包括调试接口协议、调试总线协议、对调试组件的控制、安全特性、跟踪接口等。以前的ARM 处理器都提供JTAG 接口,通过它来控制对寄存器和存储器的访问,CoreSight 则通过DAP(Debug Access Port) 来控制处理器上的总线逻辑。从上图也可以看出,CoreSight 除了提供Debug Interface,还提供了Trace Interface,Trace Interface 主要用来观察数据中间值的变化、跟踪指令的执行状态等,只能单向读取跟踪数据,属于非侵入式调试,不能用于烧录代码,因此本文不对此做过多介绍。

ARM Cortex 目前支持两种Debug Interface:

  • SW-DP (Serial Wire - Debug Port):新提供的串行线调试接口SWD,只需要两条信号线(SWCLK、SWDIO);
  • JTAG-DP (Joint Test Action Group - Debug Port):广为使用的联合调试接口JTAG,至少需要四根信号线(JTCK、JTMS、JTDI、JTDO,JTRST 为可选信号线);
  • SWJ-DP (SW + JTAG - DP):支持SW-DP 与 JTAG-DP 两种接口协议。

STM32 同时支持SW-DP 和 JTAG-DP,也即支持的是SWJ-DP 调试接口协议,STM32-L4 的SWJ Debug Port 如下图所示:
SWJ-DP结构框图
从上图中可以看出,JTAG-DP 与SW-DP 两个接口都需要提供Clock 驱动信号,二者的数据传输引脚不同,SW-DP 接口使用半双工的SWDIO 引脚传输数据,JTAG-DP 接口使用两个单工的JTDI 和JTDO 引脚组成全双工通信。JTAP-DP 除了时钟引脚和数据传输引脚外,还有个重要的引脚JTMS 测试模式选择引脚,可以控制TAP(Test Access Port) 状态机的切换,JTRST 主要用来对TAP 状态机进行复位,为可选引脚(因此有四线JTAG 与五线JTAG 之分),JTMS 也可以实现TAP 状态机的复位。JTAG-DP 与SW-DP 引脚的功能描述如下:
JTAG与SWD 引脚定义
早期的MCU 是可插拔的,向其内烧录代码时常需要将其拔下来,借助烧录器或仿真调试器通过Debug Interface 将代码烧录进MCU 后,再把芯片插回到电路板上。后来MCU 直接焊接在电路板上,电路板上直接引出了Debug Interface,比如常见的JTAG 和 SWD 接口,可以借助JLINK 或 STLINK 等仿真器,通过JTAG 或 SWD 接口直接将代码烧录到MCU 中,省去了MCU 插拔操作,方便了代码烧录和调试操作。

不同的IC 厂家会自己定义自家产品专属的JTAG 接口,来下载和调试程序。嵌入式系统中常用的有20pin、14pin、10pin 等JTAG 接口类型,不同类型的JTAG 接口都包含前面提到的五个引脚,另外包括VRef 和 GND 等引脚,它们的不同之处主要在于GND引脚的数量、一些用户自定义引脚、保留引脚等。一般JTAG 接口同时支持 SWD 接口,但有些主板受空间限制,只提供了SWD 接口,只需要四个引脚,大大节约了空间。
JTAG与SWD 20pin接口有效引脚
IC 厂家提供的部分开发板上直接集成了 JLINK 或STLINK 模块,相当于将JLINK / STLINK 仿真器内置到开发板上了(比如STM32L4 Pandora 或 NRF52 DK),不再需要额外的仿真器(也不再需要板载JTAG 或 SWD 接口),直接通过USB 线连接电脑,就可以方便的进行代码烧录和调试,对于手头没有仿真器的开发者更加友好,毕竟正版仿真调试器价格还是有点贵的。

二、ISP 与 Boot Mode

ISP 可以通过USB接口(可以是UART协议或USB协议等)直接烧录代码,ARM Cortex 提供的Debug Interface 并不支持UART 或USB 协议,这就需要IC 厂商预置UART 协议或USB 协议代码,让MCU / CPU 支持UART 通讯或USB 通讯。UART 协议比较简单、传输速率比较低,比如STM32 这类MCU 支持UART 协议烧录代码;USB 协议相对复杂、传输速率比较高,比如高通骁龙这类CPU 支持USB 协议烧录代码。

以STM32 为例,先看看有哪些启动模式:
STM32 Boot Modes
STM32 有三种Boot modes 开始执行代码:

  • Main Flash memory:STM32内置的Flash,一般我们使用JTAG / SWD 烧录代码都是直接烧录到这个存储区间,重启后也直接从这里的代码开始执行;
  • System memory:这种模式启动的程序功能是由厂家设置的,STM32 在出厂时由ST 在这个存储区间内部预置了一段BootLoader(也即ISP 程序),这段程序出厂后无法修改。厂家提供的BootLoader 一般支持UART 协议,可以让我们直接通过串口将程序代码烧录到Main Flash memory 中;
  • SRAM1:这个启动模式一般用于程序调试,假如我只修改了代码中一个很小的地方,重新烧录到Flash比较费时,可以从STM32 内存中启动代码,进行快速的程序调试,等程序调试完成后,再将程序烧录到Main Flash memory 中。

Main Flash memory、System memory、SRAM1 的存储区间分布如下图所示(在博文:存储管理与虚拟内存中也有介绍):
STM32L475 Memory Map
从STM32 的启动模式可以看出,ISP 通过USB 接口直接烧录代码,主要是靠System memory 中被厂家预置的Bootloader 代码提供的UART 协议实现的,要想使用System memory 中的ISP 代码,需要将BOOT0 设置为高电平、BOOT1 设置为低电平,然后按下复位键,MCU 从System memory 启动B

<think>我们正在讨论如何使用STLink烧录ASR-Pro核心板。根据引用内容,ASR-Pro核心板可能包含STM32单片机(引用[1]提到STM32单片机,引用[2]提到STM32核心板),因此使用STLink烧录是可行的。 关键点: 1. ASR-Pro核心板很可能使用STM32系列单片机,因为引用[1]和[2]都提到了STM32。 2. STLink是STMicroelectronics官方推出的调试编程工具,支持STM32全系列。 操作步骤: 步骤1: 硬件连接 - 准备STLink调试器和ASR-Pro核心板。 - 连接STLink的SWD接口到ASR-Pro核心板上的SWD接口(通常为4个引脚:VCC, GND, SWDIO, SWCLK)。注意:ASR-Pro核心板上的SWD接口可能没有直接标出,需要查看其原理图或用户手册。 - 具体连接方式: STLink的3.3V -> ASR-Pro核心板的VCC(如果目标板有独立供电,可以不接VCC,但必须共地) STLink的GND -> ASR-Pro核心板的GND STLink的SWDIO -> ASR-Pro核心板的SWDIO(通常为PA13) STLink的SWCLK -> ASR-Pro核心板的SWCLK(通常为PA14) 注意:如果ASR-Pro核心板上有复位引脚(NRST),建议也连接上,以便实现可靠的烧录。STLink的NRST连接至核心板的NRST。 步骤2: 软件准备 - 安装STLink驱动(ST-Link/V2驱动),可从ST官网下载。 - 准备烧录工具:可以使用ST官方提供的ST-Link Utility,或者使用OpenOCD,或者使用STM32CubeProgrammer。 步骤3: 烧录操作(以STM32CubeProgrammer为例) 1. 打开STM32CubeProgrammer,选择ST-Link作为连接方式。 2. 点击右上角的“Connect”按钮,连接STLink和目标板。 3. 如果连接成功,软件会显示目标芯片的信息(如STM32型号、ID等)。 4. 点击“Open file”按钮,选择要烧录的HEX或BIN文件。 5. 点击“Download”按钮,开始烧录。 6. 烧录完成后,点击“Disconnect”断开连接。 步骤4: 验证 - 烧录完成后,可以给目标板重新上电,观察程序运行情况。 注意事项: - 电源:确保目标板的供电稳定。如果目标板有独立电源,STLink的3.3V可以不连接,但必须连接GND以保证共地。 - 复位电路:如果烧录过程中出现连接失败,尝试连接STLink的NRST到目标板的NRST。 - 速度:如果连接不稳定,可以尝试降低SWD时钟频率(在STM32CubeProgrammer的设置中调整)。 如果遇到问题,请检查: - STLink驱动是否安装正确。 - 硬件连接是否正确,特别是SWDIO和SWCLK是否接反。 - 目标芯片是否支持STLink烧录(ASR-Pro核心板使用的芯片是STM32系列,所以应该支持)。 引用[3]提到电源电路采用3.3V供电,因此连接时务必注意不要超过3.3V,避免损坏核心板。 相关问题: 1. 如何为ASR-Pro核心板生成可烧录的HEX文件? 2. 使用STLink烧录时出现连接失败怎么办? 3. ASR-Pro核心板支持哪些烧录方式?</think>### 使用STLink烧录ASR-Pro核心板的完整指南 ASR-Pro核心板(如ASR6501/ASR6505)通常采用STM32内核,使用STLink进行烧录是完全可行的。以下是详细操作流程: --- #### **1. 硬件准备连接** - **所需设备**: - ASR-Pro核心板(确认采用STM32内核) - STLink V2/V3调试器 - 杜邦线(4根) - USB转TTL模块(可选,用于串口监控) - **接线方式**: ``` STLink 3.3V → ASR-Pro VCC (供电,注意电压匹配) STLink GND → ASR-Pro GND (共地) STLink SWDIO → ASR-Pro SWDIO (通常标记为DIO) STLink SWCLK → ASR-Pro SWCLK (通常标记为CLK) ``` > ⚠️ **注意**: > - 若ASR-Pro板载独立电源,可不接VCC,但**必须连接GND** > - 参考引用[3],确认开发板供电为3.3V,避免电压不匹配损坏芯片 --- #### **2. 软件环境配置** 1. **安装驱动**: - 下载[STLink驱动](https://www.st.com/en/development-tools/stsw-link009.html) - 安装后连接STLink,设备管理器应显示`STMicroelectronics STLink dongle` 2. **烧录工具选择**: - **推荐工具**: - STM32CubeProgrammer(官方工具,支持HEX/BIN文件) - ST-Link Utility(经典工具) - OpenOCD(开源方案--- #### **3. 烧录操作步骤(以STM32CubeProgrammer为例)** ```mermaid graph TD A[连接硬件] --> B[打开STM32CubeProgrammer] B --> C[选择 ST-Link 模式] C --> D[点击 Connect 连接核心板] D --> E[加载固件文件 HEX/BIN] E --> F[点击 Download 开始烧录] F --> G[显示 Verify OK 即成功] ``` 1. 打开STM32CubeProgrammer,选择**ST-Link**模式 2. 点击右上角**Connect**,确认识别到芯片型号(如STM32L0系列) 3. 点击`Open file`加载固件(HEX或BIN格式) 4. 点击`Download`按钮开始烧录 5. 状态栏显示`File download complete`即成功 > 🔍 **验证烧录**: > 通过串口模块连接ASR-Pro的UART引脚(参考引用[1]),使用串口助手查看启动日志 --- #### **4. 常见问题解决** | 问题现象 | 解决方法 | |---------|---------| | **无法识别芯片** | 检查SWD接线顺序;降低SWD时钟速率(在设置中调整) | | **供电不足** | 外接独立电源,STLink仅保留GND/SWD连接 | | **校验失败** | 重新生成固件文件;检查芯片Flash保护位 | | **烧录后不运行** | 确认复位电路正常;检查BOOT引脚电平状态 | --- #### **5. 替代方案参考** 若STLink不可用,可参考以下方案- **串口烧录**(需BOOT0拉高): 使用USB转TTL模块连接ASR-Pro的UART0,通过`flash_loader`工具烧录(引用[1]中ESP8266的UART方案可复用) - **无线烧录**: 通过ASR-Pro内置的WiFi/蓝牙(引用[1][2]),使用OTA更新固件 > 💡 **提示**:对于量产场景,推荐使用SWD接口的离线烧录器提高效率 --- ### 相关问题 1. ASR-Pro核心板的SWD接口引脚如何定位? 2. 如何为ASR-Pro生成可烧录的HEX文件? 3. STLink烧录时如何避开Flash写保护? 4. ASR-Pro支持哪些无线烧录方案
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流云IoT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值