资讯动态

Keil附着调试实战:不复位现场排查MCU疑难杂症

发布时间:2026/10/2 4:44:13 来源:尧图企业网站定制
很多用Keil的兄弟对调试的印象多半停留在“点编译下载F5起跑打断点查变量”这条常规路上。但如果哪天你遇到这么一个问题设备在现场已经跑了几个小时突然表现异常你手头拿着J-Link接上去想让程序停下来看看现场数据——结果常规的Start Debug Session一按芯片被复位了现场状态全没了问题还不一定复现。这时候Keil菜单里那个不起眼的“Attach to Running Program”附着到正在运行的程序才是真正能救场的功能。这个功能做的事其实很简单不下载程序、不复位芯片直接把调试器“贴”到正在运行的MCU上让CPU暂停在当前状态。你就能立刻看到PC指针跑到了哪一行、各个变量是什么值、外设寄存器是什么状态甚至可以用硬件监视点抓出“谁改了这个变量”。对很多疑难杂症比如主循环卡死、偶发性异常、全局变量被莫名篡改附着调试的效率远高于“复位-复现-断点”这条老路。这篇文章我会从附着调试的原理和适用场景讲起然后给出Keil里的完整配置步骤再结合我自己踩过坑的三次实战把这些年用Keil附着调试的经验一次讲透。适合那些用过Keil普通调试、但还没认真试过附着调试的嵌入式工程师尤其是做STM32、GD32这类Cortex-M系列MCU开发的朋友。1. 先搞清楚附着调试到底是个什么操作1.1 传统调试与附着调试的差别很多工程师用了几年的Keil都没点过“Attach to Running Program”这个选项原因很简单常规调试已经能满足90%的开发阶段需求。但“能满足开发”不等于“能解决现场问题”这两件事差别很大。常规调试Start Debug Session启动时Keil默认会做三件事复位目标芯片、把编译好的固件下载到Flash、然后把PC指针指向Reset_Handler。这个流程的好处是环境干净、状态可控非常适合开发阶段验证逻辑。坏处也明显——它把现场“重启”了RAM里的数据、外设状态、寄存器当前值全部清零重来。很多偶发问题恰恰只在特定运行上下文里才出现一复位就再也抓不到。附着调试的逻辑完全不同。它假设芯片已经在运行你要的程序调试器只负责“挂”上去把CPU暂停住然后读取现场的寄存器、内存和外设状态。整个过程不碰Flash、不触发复位运行现场被原封不动地保留下来。对比项常规调试附着调试是否复位芯片通常会复位到main入口不复位保持当前运行现场是否下载固件默认会更新目标Flash不下载程序初始状态从入口暂停等待单步直接暂停在当前执行位置适用场景开发阶段断点调试现场排查、运行中观测、疑难杂症复现为什么能做到这一点得从Cortex-M内核的调试架构说起。Cortex-M系列芯片内部都有调试访问口DAP通过SWD或JTAG引脚和外部调试器通信。调试器往内核的调试寄存器DHCSR里写入C_DEBUGEN调试使能和C_HALT请求暂停这两个控制位就能让CPU停在当前指令边界上。附着模式其实就是只做这一步“暂停请求”其他操作一概不碰所以现场不丢。这个原理听起来简单却是整个附着调试一切能力的基础。1.2 适合用附着调试的三种典型场景第一个场景是系统“半死”状态。主循环卡死了但中断还在跑现象就是灯还在闪、通信偶尔有响应、但主要功能瘫痪。常规做法只能复位后盲试复杂度很高。附着之后看一眼PC指针和调用栈通常几秒钟就能找到卡住的那行代码。第二个场景是现场长跑设备不能复位。有些设备采集的数据是连续累积的复位一次就丢几小时的上下文。或者是生产流程中的设备停机一分钟都会造成损失这时候只能在运行状态下“贴”上去看。附着调试不会打扰系统流程只是观察一下看完把CPU一放它继续跑。第三个场景是多核或多任务协同。比如你在调一块双核芯片其中一个核跑实时控制另一个核跑上层逻辑。你只想看上层逻辑不想让控制核停下来那常规调试一复位就把整个芯片重启了显然不行。附着调试可以单独挂住其中一个核另一个核继续跑自己的业务。还有一个容易被忽略的场景程序已经优化得比较激进在某些高优化等级下常规断点可能不准确你怀疑是编译器把代码排布得和源码对不上。这种时候附着上看PC指针和反汇编窗口往往比一遍遍设断点更直接。2. 在Keil里配置附着调试三处勾选一次搞定2.1 先确认硬件与驱动状态在动手配置之前得先过一遍硬件准备不然设置半天连不上很浪费时间。调试器和目标板的物理连接走SWD时至少需要四根线SWDIO、SWCLK、GND还有一根VCC参考电压线用来让调试器识别目标板的工作电平。有些板子会额外引出NRST复位线这个对常规调试不是必须的但如果你用的是ST-Link有时“Connect under Reset”模式需要接NRST附着模式下通常不需要。供电方面要特别注意如果是用独立调试器J-Link、DAP-Link建议不要靠调试器给目标板供大电流目标板用自己电源供电调试器只做信号连接。我在展会现场见过有人用J-Link给整块驱动板供电结果电流不够导致芯片进入异常复位循环还以为是固件写崩了。还有一种常见坑是芯片被读保护了。很多Cortex-M芯片默认开了调试口读保护比如STM32的RDP级别级别一旦设为1调试器只能连接但读不到Flash内容附着进来之后Flash区域全是0xFF变量信息对不上。碰到这种情况先检查芯片的安全级别该解锁就解锁但解锁操作本身会擦除芯片得有心理准备。2.2 核心配置Debug设置里的Attach选项硬件确认没问题后Keil里的配置其实不算复杂。以MDK 5.x版本为例完整步骤如下第一步打开工程后按AltF7打开Options for Target切换到“Debug”选项卡。在右上角“Use Debugger”区域下拉选择你用的调试器常见的有J-LINK、ST-Link Debugger、CMSIS-DAP等。选完后点击右边的“Settings”按钮。第二步在调试器设置对话框里找到“Debug”标签页。这里能看到一个“Attach to Running Program”复选框勾上它。不同调试器驱动的界面措辞可能略有不同比如有的版本叫“Attach”有的叫“Hot-Plug”但意思都是“不要复位、只做连接”。这一步是整个附着调试配置的核心。第三步回到Debug选项卡主界面看右下角有一个“Load Application at Startup”复选框建议取消勾选。这个选项的意思是启动调试会话时把当前编译的axf文件加载到目标内存里做符号映射。符号映射本身有用但“Load Application”在某些驱动下会触发内存写入对运行中的程序有干扰。取消它不影响变量查看Keil照样能读axf里的符号信息。第四步切到“Utilities”选项卡把“Update Target before Debugging”取消勾选。这个是用来控制“调试前自动烧录”的默认勾选状态下你一按调试按钮它会先擦除并烧录Flash那附着调试的“不打扰”就白搭了。完成这些设置后直接点击工具栏上的Start/Stop Debug Session按钮快捷键CtrlF5调试器就会以附着模式连上正在运行的芯片CPU被暂停你就能干活了。这里想多说一句如果你在常规开发调试和附着调试之间频繁切换最好保存两套工程配置。我一般会在工程里放两份调试配置一套正常Debug下载复位一套Attach附着不下载用的时候切换一下省得每次来回改勾选。2.3 快捷方式与版本差异提醒有些新版本MDK的调试按钮旁边有一个下拉小箭头展开后能看到“Start Debug Session”和“Without Downloading”之类的选项。但说句实话下拉菜单里的这些快捷方式在不同小版本里差异挺大有的不显示Attach选项。我自己更推荐的做法是老老实实进Settings里勾选“Attach to Running Program”因为这是驱动器层面的行为控制最稳定。如果你用的是J-Link还有一种更底层的做法先打开J-Link Commander新版叫JLink.exe的命令行工具连接目标时会询问是否使用attach mode选“y”就能进入附着模式。但日常在Keil里做开发没必要绕到命令行Keil的图形化界面已经够用了。另外提醒一下配置完成后如果发现附着时Keil提示“Cannot access target”先别急着怀疑配置。把SWD速率调低一点比如从默认的10MHz降到1MHz或4MHz这个问题能解决一大半。长线缆、飞线连接、PCB布线质量一般的时候高速SWD很容易握手失败。3. 附着之后你能看什么、不能碰什么3.1 附着调试的核心能力变量、寄存器、外设、断点附着成功之后CPU默认是暂停状态。此时绝大多数常规调试能力都是可用的按F11单步、F10不进入函数单步、F5全速运行、在Watch窗口查看和修改变量、在Memory窗口查看任意地址内容。查看变量最直接。在源码编辑窗口里把鼠标悬停在某个变量上会弹出它的当前值。或者打开Watch窗口View - Watch Windows - Watch 1手动输入变量名回车就能实时跟踪。在附着模式下这些变量值不再是“开发板刚上电的初始值”而是系统运行了若干小时后的真实状态。这里能看到的信息含量远比常规调试里刚复位的初始状态高得多。寄存器查看有两个维度。第一个维度是内核寄存器调试工具栏里的Register窗口可以看到R0-R15、PSP、MSP、LR、PC这些。第二个维度是外设寄存器我强烈推荐用Peripherals菜单下的System Viewer比如选择GPIOA、USART1、TIM2这些外设它会图形化地显示每个寄存器的每个位域当前值。排查问题的时候这个窗口比看变量还快。比如你想知道USART到底有没有收到数据直接看USART_SR寄存器的RXNE位就知道了不用费劲去查变量。断点在附着模式下也是可以设置的但有限制具体见下文的坑。另外还有一项很强大的能力硬件监视点也叫Watchpoint。这是Cortex-M内核DWT单元提供的功能可以监视某个内存地址或变量的读写操作。附着模式下设置一个数据监视点一旦程序改写了该地址CPU会立刻停下来你就能抓到“谁动了我的变量”。这在排查全局变量被异常篡改的问题时几乎是唯一高效的手段。3.2 Watch窗口的使用技巧结构体变量与复杂表达式新手在Keil的Debug模式下经常问的一个问题就是怎么显示结构体变量其实非常简单。在Watch窗口的输入框里直接输入结构体变量名比如“gDevice”按下回车Keil会自动列出它的所有成员点成员前面的三角箭头还能继续展开嵌套结构体。如果你的结构体变量是个指针输入“gDevice”可能只显示一个地址值那就要输入“gDevice”或“(DeviceType *)0x20000100”这种表达式强制解引用后展开。如果你关心的是数组里某个元素输入“buffer[5]”就行想看数组全部内容可以用Memory窗口在地址栏输入数组名然后右键设置显示格式Hex、Signed、Unsigned、ASCII等。比如你想看一个float数组在Memory窗口右键选“Floating Point Numbers”就能直接看到浮点值。还有一个常被忽略的点了有些结构体变量在开启高优化等级后被编译器优化掉了Watch窗口显示“ ”这时候变量本身可能已经被分配到寄存器里而非内存中。解决思路有三个第一把优化等级降下来好多工程甚至专门准备一个Debug配置用O0编译第二把关键变量声明为volatile防止被优化第三从外设寄存器的值反推状态尤其是那些和硬件强相关的变量。3.3 附着模式的禁区别指望在附着会话里烧录附着模式能做的事情很多但禁区也必须说清楚不然容易踩出事。第一不要在附着会话里点Flash Download按钮也不要做任何会擦写Flash的操作。附着模式下目标Flash内容属于运行现场的一部分你贸然去烧录轻则烧录失败重则把正在跑的程序覆盖掉现场彻底丢光。想更新程序就退出调试、正常下载、然后重新附着。第二不要随手点Reset按钮。附着调试的价值在于保留现场一旦复位现场清空了而且程序会从Reset_Handler重新开始跑你附着的意义就不存在了。每次复位后如果想再看运行状态得重新附着一次。第三不要指望附着模式下能“在线修改程序”。Keil不允许在调试状态下直接改C代码并热更新你手动改内存里的指令也可以但极其危险容易把系统搞崩溃。调试的本质是观测和定位改代码还是要回到正常开发流程里完成。第四硬件断点数量有限。Cortex-M0、M3、M4这类内核的FPB单元通常只提供4个硬件断点寄存器具体数量取决于芯片厂商实现。如果在附着模式下设置了超过数量的断点Keil会报错“Cannot set breakpoint”或者“Only 4 breakpoints allowed”。软件断点虽然理论上不受数量限制但软件断点要靠修改Flash里的指令来实现在运行中的系统上并不总是可行。所以附着模式下设置断点要精打细算建议只设1-2个最关键的切入点。3.4 单步跟踪与实时运行的切换逻辑附着模式下CPU的暂停和运行是互斥的。暂停之后你可以单步但别忘了系统的外部事件还在发生。比如USART还在接收数据、定时器还在计数前提是时钟没停、看门狗可能还在倒计时。你单步时系统时钟如果继续跑外部状态会一路变化这既可能是好事你能看到实时状态也可能是坏事看门狗超时导致复位。Cortex-M内核在调试暂停状态下CPU时钟是停的但部分外设时钟可能继续跑具体取决于芯片的时钟树设计。这里有个实用建议当你打算单步跟踪一段逻辑时先把可能干扰的外设停掉或屏蔽掉中断当你只是想“暂停看一眼”时看完马上F5继续运行别长时间停在原地。真要看现场状态看一眼拍个照截屏再继续运行比长时间挂起安全得多。4. 实战记录三次用附着调试解决难缠问题的过程4.1 案例一主循环卡死但中断还活着有一回做一块STM32F103的控制板现场反馈“设备死机了”但奇怪的是板上一个LED还在以1Hz频率闪烁。LED是定时器中断里翻转的说明中断还在正常执行可主功能已经停止响应。我带着J-Link到现场用附着模式接上CPU停在当前位置。打开Register窗口看PC指针发现它指向一个几十行的while循环里。再打开源码对照是一条while(flag 0)的空等待。flag值我看了一眼是0说明等待条件一直没满足。那这个flag应该在哪被置1搜代码发现在串口接收中断里。我再打开System Viewer找到NVIC和内核寄存器发现全局中断的PRIMASK被置了1中断被屏蔽了所以串口中断根本进不来。问题锁定在“某个库函数意外关闭了全局中断且没有恢复”。最后翻代码发现是某次改动后调用了一个带临界区保护的函数临界区退出函数在另外一处配置里被条件编译给去掉了。这种问题用常规调试法很难复现因为一复位PRIMASK就清零了当场恢复正常只有附着调试才能在当前状态下看到中断屏蔽位是置位的。整个过程定位不到十分钟而用老办法折腾了半个下午。4.2 案例二现场偶发告警靠附着确认运行数据另一个印象很深的项目设备每运行几小时会出现一次偶发告警告警原因五花八门客户技术员也说不清触发条件。这种问题最怕的就是你在实验室里怎么跑都不复现一到现场偶发一次又抓不到证据。我带着笔记本和调试器跑到现场先把附着模式配好。等到设备再次告警时我没有复位而是直接附着暂停先看主状态机的当前状态变量发现它跳到了一个异常状态。顺着异常状态的入口条件看到一个温度传感器的滤波值超限标志被置位。但奇怪的是传感器显示的实际温度在正常范围。于是我怀疑滤波算法被干扰。打开信号量等指标发现这个滤波函数的系数在运行过程中被另一个任务的写操作覆盖了。我设置了一个WATCHPOINT监视滤波系数所在地址的写操作然后让程序继续跑。没过多久CPU就停下来了调用栈里清清楚楚地显示是某个通信协议解析函数在往这个地址写数据。原来两个全局变量定义位置靠在一起存在一个数组越界写操作把滤波系数的内存给串改了。这种问题如果你用常规调试等于把设备重启后等着它再跑几小时复现还不一定每次都能抓到。附着调试WATCHPOINT配合相当于给现场装了一台“因果记录仪”。4.3 案例三FreeRTOS任务挂死用附着查看任务调度状态第三个案例和RTOS相关。一个基于FreeRTOS的STM32F103C8T6小项目里面开了几个任务某天客户反馈系统运行一段时间后“某个功能不再响应”但其他功能正常。如果对整个芯片复位一切恢复跑一段时间问题又出现。我附着后先看当前CPU停在哪条指令然后打开FreeRTOS的任务链表区在Memory窗口里定位到当前任务控制块TCB查看其任务状态和栈指针。结果发现那个不响应的任务状态是“阻塞”blocked而且阻塞在一个信号量上。这个信号量的释放代码在另一个任务里我对那个释放代码设断点继续全速运行发现释放代码被一个条件判断挡住了而那个条件依赖的变量在某种情况下一直是假。后面通过附着模式反复暂停查看变量确认是某次通信异常导致标志位没被清除。这个问题如果只靠串口打印也能查但会改动代码、影响实时性而且要在现场等复现。附着模式让我不用动一行代码就直接看到了运行时任务调度的完整画像。对RTOS项目来说附着调试的价值比裸机项目更大因为任务栈、TCB、就绪列表这些数据结构和系统状态高度相关停机观测比日志打印更精确。5. 附着调试最容易踩的六个坑5.1 看门狗捣乱附着后芯片反而复位了这是做附着调试最容易被坑的地方。很多产品里都开了独立看门狗IWDG它用的是芯片内部独立的低速时钟像STM32的LSI约40kHz左右这意味着即使CPU停了、内核时钟停了看门狗计数器依然在走。如果暂停时间超过看门狗超时时间芯片直接复位附着现场全丢。解决办法有三种。第一种最简单调试前在初始化代码里把IWDG关闭但这会改变待测程序的运行条件不严谨。第二种是临时修改看门狗超时时间调得很长比如从1秒改成30秒给调试留足时间。第三种比较优雅利用STM32的DBGMCU调试寄存器设置DBG_IWDG_STOP位让芯片在调试暂停时冻结看门狗计数。注意这是STM32体系的做法其他MCU不一定有对应寄存器得查芯片手册的Debug支持章节。5.2 优化等级太高变量直接消失高优化等级下局部变量可能完全被优化到寄存器里Watch窗口显示“ ”调用栈信息也会失真。尤其在附着模式下你看到的是“真实运行的现场”而真实运行现场往往是开启优化后的形态这反而比常规调试更接近用户场景。应对方案是预先准备一个调试点充足的固件。如果产品需要现场维护我一般会在发布版本里保留一部分调试符号或者至少把关键变量声明为volatile放在固定的全局地址上方便附着后直接查看。纯粹依赖Watch窗口看未加修饰的局部变量在高优化等级下多半会失望。5.3 断点不生效或数量不足在附着模式下设置断点最常见的问题是断点很快就不命中了。原因可能是代码在Flash里执行硬件断点FPB数量有限也可能是断点所在位置被编译器优化了实际没有对应指令。另一个坑是如果你设了某些软件断点调试器需要往Flash里临时写入BKPT指令这在附着模式下很可能做不到于是Keil会提示“Cannot set breakpoint”。我的经验是附着模式下优先使用硬件断点而且设置前先确认代码地址范围最好在反汇编窗口里核对一下实际生成的指令。如果硬件断点确实不够用就改用WATCHPOINT做数据监视往往效率更高。5.4 SWD连接不稳定附着失败附着失败最常见的物理原因是SWD信号质量差。线太长、飞线、杜邦线质量差、目标板电源纹波大都会导致握手失败。前面提过第一步先把SWD速率调低比如调到1MHz。第二步检查VCC参考线SWD协议需要调试器知道目标板电平VCC接错或没接会导致逻辑电平误判。还有一种情况是目标芯片进入了低功耗模式。许多MCU在进入STOP或STANDBY模式后会把调试时钟也关了这时候SWD口完全没法访问。STM32在DBGMCU寄存器里提供了DBG_STOP、DBG_SLEEP等位允许低功耗模式下保持调试时钟开启。这需要在代码里显式配置。如果芯片处于一种“休眠-唤醒”循环的场合附着调试前要确认这些位设置好了。5.5 Attach模式下的复位陷阱有些调试器的驱动默认连接行为会先复位目标。如果设置不对你以为“附着”了实际上芯片已经被复位重启了。我见过同行在Keil里选了J-Link没勾选Attach程序正在跑的时候他点了Start Debug Session板子当场重启他还以为这是正常的“附着”。要避免这个问题一是确认Settings里勾选了Attach二是下载程序时要保持目标板先进入常规调试状态之后再切换成附着调试。如果调试器复位信号线没有接常规调试也可能连接失败这时候Keil的提示信息一定要看仔细它通常会告诉你“Cannot access target”。5.6 多核芯片和国产MCU的差异现在很多新芯片是双核甚至多核像STM32H7系列有Cortex-M7加Cortex-M4有些SoC如RK3568内部集成多个核心。这类芯片的调试逻辑和单核MCU有差异附着调试通常会让你选择附着哪个核不同核的复位域也可能独立。操作前先看参考手册的Debug章节确认每个核的调试寄存器地址以及复位控制是否共享。国产MCU这几年也用了不少像GD32、AT32、CH32这些内核基本都是Cortex-M3/M4/M0调试接口和协议与ST的类似但一些底层细节会有差异。我踩过GD32的坑它的SWD端口在某些复位状态下需要先用“connect under reset”模式恢复否则附着时握手失败。碰到国产MCU先别照搬ST的经验优先看官方提供的Keil调试说明或pack包里的文档。6. 一把好用的补充工具6.1 串口调试助手与日志打印的配合附着调试不是万能的它适合看瞬时现场但长时间的趋势监控还是要靠日志。实际项目中我经常把串口调试助手比如SSCOM这类工具和附着调试搭配使用串口助手负责长时间记录运行日志、打印关键事件附着调试负责在故障发生时“现场拍照”。具体做法是程序里预留一个可开启的调试通道平时接口打印精简日志比如任务切换、错误码、关键参数这些日志通过UART发到电脑上的串口助手保存。等到故障出现通过日志缩小到大致模块再用附着调试去深度查看。两条腿走路定位效率明显高于只用一种方法。6.2 GDB、RTT、OpenOCD这类替代方案的定位Keil之外也有别的调试手段但通常是一套独立的工具链。OpenOCD配合GDB可以做类似的“attach”操作命令是target remote连接后用monitor reset halt来控制目标状态。这种方式在Linux嵌入式开发里更常见比如自带GDB服务器调Linux内核或应用程序。说实话在这种环境里“调试正在运行的程序”就像喝水吃饭一样常态GDB的attach命令在Linux进程调试里作用非常直接。Keil的优势在于图形化界面和与硬件寄存器、外设的深度集成。如果你只在Keil生态里做MCU开发没必要为了“附和”概念去换工具链。但如果你做Linux用户空间程序调试GDB的attach是绕不开的。SEGGER的RTT Viewer也值得一提。J-Link连接目标板时RTT可以不需要目标板的串口就能打印日志它通过调试接口与芯片内存通信。这对于板子上没有引出串口的场合很有用在附着调试的同时也能看RTT日志相当于同时拥有“运行日志”和“现场快照”。6.3 别忘了System Viewer这个神器前面提过Peripherals菜单下的System Viewer这里再展开一点。它把外设寄存器按位域图形化显示实时更新比如你看USART的数据寄存器、状态寄存器就能知道当前收到了多少个字节有没有校验错误看TIM的计数器值、预分频值就能判断定时是否准确看GPIO的输入状态就能确认外部信号到底拉高了没有。在附着调试现场它最大的价值是能快速确认“硬件层状态”和“软件层变量”之间的对应关系。软件变量可能因为缓存或优化而滞后外设寄存器反映的是硬件真实状态。两者一对照很多问题是软件问题还是硬件问题当场就能分辨。6.4 结合RTOSFreeRTOS调试任务状态做FreeRTOS这类RTOS项目时附着调试的体验会有一点点不同。因为CPU暂停时当前执行的可能只是某一个任务你只看当前函数栈未必能明白其他任务的状态。这时候要在Memory窗口里手动找任务控制块TCB或者把pxCurrentTCB这个全局变量加到Watch窗口逐个查看任务状态、栈指针、阻塞原因。比较实用的做法是先在程序里保留一个“系统状态结构体”周期性地收集各个任务的运行状态信息任务句柄、任务名、剩余栈空间、当前状态附着调试时直接看这个结构体。虽然不是实时更新但故障时刻的状态快照足够定位问题了。Keil的RTX系统有内置的RTOS调试插件体验更顺滑但FreeRTOS在μVision下并没有特别深的集成手动查TCB或者依靠SEGGER SystemView是现实选择。最后分享一点个人经验做嵌入式这些年我用附着调试解决过不少让同事挠头的现场问题。最开始我也觉得这个功能有点鸡肋——正常调试都用得好好的何必多此一举。直到第一次在客户现场用附着模式看到了一眼“系统当前瞬间”的真相才意识到对于运行中系统的故障排查来说这个功能才是最高效的那条路。现在我的工作习惯是每做一个可交付的嵌入式项目都会额外编译一个含调试符号的释放版本固件确保现场出问题时可以拿调试器附着上去看到有价值的信息。开发环境的工程里也会单独存一份“Attach模式”的调试配置平时不打扰到关键时刻一键切换。最后再给个小技巧Keil调试页里SWD时钟可以调低我在现场长线连接时一般先设4MHz左右附着成功率会高很多。附着成功后如果需要正常下载调试再改回高速。这种小细节文档里很少会写但往往就是决定你能不能在客户面前体面收场的关键。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑