ARTICLE DETAIL

资讯详情

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

嵌入式烧录与仿真调试工具链详解:原理、选型与排错实战

嵌入式烧录与仿真调试工具链详解:原理、选型与排错实战 刚入行那会儿我接过一块板子把ST-Link杜邦线往SWD接口上一插打开Keil点击下载满心期待地等固件跑起来结果弹窗一句No target connected。当时真是懵了后来才发现不过是四根线里有一根接触不良。这个场景估计很多嵌入式开发的朋友都遇到过。烧录下载和仿真调试是整个嵌入式软件开发链路里最基础、也最绕不开的环节。没有这一步你写的千行代码就只是一堆躺在工程目录里的文本文件没有调试工具出了Bug只能靠猜和printf硬扛。这篇文章我想结合自己这些年玩过的调试器、踩过的坑把嵌入式开发里烧录下载、仿真调试这套工具链从原理到实操完整梳理一遍包括硬件调试器的选型对比、Keil和OpenOCD这些软件环境的配置细节、量产烧录的注意事项以及连接不上、烧不进、跑飞、HardFault这些疑难杂症的排查方法。写这个东西的初衷很简单刚入门的同学照着做能少走弯路有一定经验的开发者也可以当作工具速查表来看。尤其是面试的时候烧录原理、SWD和JTAG区别、断点怎么实现的、HardFault怎么定位——这些都是高频题搞懂工具背后发生了什么面试题自然也就不在话下了。1. 烧录下载与仿真调试先搞清楚原理再动手很多人在用调试器的时候其实就是“点一下下载能跑就行”。我觉得这个心态做产品迟早要出事因为工具一旦报错你根本不知道它在说什么。先花十分钟搞清楚烧录和调试的本质后面所有问题都是纸老虎。1.1 烧录的本质把固件搬进芯片的Flash所谓烧录下载就是把编译生成的hex或bin文件通过某种物理接口写到芯片内部的Flash里。听起来简单但这里面有个关键点Flash不是想写就能写的。以最常见的NOR Flash为例它的存储单元存储“1”和“0”的方式决定了写入时只能把“1”变成“0”不能把“0”变成“1”。所以真正写入数据之前必须先执行一次擦除操作把整个扇区或整块Flash擦成全“1”状态。这就是为什么Flash编程的流程永远是“擦除-写入-校验”三步缺一不可。在很多调试器软件里你会看到Erase Full Chip和Erase Sectors的选项区别就在于擦除范围。量产时如果只改了一小段代码只擦除对应扇区会快很多但要注意扇区间数据交叉存储的问题。烧录的物理接口常见的就那么几种。SWD是ARM内核芯片最常用的两根线搞定速度还能拉到MHz级别JTAG是更老的IEEE 1149.1标准线多但能链式连接多个芯片串口ISP则是靠芯片出厂内置的Bootloader比如STM32的System Memory Bootloader把BOOT0引脚拉高后再上电复位芯片就会进入一段固化的引导程序通过USART接收数据写入Flash。这种方式不需要额外的调试器但没法在线仿真速度也慢。不同烧录方式的核心区别可以参照下面这张表方式硬件需求能否在线调试速度典型场景SWDSWDIO/SWCLK/GND调试器可以快日常开发调试JTAGTMS/TCK/TDI/TDO调试器可以快FPGA、多核调试串口ISPTTL串口BOOT跳线不可以慢量产、无调试器USB DFUUSB口Bootloader不可以中等产品现场升级OTA无线或有线网络不可以看环境物联网设备远程升级实际做产品的时候开发阶段几乎全用SWD因为又能下载又能在线调试。到了量产阶段很多工厂反而会用串口ISP或者专用的离线烧录器效率和可靠性优先。1.2 仿真调试的本质通过调试口和芯片内核对话仿真调试听起来玄乎其本质就是调试器通过SWD或JTAG接口访问芯片内核里的调试寄存器实现对CPU的控制和观察。Cortex-M内核里有一个调试接口外部调试器通过它读写DHCSR、DEMCR这些寄存器就能做到让CPU暂停、单步执行、读写通用寄存器和内存。断点是怎么实现的这个是面试经典题。硬件断点靠内核里的比较器电路把当前指令地址和设定的断点地址做比较地址匹配就让CPU暂停。Cortex-M0通常只有4个硬件断点Cortex-M3/M4有6个多了就设置不了这时候就得用软件断点。软件断点的原理更巧妙它是在断点地址处临时插入一条BKPT指令CPU执行到这里就触发异常。但是Flash是只读的没法直接改写所以软件断点通常只在RAM里运行的代码上才能用。单步执行就是设置调试寄存器里的单步控制位让CPU执行完一条指令后自动触发调试异常回到暂停状态。变量监视和内存查看就更好理解了编译时会生成包含变量名、类型、内存地址映射关系的调试信息DWARF格式调试器解析这些信息读取对应内存地址的数据换算成你能看懂的变量值。这里有一个最基本的原则调试信息必须在编译时开启-g选项如果你想在调试时看变量尽量不要开-O2以上的优化否则变量可能被优化没了或者变量实际存放的位置和源码逻辑对不上。我见过太多新手拿着优化后的固件去调试Watch窗口里变量全是红的看不见值还以为是自己代码写错了。2. 工具选型硬件调试器和软件环境怎么配工具这东西没有绝对的最好只有适不适合自己的使用场景。我把市面主流的硬件调试器和软件环境都捋了一遍直接给结论和选择建议省得大家走弯路。2.1 常用硬件调试器横向对比先看硬件调试器。最常用的大概就下面这几款它们各有各的脾气J-Link是SEGGER家的产品线从几十块钱的J-Link OB到几千块的J-Link PRO都有。J-Link最大的优势是SWD速度极快且稳定支持几乎所有ARM芯片配套的J-Flash、Ozone、SystemView这些软件生态非常完整。我现在做产品调试主力就用J-Link V9和V11实测连接和下载速度明显比ST-Link快一个档次而且它能虚拟出一个串口调试日志都不用另外接USB转串口了。ST-Link是ST官方的调试器最便宜的ST-Link V2才几十块钱支持STM8和STM32全系列。V3版本还加了UART、SWO等更丰富的外设。如果是刚入门学STM32买一个ST-Link V2或者直接用开发板上集成的ST-Link就好性价比极高。缺点是只支持ST自家的芯片想用来调试NXP或者GD32某些兼容型号除外就无能为力了。DAPLink和CMSIS-DAP走的是ARM官方开源方案基于LPC4322等芯片加上开源固件实现。这类调试器很多厂商都在做比如各种数传模块上集成的DAP-Link、或者某宝几块钱一个的CMSIS-DAP小棒子。它的好处是开源、便宜而且协议是标准的CMSIS-DAPOpenOCD和PyOCD都能识别跨平台性好。缺点是不同卖家做的质量参差不齐有的接线设计粗糙信号完整性差高速下载容易失败。这三者怎么选我给一个比较粗暴的建议如果是学习阶段ST-Link V2就够了如果是做商业产品、需要频繁调试和稳定下载直接上J-Link如果是想在Linux下配合OpenOCD做一些自动化测试或者非ST的芯片选一个做工好的CMSIS-DAP调试器。具体对比可以看这张表调试器支持芯片范围SWD最高速度典型价格软件生态推荐场景J-LinkARM全系部分RISC-V可达50MHz高J-Flash/Ozone/SystemView产品开发、容器调试ST-Link V2/V3STM32/STM8可达4MHz左右低STM32CubeProgrammerSTM32学习与开发CMSIS-DAP/DAPLink取决于固件多数ARM可达10MHz很低OpenOCD/PyOCDLinux环境、开源项目2.2 软件工具链选择集成IDE和命令行方案软件环境这块主流的路线大概有三条。第一条是Keil MDK ST-Link/J-Link的Windows集成环境。Keil上手极快点击Download按钮下载固件按F5进入调试Watch窗口、寄存器窗口、外设窗口都在一个界面里而且很多外设寄存器都做了图形化映射不用自己查手册就知道某个外设寄存器当前值是什么这对新手非常友好。STM32老工程师说“Keil启动慢、界面土”但说实话你换个角度想它的生态成熟网上教程多团队协作时大家配置统一省心程度完全能弥补这些缺点。现在Keil MDK也出了Arm Developer Studio的过渡方案但老项目迁移成本高我暂时没大规模转。第二条是命令行方案OpenOCD加GDB。这条路线在Linux环境下尤其好用因为OpenOCD本身就是一个开源的调试烧录软件支持大量调试器和芯片把OpenOCD起来后在它监听的端口上用GDB连接就可以实现所有调试功能。配合VS Code的Cortex-Debug插件体验不比Keil差。我做Linux嵌入式开发时编译、烧录、调试完全可以用Makefile加一条命令搞定不用来回切IDE这种方案很适合写脚本做自动化测试。第三条是厂商专用命令行工具。ST官方出了STM32CubeProgrammer它既可以连ST-Link做SWD调试也能连串口USB做ISP还支持OTA。最关键的是它有完整的命令行接口CLI批量烧录、读保解锁、写Option Bytes、烧写序列号全部可以用脚本一键完成。SEGGER家的J-Flash SPI也类似可以命令行或批处理方式量产。量产场合一定要用这类工具别用Keil一台台点按钮效率真的没法比。2.3 选型建议不同岗位和场景的最佳搭配结合我自己的经验给几条选型建议刚入行学STM32的新手Windows上装Keil MDK买一个ST-Link V2或直接用开发板板载调试器先在最小系统板把点灯和串口两个例程跑通重点体验下载、断点单步、查看变量的整个流程。做消费类产品固件的工程师建议用J-Link加Keil或VS Code。J-Link的稳定性和速度能省下很多等待下载的时间一天编译下载几十次每次省几秒一天就是几分钟效率就是这么一点点抠出来的。做Linux下、复杂SoC或自动化测试的工程师OpenOCD加GDB是硬需求特别是要做CI/CD自动化测试的时候没有一个支持命令行的烧录调试工具真的寸步难行。做量产备料的工程或生产人员STM32CubeProgrammer CLI脚本加J-Flash批处理配合读保护设置一键把固件、Option Bytes、产品序列号全部写好。不管选哪套我觉得有一个原则要记住工具链要趁早固定下来别频繁切换。我自己见过太多人一个月换一次开发环境然后所有时间都花在重新搭环境上了。工具是用来解决问题的不是用来折腾的。3. 实操搭建环境、烧录下载、仿真调试全过程原理和选型都说完了下面直接上实操。我用一套STM32F103开发板加ST-Link V2做演示把所有能走通的流程走一遍每个关键步骤的坑也会标注出来。3.1 SWD接线与硬件准备接线是烧录调试第一步很多人觉得简单恰恰最容易翻车。标准的SWD烧录调试需要接四根线分别是SWDIO、SWCLK、GND和一个参考电压输入。以STM32F103为例SWDIO是PA13SWCLK是PA14但很多板子会把更稳定的SWD接口单独引出来接线时不要焊到别的地方去。这里要特别强调一下VCC那根线的作用。调试器通过VCC引脚读取目标板的电平用于匹配IO逻辑并不是用它来给目标板供电的。如果你的调试器支持对外供电在投入电源之前要仔细看调试器说明书。我之前就栽过跟头把J-Link的供电脚接到了目标板的3.3V电源域上结果目标板本身用的电源芯片输出电压偏高直接导致两边的电平匹配出了问题调试器连上去就报错。接线顺序建议这样先接GND再接SWDIO和SWCLK最后接VCC。原因很简单共地是信号正确性的基础先接GND能避免调试器和目标板之间的地电位差损伤芯片IO口。如果是更复杂的调试场景建议把RESET线也接上。比如你调试的是低功耗项目芯片可能已经进入STOP或STANDBY模式SWD接口在这种情况下通常不工作。这时候把RESET线接上在调试器软件里选择Connect under reset模式芯片复位后的瞬间调试器发起连接就能成功建立连接并且停在启动代码的开头。另外很多芯片的SWD引脚可以被配置成普通GPIO比如有些产品为了多留几个IO口就把SWD复用掉了这种时候也必须靠RESET线来救场。3.2 Keil MDK下烧录与调试配置Keil MDK下烧录和调试的配置窗口其实就两个地方一个是Options for Target里的Debug选项卡另一个是Utilities选项卡。首先在Debug选项卡里选择调试器。如果你的ST-Link V2驱动的安装没问题在右侧下拉框里直接选ST-Link Debugger点击旁边的Settings按钮进入调试器设置页面。在这个页面里先确认调试接口选的是SW而不是JTAG然后把Max Clock从默认值调低一点比如先设成4MHz。很多新手拔掉线后接了一个很长很乱的杜邦线高速下载就会时好时坏明明能识别芯片但下载总是莫名其妙中断。把频率降到1MHz甚至100kHz往往立竿见影。接下来是Flash Download的配置。回到Options for Target在Utilities选项卡里点击Settings进入Flash Download对话框右侧有一个Flash Algorithm列表这里必须添加对应芯片的Flash算法文件。比如我用的STM32F103ZET6是高容量512KB Flash就要选STM32F1xx High-density Flash如果你的芯片是RCT6这种中等容量则选Medium-density。选错算法最典型的症状是下载时报错Flash Download failed - Target DLL has been cancelled或者Error: Flash Download failed - Cortex-M3因为算法和实际芯片Flash结构对不上。调试设置还有一个隐秘细节勾选Reset and Run。很多人在烧录完了之后发现程序没跑起来其实不是程序有问题而是烧录完成后没有自动复位运行。这个方法打开之后开发效率能提升不少。调试模式里进入界面后最常用的操作就是设置断点、全速运行、单步跳过、单步进入还有Watch窗口和Memory窗口。需要注意Watch窗口里看变量时如果变量的值显示为黄色下划线或者红色问号一般是变量被编译器优化掉了。调试状态下建议把优化级别改成-O0就算编译速度慢一点也值。3.3 Linux环境OpenOCD加GDB调试如果你是在Linux下做嵌入式开发Keil基本指望不上虽然可以通过Wine跑但稳定性一言难尽。OpenOCD加GDB才是正统方案。我之前在Linux服务器上做固件开发时就靠这套一套命令下去烧录、调试、量化测试全自动跑。先装软件Debian系直接sudo apt install openocd gdb-multiarch然后编写OpenOCD配置文件。以ST-Link加STM32F103为例一个最简单的配置文件如下# my_ocd.cfg source [find interface/stlink.cfg] source [find target/stm32f1x.cfg]如果用的调试器是CMSIS-DAP把interface/stlink.cfg改成interface/cmsis-dap.cfg就行。OpenOCD的配置语法不复杂但也不要一上来就猛堆参数先用最简单的配置跑通再说。启动OpenOCD后终端会保持在前台监听默认端口3333就是给GDB连接的调试端口openocd -f my_ocd.cfg另开一个终端启动GDBgdb-multiarch build/stm32f103.elf在GDB里依次输入target remote :3333 load monitor reset halt continue这里的顺序有讲究。我先连上OpenOCD的调试端口然后load命令把固件加载进芯片内存monitor reset halt让芯片复位并停在复位向量接着continue全速运行GDB就能正常跑起来了。VS Code用户可以把这套流程封装进Cortex-Debug插件的launch.json里配置好cortex-debug.openocdPath和openocd.cfg.template字段后按F5就能实现和Keil差不多的图形化调试体验。说实话我的建议是每一步都先在命令行里走一遍确认OpenOCD能正常找到芯片再上插件否则插件报错的时候你根本分不清是自己配置的问题还是OpenOCD的问题。3.4 量产烧录技巧STM32CubeProgrammer与命令行到了产品量产阶段烧录的效率、可靠性和数据一致性就是第一位的。我不建议量产工人用IDE逐个点击烧录正确姿势是使用厂商提供的命令行工具。STM32CubeProgrammer的CLI命令结构大概是这样的STM32_Programmer_CLI --connect portSWD modeUR --download firmware.hex --verify --optionbytes RDP0xAA这段命令的含义我拆一下--connect指定连接方式是SWD口modeUR表示用户模式下复位释放如果芯片被读保护锁住则需要换成modeHotPlug热插拔方式或者用under-reset模式--download加上固件文件路径并指定--verify烧录完成后读回Flash与源文件比对这一步一定不要省--optionbytes RDP0xAA是把读保护设置成Level 1防止产品被直接读出固件逆向。量产时还要考虑序列号写入。常见做法是让固件从固定的Flash地址读取产品序列号然后在量产命令行里根据每个产品单独写序列号。STM32CubeProgrammer可以支持STM32_Programmer_CLI --connect portSWD modeUR --writeaddr 0x0800F000 data0x00000001这样生产线上每台设备都能往备份区烧入自己唯一的序列号。实际生产线里为了保证速度还可以用J-Flash的批处理模式预先创建烧录工程把下载、校验、序列号写入全部编排好工人只需要扫条码点一下确认机器就自动完成所有烧录操作。不过这里一定要提醒一个坑量产烧录环境里静电防护和供电稳定非常关键。生产线上人员走动频繁静电造成芯片烧录失败的不在少数。我见过一个工厂一次烧录返修率突然飙升排查发现是烧录工位没有按规定佩戴防静电手环冬天干燥环境下静电把芯片IO打坏了。这种问题有时候并不会立刻体现而是烧录完初期工作正常过几个星期出现实际故障排查起来极其被动。4. 常见问题与排查技巧实录面试也爱考实操做多了总会碰到各种诡异问题。这一节我按问题类型把第一次遇到会让人崩溃的典型故障整理出来顺便说一下哪些坑其实是面试官最爱问的。4.1 连接不上目标芯片怎么办这是烧录调试环节最高频的报错什么No target connected、Cannot access target、Error connecting to the target都是一个意思调试器没能和目标芯片建立握手连接。遇到连接不上千万别慌按照我的排查顺序走一遍第一步万用表量电压。确认目标板的VDD确实有电地线确实共通。很多开发板用USB供电插上去指示灯亮但芯片没供电的情况我也碰到过实际上是指示灯供电和主控供电分开的两路电源。第二步检查接线。SWDIO和SWCLK有没有接反杜邦线是不是接触不良很多新手会把杜邦线插歪看起来插进去了其实针脚没有完全导通。接头处用万用表蜂鸣挡量一下最保险。第三步降低SWD速度再试。把Max Clock调成100kHz很多目标板上有大电容或者接线太长导致信号波形畸变低频率能大大提高容错率。我自己的经验是接线长度超过20厘米SWD速度就老老实实降到1MHz以下不然就是给自己挖坑。第四步尝试Connect under reset或HotPlug模式。这个我前面强调过芯片死锁、低功耗模式、SWD引脚被复用成GPIO的情况都需要复位瞬间抢连。Keil里在调试器设置页面把Mode改成Under Reset然后勾选Connect under reset通常能救回来。如果还不行就按住目标板复位键点下载的同时松手时间配合好的话也能抢到连接窗口。第五步检查芯片保护状态。很多批量烧录过的芯片设置了读保护RDP Level 1调试器无法读取内核信息自然会连接失败。这种情况用STM32CubeProgrammer连接时它会提示读保护状态选择解除保护即可。但是要注意解除Level 1读保护会触发全片擦除固件数据会丢不要在有重要数据的时候轻易操作。第六步排查调试器本身。如果以上都试了还是不行找一块已知完好的开发板插上去试试如果还是连不上大概率是调试器坏了。ST-Link V2山寨货烧芯片是常事J-Link V9我见过固件损坏的用SEGGER官方的J-Link Commander连电脑都识别不到这种就只能重新刷固件或者直接换。4.2 下载失败与程序跑飞的排查下载失败是个大类常见现象是烧录进度条走到某个百分比突然中断报Flash Download failed。除了芯片型号和Flash算法选错之外还有几个容易被忽略的原因。第一个是写保护。STM32的Option Bytes里有一项Flash写保护如果量产时设置了WRPWrite Protection保护了某个Flash扇区调试器烧录时就会卡在那个扇区表现为下载到某个固定地址就报错。解决办法是在STM32CubeProgrammer里清除WRP选项。第二个是输出电压不稳。烧录Flash需要稳定的电压如果目标板的3.3V电源是用LDO从5V转的而5V电源本身纹波很大烧录Flash可能就会间歇性失败。我调试过一块板子一烧录就必失败最后查出来是电源排针虚焊接触电阻大导致电压跌落。这种问题在漫长的排查过程中很容易绕远路。第三个是下载后程序不运行。前面说的Reset and Run没勾选是最常见的。其次检查BOOT0引脚的状态BOOT0拉高时芯片会进入系统存储器启动而不是从Flash启动程序自然不跑。最后看一下复位电路如果复位引脚一直被外部电容拉低程序下载完时复位信号释放不了也跑不起来。程序跑飞又是另一种烦恼。烧录正常断电再上电程序就跑飞或者运行一段时间后自动复位。这种问题我给它分两类一类是代码本身的问题比如栈溢出、中断异常、空指针导致HardFault另一类是硬件复位问题。我遇到过一次就是因为看门狗芯片复位输出接在STM32的NRST引脚上看门狗喂狗不及时导致复位调试时全速运行也看不出问题后来用示波器抓NRST波形才定位到。4.3 调试实战HardFault定位思路提到跑飞就绕不开HardFault。只要你在嵌入式行业待过一段时间肯定都见过程序突然掉进HardFault_Handler死循环的绝望场景。这个也是面试考察调试能力的高频问题面试官会追问你怎么定位HardFault的原因先说结论HardFault定位的关键是恢复故障现场核心是看进入HardFault之前CPU的PC值、LR值、以及压入栈里的寄存器上下文。第一步在HardFault_Handler函数里设置一个断点让程序停在入口处。Keil和GDB都支持。第二步查看调用栈。Keil的Call Stack窗口一般会直接显示出故障前的函数调用链。如果显示为空可以试着从栈里手动回溯。Cortex-M的异常机制会把发生异常时的寄存器现场自动压栈压栈顺序是R0、R1、R2、R3、R12、LR、PC、xPSR所以你能在栈里找到故障发生时的PC值。第三步通过PC值在反汇编窗口或者addr2line工具里定位到具体代码行。比如你在GDB里执行info registers pc lr bt x/10xw $spx/10xw命令查看栈顶数据栈顶开始的偏移位置就是异常压栈的现场算好偏移就能拿到故障PC值。第四步查内核寄存器。Cortex-M3/M4有一个可用的寄存器组其中CFSR寄存器会明确告诉你是总线错误、用法错误还是断言错误。比如CFSR中的IBUSERR表示指令总线错误多半是PC跳到了非法地址MMFAR可能显示内存管理错误发生地址。这个信息对定位问题价值极大。第五步修正并验证。找到具体出错代码行后结合上下文判断是野指针、数组越界还是栈溢出。栈溢出有一种经典现象程序运行一段时间后随机HardFault调用栈栈顶全是乱码。这种情况可以在启动文件里给栈区域填充特定模式比如0xCCHardFault后查看栈区域被覆盖的深度来判断是否溢出。最后提一下如果项目规模较大我见过有人直接引入CmBacktrace这样的开源库把HardFault时的调用栈信息和寄存器现场直接打印出来开发阶段非常省事。但生产版本一定要把这个功能通过条件编译关掉不然会多占用不少Flash和RAM。4.4 低功耗和引脚复用场景的调试低功耗场景是调试器最容易“失联”的场景。芯片进入STOP或STANDBY之后内核时钟停了SWD接口基本不响应。这时候想调试低功耗代码常用的办法有几个第一个办法是前面提到的Connect under reset每次连接时把芯片复位到正常运行模式在启动代码的前几行设置断点然后单步跑进低功耗代码。这种办法需要保证从复位到进入低功耗之间有足够的时间让调试器来得及连上和下断点。第二个办法是临时屏蔽掉进入低功耗的代码等调试完其他功能之后再把低功耗打开这在代码逻辑不复杂的时候挺好用。第三个办法是外接一个IO控制信号让调试器通过复位或者唤醒引脚来触发芯片退出低功耗模式。很多开发板上预留了专门的调试唤醒引脚就是干这个用的。引脚复用也是嵌入式开发绕不开的坑。比如你把SWD引脚配置成普通GPIO去驱动LED或者按键了烧录完第一次能跑但之后你就再也连接不上芯片了。这时候要么用上述复位抢连要么在代码里加入一个延时上电后先让SWD引脚保持调试功能几秒钟等调试器有时间连接再在延时结束后复用成GPIO。这种“软件让出调试口”的思路在实际产品中非常常见。5. 写在最后的经验之谈烧录下载和仿真调试这套工具链看起来只是开发流程里很小的一环但它真的是嵌入式工程师的基本功。我自己曾经在一个项目里花了整整两天去查一个莫名其妙的现象固件下载一切正常但只要开启优化编译程序就会在某个特定函数里跑飞。后来靠断点加反汇编定位到是编译器优化掉了一个关键volatile变量的读写时序从那以后我调试代码就再也不敢随意忽略优化选项了。这种经验教科书上不会写只有每天和调试器打交道才会慢慢积累起来。如果你还在上学或者刚入行建议务必花一个下午的时间把你手上的调试器从接线到软件配置再全部重新过一遍搞清楚每一步是为什么。面试的时候面试官大概率会问SWD和JTAG的区别、Flash为什么要先擦再写、硬件断点和软件断点有什么不同、怎么定位HardFault这些问题如果你真的亲手实操过回答出来会非常自然。如果只是背面试题一旦被追问细节就露馅了。在做量产项目的过程中遇到烧录工具报错不要硬着头皮反复重试先停下来看清楚错误码一步步排查。工具是死的人是活的。我用下来的最大心得就是任何疑难问题只要把“供电、接线、速度、保护状态、工具固件”这几个变量挨个排除90%都能解决。剩下的10%可能就需要动用示波器去抓波形了。真到那一步欢迎你回来再看看这篇文章的排查思路可能会有新的收获。
返回列表