拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

嵌入式烧录下载与仿真调试实战:从SWD到HardFault定位

嵌入式烧录下载与仿真调试实战:从SWD到HardFault定位

写嵌入式也有不少年头了,从51单片机玩到Cortex-M系,再到Linux驱动,每天打交道最多的除了编译器,就是烧录下载和仿真调试这套工具链。很多人觉得这不就是点个Download按钮的事儿吗?可真到项目出问题的时候,能不能用好调试器,往往决定了你是花半小时找到Bug,还是花三天加班加点抓耳挠腮。这篇文章我就把这些年踩过的坑、用过的工具、总结出的排查思路,一次性梳理清楚,希望对正在做嵌入式软件开发的朋友们有点实际帮助。

1. 烧录下载:嵌入式开发的第一道关卡

1.1 烧录的本质是什么

很多人把“烧录”想得很神秘,其实就是把编译好的二进制文件(hex、bin、elf这些)写入芯片的存储介质里。这里说的存储介质,常见的就是Flash,有些芯片也支持从EEPROM启动或者从外部SPI Flash启动,但核心逻辑都一样:CPU上电后从某个地址取指令执行,而那个地址对应的物理存储上,必须放着我们写好的程序。

理解这一点非常重要,因为它直接决定了你对“下载失败”这类问题该怎么下手。我见过不少新手,程序编译过了就觉得万事大吉,一烧录就报错,整个人懵在原地。其实烧录这件事,涉及三个层面的配合:PC端软件(比如Keil、IAR、STM32CubeProgrammer)、调试器硬件(比如J-Link、ST-Link、DAP-Link)、目标芯片本身的状态(供电、时钟、复位引脚、加密位等等)。哪一环出问题,都会导致烧录失败。

1.2 主流烧录接口与协议对比

嵌入式领域最常见的烧录接口,排第一的毫无疑问是SWD,其次就是JTAG,再往后是ISP、UART Bootloader、USB DFU这类。很多人刚入门时分不清SWD和JTAG到底啥关系,这里我用自己的理解给你捋一下。

JTAG是历史最悠久的调试接口标准,全称Joint Test Action Group,原本是为了做PCB板级测试的,后来被扩展成芯片调试接口。它需要的信号线多,TCK、TMS、TDI、TDO、TRST,一堆线,占用引脚多,但功能全,支持边界扫描。SWD就是Serial Wire Debug,ARM推出的精简版调试接口,只需要SWDIO和SWCLK两根线,速度还比JTAG快,所以现在几乎所有的ARM Cortex-M芯片都默认支持SWD。

我自己的习惯是:能用SWD绝不用JTAG,除非芯片只支持JTAG。SWD两根线就能调试,对PCB布局压力小很多,而且很多板子的调试口就留4个焊盘(VCC、GND、SWDIO、SWCLK),用杜邦线一插就能连。

ISP(In-System Programming)是针对单片机(比如STC、AVR)的一种串口烧录方式,靠芯片出厂固化的Bootloader引导,把程序通过UART写进Flash。它的优点是只要一根USB转TTL线就能烧,成本为0,缺点是不能在线仿真调试,只能写完跑,出问题只能靠串口打印。STM32也支持串口ISP,一般通过BOOT0引脚拉高进入系统Bootloader,然后用Flash Loader工具烧。

我用一张表来总结这几类接口的核心区别:

接口/方式信号线是否支持在线调试典型调试器适用场景
SWD2根(SWDIO/SWCLK)支持J-Link、ST-Link、DAP-Link绝大多数ARM MCU,首选
JTAG4-5根支持J-Link、ST-Link旧芯片、FPGA、需要边界扫描的场景
ISP/UART2根(TX/RX)不支持USB-TTL无调试器时的备用烧录方案
USB DFU1根USB不支持无需额外硬件支持USB的芯片(STM32等)

选择哪种烧录方式,不是一个纯技术问题,还要考虑生产效率。小批量打样时,SWD随便怼;产线批量烧录时,往往用脱机烧录器(比如J-Link批量烧录模式、或者专用的编程器),速度快且不需要连着电脑。

2. 仿真调试工具选型:几大阵营怎么选

2.1 商用工具与开源工具的取舍

调试器硬件市场,说来说去就那么几个名字:SEGGER的J-Link、ST官方的ST-Link、ARM官方的DAP-Link(CMSIS-DAP),还有一些国产兼容版。先聊商用和开源这个选择题。

J-Link是商用工具里当之无愧的王者,也差不多算行业标准。它的软件生态非常成熟,J-Flash用来烧录、Ozone用来调试、RTT用来日志输出,配合SEGGER Embedded Studio,体验确实丝滑。但J-Link原版不便宜,正版的J-Link BASE也要一千多,EDU版便宜一些但只能用于教育。所以国内很多公司用的是兼容版J-Link,几十块钱一个,也能用,但偶尔会有固件升级变砖的问题(就是网上常说的“J-Link被检测为盗版”)。

ST-Link是ST官方出的调试器,买Nucleo开发板时板载一颗。它的最大优势是便宜、与STM32生态无缝配合,在STM32CubeIDE、Keil、IAR里都是免驱或自动识别。缺点是只支持ST的芯片(其实新版ST-Link也支持部分其他ARM芯片,但官方并不保证兼容性),调试速度上限不如J-Link。

DAP-Link是ARM官方的CMSIS-DAP开源方案,核心逻辑是直接把USB包翻译成SWD/JTAG协议,不依赖特定厂商的闭源固件。市面上很多几十块钱的“DAP下载器”就是它的变种,配合OpenOCD、pyOCD这类开源软件,能调试几乎所有ARM Cortex芯片。我自己就常备一个,出差应急、临时搭测试环境都靠它。

2.2 几款主流调试器的实测体验与选型建议

我自己的使用频率排序是:J-Link > ST-Link > DAP-Link,倒不是说J-Link一定碾压,而是它对各种芯片和IDE的兼容性实在太好。我说几个“只有用久了才知道”的体验差异。

第一是调试速度。大工程、多断点的情况下,J-Link在Keil里加载程序明显比ST-Link快一截,尤其是几千个断点的大文件,或者Flash里带大量初始化数据的工程。这个差异在Cortex-M7这种高频芯片上会更明显。

第二是RTT功能。SEGGER的RTT(Real-Time Transfer)算是一个杀手级功能,它用芯片的调试接口,在CPU运行期间直接读写内存缓冲区,实现类似串口打印的效果但不需要占用UART引脚。调试电机控制、电源控制这类对时序敏感的程序时,用RTT输出日志比串口稳定得多。ST-Link没有官方RTT,虽然也可以魔改,但稳定性不如原生。

第三是脱机烧录。产线批量烧录时,J-Link可以脱离PC,直接按按钮烧录,配合J-Flash的脚本还能做序列号写入、MAC地址烧录、产线数据统计。ST-Link就没有这个功能,DAP-Link更不用想。

选型这件事,我给一个很实在的建议:如果公司预算充足、芯片主要是ARM系列,直接采购正版J-Link Plus级别以上的,省心;如果个人学习、做做小项目,ST-Link V2兼容版或者DAP-Link完全够用,几十块钱的投入换来在线调试能力,性价比极高。

2.3 工具链的软件生态:Keil、IAR、OpenOCD

调试器是硬件,真正和它配合工作的是上位的IDE和调试软件。这部分我单独说一下,因为很多人的认知被某个IDE绑死了,换个工具就不会用了。

Keil MDK(现在叫Keil Studio了)是国内嵌入式开发者的老朋友,尤其是跑STM32的用户。它可以无缝对接J-Link、ST-Link、DAP-Link,在Options for Target -> Debug设置里选对应的调试器,再设置Flash Download算法就能烧录。Keil的历史包袱重,界面老,但生态成熟,网上教程最多,新手基本绕不开。

IAR Embedded Workbench在编译优化、代码体积控制上做得比Keil好,尤其是商业项目里代码量大了之后,IAR的编译效率优势就出来了。但它那套工程文件格式、配置方式都比较独特,上手门槛高一点。调试功能倒是很强,IAR配J-Link是我很喜欢的组合。

OpenOCD则是另一个思路,它是一套开源的调试软件,配合DAP-Link或者兼容调试器使用,在Linux下玩嵌入式特别顺手。典型用法是命令行敲openocd -f interface.cfg -f target.cfg,把调试器接到GDB上,然后用arm-none-eabi-gdb连接调试。这条路稍微折腾一点,但你一旦掌握,就能彻底摆脱IDE的束缚,在命令行里享受自主控制的乐趣。

3. 仿真调试的核心操作:从下载到断点的完整链路

3.1 第一次烧录的完整流程与配置细节

假设你拿到一块全新的板子,芯片是STM32F103,手里是一个兼容版J-Link,电脑装了Keil。第一次烧录该做什么?

第一步,连接硬件。J-Link的SWD接口接芯片的PA13(SWDIO)、PA14(SWCLK),另外接VCC(参考电压)和GND。注意这个VCC最好接板子的3.3V电源,有些调试器需要检测目标电压来决定IO电平标准。用杜邦线连接时,确认线序,别接反。

第二步,配置Keil。进入Options for Target -> Device选择芯片型号,进入Debug标签页,选择调试器为J-Link/J-Trace Cortex,右侧勾选Use Debug Driver,然后进入Settings,确认SWD模式下的设备ID能被识别。正常情况下,这里会显示芯片的IDCODE和Device Name,说明调试器和芯片通信成功了。

第三步,配置Flash Download算法。进入Utilities标签页,点击Settings按钮,在Flash Download里勾选Erase Full Chip(或者Erase Sectors)、Programming、Reset and Run。这里有个容易忽略的点:Programming算法芯片必须匹配。STM32F1用STM32F10x Flash算法,STM32F4用STM32F4xx Flash算法,选错了烧录必失败。

第四步,编译工程,没有Error后点击Download按钮(或者Debug按钮直接进入调试模式)。Keil会在Output窗口打印编程进度和校验结果,看到Verify OK就说明烧录成功。

我建议所有人都把“Erase Sectors”勾上,而不是每次“Erase Full Chip”。为什么?批量生产时限产线效率,整片擦除分分钟几秒就没了,按扇区擦只需要擦写变化的区域,几百KB的工程也能秒级烧完。但注意:如果芯片Flash里有OTA Bootloader,你只想烧APP区,必须选Erase Sectors,而且地址起始要选对,否则把Bootloader擦了你哭都来不及。

3.2 断点调试的工作原理与单步执行技巧

烧录只是基本功,真正需要花时间学的,是仿真调试的效率。这就像写文章一样,下载是打印出来,调试才是真正的修改润色。

断点的底层原理,我说得白话一点:CPU里有个调试模块(比如Cortex-M的DWT和FPB单元),它能在特定地址上设置硬件断点,当程序执行到那个地址时,CPU会暂停下来,把当前状态(寄存器、内存)暴露给调试器。Cortex-M通常有6个硬件断点(FPB),超过这个数,调试器就会退而求其次,用Flash patch的方式实现软件断点,也就是把原本的指令替换成一个BKPT指令,执行到那里触发异常,停下来。

这就解释了为什么你断点打多了会感觉到程序变得“卡顿”,因为软件断点本质上是在修改代码,每步执行都要重新写入Flash、恢复指令,肯定比硬件断点慢。所以调试高频循环、中断服务函数这类代码时,尽量少打断点,用条件断点(每个断点设置触发条件)控制命中次数。

单步执行的种类也要分清。Keil里F10是Step Over(跳过函数)、F11是Step Into(进入函数)、F5是运行到下一个断点。新手最容易犯的错误是把Step Over当成Step Into疯狂按,遇到库函数就陷入一堆汇编,完全看懵。我的技巧是:自定义的函数用Step Into,库函数和标准外设库用Step Over,然后多结合“Run to cursor”(运行到光标处)这个快捷键(Ctrl+F10),效率高得多。

3.3 变量监视、寄存器查看与内存窗口的使用

调试界面上除了代码窗口,还有几个窗口对定位问题非常关键,我一个个说。

Watch窗口(变量监视)用于查看C语言变量的当前值,还能修改变量的值(右键手动编辑)。它的本质是读取芯片内存里的特定地址,再结合调试信息把它翻译成人类可读的值。这里有个坑:局部变量在未执行到对应代码行时,显示的值是垃圾值或不可用,因为栈上还没分配;被优化掉的变量(比如O2优化下的临时变量)也可能显示“optimized out”。遇到这种情况,要么把优化级别调低,要么用volatile修饰变量。

Register窗口显示CPU所有寄存器的值。在追查异常、跑飞问题时,PC(程序计数器)的值是最关键的线索。比如程序意外进HardFault,你先看PC停在哪里,再看LR(链接寄存器)的值,就能反推是哪个函数调用导致的。

Memory窗口可以以十六进制形式直接查看任意内存地址的数据。调试协议栈、DMA缓冲区、链表结构时,直接用Memory窗口比对字节,比在Watch窗口翻结构体字段直观得多。我经常用Ctrl+C复制内存地址,在Memory窗口粘贴跳转,然后按F5刷新。

还有一个很实用但很多人没注意的:外设寄存器窗口(Peripherals)。它把芯片所有外设的寄存器汇总显示,你可以在程序运行时实时查看UART的数据寄存器有没有收到新字节、DMA的状态标志置没置位、定时器的CNT计数值走到哪儿了。排查外设通信问题的时候,这东西比串口打印好用百倍,因为它不干扰程序的时序。

4. 实战中的高频问题与排查技巧

4.1 烧录失败的典型原因与对症下药

做嵌入式开发,遇到最多的报错就是烧录失败。我把这些年遇到的高频问题整理成一张速查表,供大家直接对照。

错误现象可能原因排查方向
No target connected / Target not found接线松动、芯片供电异常检查SWD线序、VCC有没有3.3V、复位引脚是否被拉低
RDDI-DAP Error / SWD Communication Failure调试口被禁用(SWDIO复用)检查代码是否把SWD引脚配置成GPIO,用串口ISP擦除芯片
Flash Download failed - programmer errorFlash算法选错、芯片型号不匹配重新选择对应Flash算法,确认Device型号
Cannot access target. Check power and connections目标芯片处于低功耗模式/硬件复位按住复位再点Download(复位时序法)、给板子断电重上电
Error: Flash Device Timeout访问Flash时芯片锁死检查电源稳定性,降低SWD时钟频率

这些报错里最坑的一个是把SWD引脚复用成GPIO。有些开发板出厂程序把PA13、PA14配置成普通GPIO了,你一插上调试器,GDB或Keil就报错“No target connected”。解决方式有两个:一是按住板子的复位键,在点击Download的同时松开复位键,让芯片在复位期间响应调试命令,就能强制连接上;二是用UART ISP方式空擦除(Flash Erase),把之前烧进去的程序清掉,SWD引脚就恢复默认的复用功能了。

4.2 调试器连接不上的排查思路

如果排除了接线和供电问题,调试器还是连不上目标芯片,我给你一套完整的排查顺序,照着做基本都能解决。

第一步,确认调试器驱动和固件。Windows下打开设备管理器,看有没有出现J-Link或STLink相关设备。没有出现的话,大概率是驱动问题;出现但有黄色感叹号,多半是驱动冲突。先卸载重装官方驱动。很多兼容版J-Link的固件是刷过的高版本,配合最新版Keil可能触发了盗版检测,此时需要降级固件到老版本。

第二步,确认调试器自检。J-Link有自带的功能,在命令行里输入JLink.exe,如果打印出SEGGER J-Link Commander并且能进入命令行交互界面,说明调试器本身OK。如果再执行connect并指定芯片型号,它能打印出芯片IDCODE,就说明硬件链路没问题。

第三步,降低SWD速度。高速SWD(比如5MHz、10MHz)对线材质量、PCB走线要求很高。如果你的连接线是20cm以上的杜邦线,或者板子PCB布局比较差,就可能出现信号完整性问题。把SWD时钟频率降到500kHz或者1MHz,很多“时而连得上时而连不上”的诡异问题就消失了。

第四步,检查芯片复位电路。有些设计会在NRST上接个大电容,或者复位引脚被外部电路占用,会导致调试器无法正确复位目标芯片。尝试把调试器连接模式的Reset改为Normal还是Hardware Reset,不同调试器叫法不同,但核心思路是让调试器控制复位引脚来完成连接握手。

4.3 程序跑飞与HardFault的定位经验

程序烧进去以后跑飞、死机、进HardFault,是调试中仅次于烧录失败的难题。我分享几个多年沉淀下来的定位技巧。

第一种情况,程序反复进HardFault_Handler。在中断服务函数里加一个死循环(while(1)),然后打断点看调用栈。Cortex-M内核中,发生HardFault时会自动压栈PC、LR、xPSR等寄存器,调试器(Keil和IAR都支持)可以直接显示调用栈,告诉你事故发生前程序执行到哪个函数、哪一行代码。如果调用栈信息不完整,可以查看SCB->HFSR、SCB->CFSR这些故障状态寄存器,它们能告诉你具体是总线错误、内存管理错误还是未定义指令。

第二种情况,程序没有死机但行为诡异,比如某个变量值莫名其妙被改动。这种情况很可能是内存越界,排查方法是用内存断点:在可疑变量地址上设置写入断点(Data Watchpoint),当程序执行写入操作时立即停下来。Cortex-M内核的DWT单元支持4个硬件观察点,足以应对多数场景。我记得有个项目排查电机抖动问题,最后发现就是某个数组越界,把PWM控制字冲掉了,设上写入断点后一遍就定位。

第三种情况,程序复位重启(看门狗或者电源异常)。这种问题最阴险,表面上没有任何日志,程序就像失忆一样复活。我的做法是,在代码里定义一个全局变量,每次上电时递增存到备份寄存器或铁电存储器里,通过复位计数来判断复位次数。再结合系统控制块SCB->AIRCR里的复位原因位,可以区分是上电复位、看门狗复位还是软件复位。有了原因,再去排查对应的外设初始化代码和看门狗喂狗逻辑。

5. 嵌入式软件开发面试中的烧录调试考点拆解

5.1 基础题:别在送分题上翻车

近几年嵌入式软件开发的岗位面试,烧录和调试相关的问题是出镜率很高的基础考点。我看过很多简历写得花团锦簇,结果一问SWD和JTAG的区别,当场卡壳,这种基础题答不上来非常减分。下面我把常见的面试题整理一下,给出我认为最稳妥的回答思路。

第一题:SWD和JTAG有什么区别?面试官想听的核心是:SWD是ARM专有协议,只需要2线,速度更快;JTAG是通用工业标准,需要4-5线,支持边界扫描,但占用引脚多。再补一句实际应用:现代ARM MCU普遍支持SWD,多数项目优先使用SWD,如果涉及FPGA或板级测试,则用JTAG。

第二题:烧录失败可能有哪些原因?这个问题要么是问经验,要么是问原理。经验层面答我上面总结的那几个典型原因(接线、供电、Flash算法选错、SWD引脚被复用)。原理层面要答到通信握手的概念,即调试器需要和目标芯片完成IDCODE识别才能建立连接,只要任何一方电平不匹配、时钟不稳或引脚被占用,握手就会失败。

第三题:如何在产品量产时高效烧录程序?这题的潜台词是考察你是否理解生产环境的限制。回答思路:可以使用调试器的脱机烧录功能,将固件提前下载到调试器内部存储,现场不需要PC,直接按键烧录;或者使用专门的量产编程器、在线烧录治具。同时可以考虑在固件中加入唯一序列号的写入逻辑,让下载器在烧录时自动写入,配合产线MES系统做追溯。

5.2 进阶题:能体现出真实项目经验的问题

除了基础概念,面试官更愿意问那些能区分“用过”和“真正干过”的问题。我挑几个出现频率高的。

第一题:程序在中断里修改全局变量,导致主循环逻辑错乱,怎么排查?这个问题其实考察的是调试方法和内存监视能力。回答方向:第一,确认变量是否被volatile修饰,确认编译优化是否导致预期外的行为;第二,使用调试器的数据观察点(Dara Watchpoint)在变量地址上设置写入断点,看是哪一处代码写入的,把中断的干预行为揪出来;第三,查看调用栈和寄存器,确认中断嵌套的情况。

第二题:低功耗模式下如何进行调试?这个题我也在面试中被问过,回答要点是:芯片进入Stop/Standby模式后,内核时钟停止,SWD调试口可能还能访问但单步执行已不可用。常见策略是,调试期间临时屏蔽进入低功耗的代码,或者利用唤醒事件配合RTT日志输出。更进阶的做法:使用调试器的“Debug in low power mode”特性,但这需要芯片和调试器双方支持。

第三题:如何定位一个只在Release模式下出现的Bug?这个问题非常经典,考察点在于Release模式优化级别高,可能导致时序变化、变量被优化、宏展开不同。我的回答思路:用git/bisect定位最近的代码变更;用Release+调试符号方式编译,模拟Release行为但保留调试信息;给可疑变量加volatile,关闭局部优化(Keil里可以用__attribute__((optimize("O0"))));最终手段是用逻辑分析仪或示波器直接测引脚时序,把软件问题转化成硬件信号问题来分析。

5.3 面试官不会明说但极其看重的素养

说点更深入的,面试官问烧录和调试的问题,其实不完全是考知识点,还在考察你的工程素养。比如我上面说的按住复位键强制连接调试器、把SWD时钟降到500kHz解决干扰问题,这些操作背后体现的是“从现象推理本质”的能力,这种能力比死记硬背一百个命令都重要。

还有一道常被忽略的题:如何验证烧录后的程序是正确的?大多数人的第一反应是“校验Flash”,这当然没错,但更高阶的回答是:既要验证Flash内容和bin文件一致(烧录工具自带Verify),又要做上电自检(硬件初始化、外设版本读取、CRC校验、自测试逻辑)。因为很多时候程序本身没问题,但芯片在运输过程中引脚氧化导致个别信号不良,自检就能提前暴露硬件问题。

6. 工具链之外的效率提升建议

6.1 从“能调试”到“高效调试”的思维转变

工具始终是工具,真正让你从“能调试”进化到“高效调试”的,是调试的思路。我见过有人挂上调试器就疯狂打断点,一个函数一个函数地单步,跟看门大爷查电表似的,效率很低。我的习惯是:先看代码,推理出可疑范围,再有策略地打断点验证。调试器是验证手段,不是探索工具。你越能精准定位可疑代码段,调试验证的时间就越短。

另外,日志输出也是调试的重要一环。RTT、串口、Semihosting都是常用的日志通道。Semihosting这个很多人不熟,它利用调试接口在目标机上执行主机命令,可以让你在程序里直接调用fputc输出到PC终端,不需要串口线。不过Semihosting会把CPU卡住,所以Newlib的printf默认实现会导致程序挂死,需要自己做重定向。我现在的主力输出方式是RTT,不用占用串口中断,对实时系统的侵入最小,强烈推荐有条件就上。

6.2 自动化测试与持续集成的实践

调试工具不只用于开发阶段,在产品测试和维护阶段同样能发挥巨大价值。推动项目组做自动化冒烟测试时,我的方案是用J-Link Commander或pyOCD脚本控制程序烧录,配合上位机脚本进行板级功能验证。比如MCU的GPIO电平翻转测试,每次固件更新后,自动烧录、自动验证、自动生成测试报告,五分钟跑完全部用例。这在做OTA版本验证、回归测试时非常省力。

生产测试环节还可以用调试器的RTT或SWD接口读取芯片内部的状态码。比如产线上板子跑完自检程序,把自检结果写到RAM指定地址,测试治具通过调试器直接读取该地址的值,决定PASS还是FAIL。这种方式完全不需要预留串口,只依赖调试口的四根线,产线维护成本低很多。当然,如果产品本身有通信模块,走通信指令是最稳的。

6.3 选择合适的固件构建与调试组合

你可能注意到我前面反复强调“组合”这个概念。工具本身强不强是一回事,和你用的IDE、芯片、项目类型契不契合,是另外一回事。我给不同场景列一个我实测下来很稳的组合:

项目类型推荐组合原因
STM32学习/小项目STM32CubeIDE + ST-Link免费、开箱即用、教程多
商业量产(ARM MCU)Keil/IAR + J-Link编译效率高、调试稳定、支持脱机量产
嵌入式Linux驱动开发OpenOCD/pyOCD + DAP-Link命令行风格,适配GDB流程
低功耗/无线SoC开发SEGGER Embedded Studio + J-LinkRTT日志对低功耗调试非常友好

这套组合不是绝对的,但大方向不会错。永远不要去和工具链较劲,能用顺手工具解决的事情,不值得花时间折腾环境配置。嵌入式开发的时间本来就紧,省下来的每一分钟,都应该用在产品本身的逻辑打磨上。

最后聊一件非常有价值的小事:不论你手头是哪个调试器,都建议常备一个USB转TTL模块。调试器负责仿真和烧录,串口模块负责日志输出,两样东西互补。在排查启动阶段死机、Bootloader跳转失败这些问题时,串口打印往往比仿真器更先给你线索,因为那种状态下调试器根本连不上芯片。工欲善其事,必先利其器,这套组合打下来,嵌入式开发的效率才能拉满。

返回列表