ARTICLE DETAIL

资讯详情

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

APM32F003F6P6烧录失败?JLink与Keil版本兼容性排查完整指南

APM32F003F6P6烧录失败?JLink与Keil版本兼容性排查完整指南 先把话说在前面APM32F003F6P6这颗料本身没什么问题问题几乎都出在工具链版本这三个字上。最近我在踩这个坑的时候发现网上说的基本都是只言片语要么只讲更新驱动要么只讲改一个配置没人把JLink、Keil、Pack、Flash算法这几层版本关系一次讲透。这篇文章我就拿我自己手上的APM32F003F6P6开发板把整个排查过程、报错现场、最终解决方式完整记录下来。不管你手里的项目是刚画完板子准备烧第一个程序还是已经烧到一半突然开始闪退按下面这个顺序排查基本都能收尾。1. 先搞清楚APM32F003F6P6是什么料JLink版本不兼容到底卡在哪1.1 这颗MCU的定位与调试接口APM32F003F6P6是极海半导体Geehy推出的Cortex-M0内核32位MCU主频最高48MHzFlash 32KBSRAM 4KBTSSOP20封装。这颗料在市场上的定位很明确就是替代传统8位机、兼顾32位性能的低成本方案常用于小家电控制、充电器、电机调速、传感器采集这类场景。成本低、供货稳所以很多团队在选型阶段直接把它列为备选。既然内核是Cortex-M0调试接口走的就是SWDSerial Wire Debug协议。它不像老式JTAG那样动辄十几根线SWD最少只需要两根线——SWDIO和SWCLK再配合地线和目标板供电引脚的参考电压就能完成烧录和调试。理论上只要你的调试器支持ARM Cortex-M调试比如JLink、ST-Link、CMSIS-DAP都能连上这颗芯片。但理论上能连和实际烧录不报错之间隔着整整一条版本兼容性的河。1.2 版本不兼容的三种典型形态我这次踩坑最开始以为就是JLink驱动版本老旧后来发现根本不是单点问题。总结下来JLink版本不兼容这个说法至少包含三种完全不同的情况症状不同解法也完全不同。第一种是SEGGER JLink驱动版本过旧不认APM32F003的芯片ID。这种情况最直接的表现是Keil里点击Download之后报错Error: Flash Download failed - Target DLL has been cancelled或者Connect failed甚至干脆提示找不到目标设备。原因是JLink驱动内置的Device支持是有时效性的老驱动认识ST、NXP这些老牌厂商的芯片但对极海这种新入局的国产型号覆盖不全。APM32F003系列本身推出时间不算长JLink驱动得V7.80以上才比较稳妥。第二种是JLink驱动版本过新与Keil内置的DLL产生冲突。这个更阴险症状表现为Keil一打开烧录窗口就直接闪退或者弹窗提示JLinkARM.dll initialization failed。我一开始完全没想到是驱动太新导致的问题毕竟在我的认知里软件越新越好。但Keil的调试链路不是独立的它依赖JLinkARM.dll在IDE和调试器之间做桥接。这个DLL由SEGGER安装程序写入Keil目录而新版DLL往往用了更新的MDK Core接口如果Keil版本还停留在5.30以下两边版本对不上程序就在加载DLL这一步直接崩了。第三种是Flash编程算法Flash Algorithm缺失或不匹配。这种情况Keil不会闪退也不会连接失败而是走完连接流程后在擦除或写入Flash时卡住然后报Cannot load flash programming algorithm或Error: Flash Download failed - Cortex-M0。APM32F003F6P6的Flash算法并不在Keil默认的安装包里极海官方是单独以PackDFP形式提供的。如果你安装的是通用CMSIS Pack或者只装了别的型号的PackKeil根本找不到匹配的Flash算法烧写自然进行不下去。所以版本不兼容是一顶大帽子下面藏着驱动版本、DLL版本、Pack版本三个具体问题。下面我就按这个逻辑线从环境准备到最终排障完整走一遍。2. 动手前的环境准备版本清单和安装顺序2.1 硬件连接SWD四根线之外别忘了RESET排查软件问题之前先把硬件底子打好。APM32F003F6P6的SWD调试接口标准接法是四根线SWDIO、SWCLK、GND、VCCVTref。很多人只接三根线觉得VCC可不接但实际上JLink内部有个电压检测电路需要通过目标板的VCC引脚读取参考电压。如果不接VCCJLink看到的VTref是零它会误判目标板没上电直接报错Target voltage not detected。除了这四根线我强烈建议把RESET引脚也接上。原因在于APM32F003F6P6在极端情况下——比如代码把SWD引脚复用了、或者程序进入低功耗模式——SWD口会失去响应。这时如果RESET连到了JLink的RESET引脚就可以在Keil的Debug设置里勾选Connect under Reset通过拉低复位线让内核停在复位状态再强制接管SWD。我测试下来这个功能在救砖场景里的成功率非常高特别是芯片内部跑了一个把时钟搞乱的程序时。连接线材方面有一点经验分享SWD线尽量控制在15厘米以内超过这个长度在高速模式下容易受到干扰导致连接时好时坏。我踩过这个坑当时用了一根三十厘米长的杜邦线JLink在烧写过程中时不时掉线还以为是驱动问题排了半天才发现是线太长。后来换成短线问题立刻消失。2.2 软件版本搭配Keil、JLink驱动、Pack三者什么关系硬件接好之后进入软件环节。这里先帮大家理清楚三个软件组件的关系因为很多新手搞不懂为什么装了一个软件还不行。第一是Keil MDK也就是IDE本身。APM32F003是Cortex-M0内核必须用MDK-ARM版本不能用古老的C51版本。我当前用的是MDK 5.38配合APM32F003的Pack没有任何问题。如果你的Keil还是5.20这种老版本建议先升级到5.36以上因为后面要装的SEGGER新驱动对MDK Core有最低版本要求。第二是SEGGER JLink驱动。注意JLink驱动不是只有装了就行它有明确的版本关系Keil通过目录下的JLinkARM.dll调用调试器而SEGGER安装程序通常会用新版DLL覆盖这个文件。所以驱动版本会直接影响到Keil的稳定性。我这次最终确定使用的驱动版本号是V7.96配合MDK 5.38一切正常。如果你暂时不想动Keil版本那么驱动版本就要反过来将就老Keil具体我会在第三章详细说。第三是极海APM32F003的PackDFP。这个包在极海官网可以下载也可以从SEGGER的Device支持列表里找到下载入口。Pack里面包含了APM32F003系列所有型号的SVD描述、Flash编程算法、Device定义等。没有这个Pack你在Keil的Device列表里连APM32F003F6P6都找不着烧写更是无从谈起。安装顺序上我建议是先装Keil MDK再装APM32F003 Pack最后装JLink驱动。如果是重装系统后的新环境尤其注意这个顺序。如果先装JLink驱动再装Keil有概率出现Keil无法识别JLink DLL的情况虽然可以手动指向路径但没必要给自己添堵。3. 实操解决从升级到降级的完整方案3.1 常规解法升级JLink驱动到V7.96并重新安装Pack如果你的APM32F003F6P6现在报的是Connect failed或者Target DLL has been cancelled大概率是JLink驱动太旧不认这颗芯片。处理方式很简单去SEGGER官网下载最新版JLink驱动我写这篇文章时用的是V7.96。安装之前先卸载旧版本重启电脑再安装新版。装完驱动后还有一个关键动作——检查APM32F003 Pack是否在Keil里正确注册。打开Keil点击菜单栏的Project - Manage - Pack Installer在搜索框输入APM32F003。如果右侧列表能显示出Geehy APM32F003系列Pack说明已经安装没有的话点击Install按钮安装。这一步做完再回到Project工程里右键点击目标芯片型号确认Device列表里选中的是GeehyAPM32F003F6P6而不是随便选的一个Cortex-M0通用设备。我见过有朋友图省事Device直接选了ARMCM0导致Flash算法永远配不对烧写一直报错。这里不能省事Pack装好之后Device一定要选极海自己的型号。3.2 老Keil环境的保底方案降级JLink驱动公司里的老项目如果绑定了Keil MDK 5.23这类老版本而你又必须用JLink给APM32F003F6P6烧程序那就麻烦了。新版JLink驱动V7.60以上对老Keil支持不好装进去之后老Keil可能直接闪退或者报DLL初始化失败。我的建议是这种情况下JLink驱动不要一味追求最新找一个V6.80e或V6.86b这类相对稳定、且支持Cortex-M0的版本就够用了。V6.x版本的JLink驱动对MDK Core的依赖没那么强兼容老Keil的同时也认识Cortex-M0的基础调试指令。不过需要注意的是V6.x驱动未必内置APM32F003的Device ID所以连接时可能会识别为Cortex-M0而不是具体的芯片型号但这不影响基本烧录因为只要内核能识别、Flash算法能匹配程序照样能烧进去。实际操作中你可以在SEGGER官网下载历史版本。装完老版本驱动后打开Keil工程转到Options for Target - Debug选项卡确认右侧下拉框选的是J-LINK/J-TRACE Cortex。然后打开旁边的Settings看一下调试器识别到的Device信息。如果显示的是Cortex-M0说明驱动正常接管了调试器可以继续下一步。3.3 用J-Link Commander先做体检很多人在Keil里一通点报错窗口弹出来就懵了。其实最快的定位方法是用SEGGER JLink自带的命令行工具——J-Link Commander先独立验证调试器能不能连上APM32F003F6P6。为什么要先做这一步因为这样一来你可以把硬件链路问题和Keil软件配置问题彻底分开。打开J-Link Commander的操作步骤如下用USB线把JLink连接到电脑同时把JLink和目标板通过SWD连线接好目标板上电。打开命令行输入JLink.exe并回车前提是JLink驱动安装目录已在系统PATH中。如果没有加入PATH可以到安装目录下手动运行JLink.exe。此时程序会提示选择目标芯片型号。如果输入apm32f003看能不能匹配到具体型号。如果匹配不到输入cortex-m0也可以然后再确认连接参数。连接成功后命令行会显示当前目标的IDCODE、内核类型、Flash大小等信息比如Cortex-M0 identified。如果J-Link Commander报连接失败那问题基本出在硬件连接或JLink自身跟Keil没半毛钱关系。回到第二章的硬件排查清单查接线、查供电、换线材。如果这里能连上但Keil里就是连不上那问题锁定在Keil的DLL配置或者Pack上回第三章的3.1节重新排查。这一步真的建议大家养成习惯不要一上来就在Keil里点来点去会浪费很多时间。4. Keil里烧写APM32F003F6P6的关键配置4.1 Debug设置别让DLL版本拖后腿硬件没问题、JLink也能连上APM32F003F6P6之后烧写还不成功那就要检查Keil里的调试器配置了。打开工程菜单Options for Target快捷键是AltF7切到Debug选项卡右侧下拉框选择J-LINK/J-TRACE Cortex。很多朋友选择之后就直接去点Download这其实漏掉了最关键的设置。点击旁边的Settings进入调试器设置窗口。这里有几个地方必须确认第一个是端口模式。右上角Port下拉框要选SW不是JTAG。如果选成JTAGJLink虽然物理连接正常但目标芯片Cortex-M0默认用的是SWD接口JTAG是识别不到的。第二个是连接速度。默认的Auto或者5MHz未必合适。如果你的线材质量一般或者目标板布线比较长把速度主动降下来选成1MHz甚至400kHz连接稳定性会好很多。我自己的经验是调试板载走线短用5MHz没问题但如果用杜邦线飞线老老实实选1MHz。第三个是DLL版本的隐性坑。在Debug设置窗口底部有一行信息会显示当前使用的DLL文件及其版本号。如果这里显示的JLinkARM.dll版本是0.0.0.0或者一个很奇怪的老版本说明Keil加载的DLL有问题。可以手动点击Debug选项卡里的Use Debug Driver复选框强制Keil使用SEGGER安装的驱动路径。这个设置有时能解决新装JLink驱动但Keil不识别的问题。4.2 Flash Download设置补上APM32的专用编程算法Debug设置通过后接着要看Utilities选项卡。这是另一个最容易被忽视、但又最关键的烧录导航区。点击Utilities选项卡勾选Use Debug Driver然后点右边的Settings弹出Flash Download配置窗口。在这个窗口里首先要核对Programming Algorithm区域。正确状态下这里应该能看到一行类似于APM32F003 32KB Flash的算法条目。如果这一栏是空的或者只有一个通用的STM32F0xx Flash那烧写必报错。问题就出在Pack没有正确安装或没有在工程里指定正确的设备型号。处理方式点击Add按钮在弹出的算法列表里查找APM32相关的Flash算法。如果找不到回到第三章的3.1小节确认APM32F003 Pack安装正确。安装完成后重新打开工程算法条目才会出现在选项里。选择算法后设置Flash大小为32KBRAM大小按4KB填写起始地址保持0x08000000APM32F003的Flash起始地址。Flash Download窗口里还有一个Reset and Run复选框我的建议是勾上。这样烧录完成之后芯片自动复位运行省去手动按复位键的步骤。实测下来APM32F003F6P6对这个选项的支持没有问题勾选后程序烧完就能直接跑起来用串口或者示波器立刻能看到现象调试效率高很多。4.3 特殊情况连不上目标芯片时怎么处理前面都配置好了但点击烧录后仍然报Error: Connection failed或者RDDI-DAP Error该怎么办先别急着卸载重装我遇到过几种特殊情况分享下处理经验。第一种目标芯片之前烧录过低功耗程序SWD引脚被复用或芯片进入睡眠模式。这时常规SWD连接会失败因为内核已进入推演出异常状态。解法是在Debug设置的Connection选项里勾选Connect under Reset。同时确认硬件上已经将RESET引脚连接到了JLink的RESET针脚。这样Keil会先拉低复位线让芯片维持在复位状态再尝试连接成功率极高。第二种目标板供电不稳。APM32F003F6P6的低功耗特性很好但如果你的目标板使用了开关电源而开关电源启动瞬间电压建立速度比较慢JLink上电检测时序可能无法匹配目标板的供电时序。这时可以试试先给目标板上电等跑稳定了再插入JLink的USB线或者反过来先接JLink USB线再给目标板上电。不同板子的上电时序不一样多试几次能找到一个稳定组合。第三种JLink本身被锁死或者固件异常。这种情况最常见于兼容版JLink俗称山寨JLink在连接新芯片时会触发Clone检测指示灯变红烧录会话被强制中止。如果前面所有配置都没问题但JLink始终无法正常工作可以到SEGGER官网下载J-Link Firmware工具对JLink进行固件升级或恢复。如果固件刷不进去那基本可以断定手里的JLink属于仿品建议更换正规渠道的JLink或者改用CMSIS-DAP调试器。5. 报错汇总与排查笔记5.1 高频报错处理表这节直接上干货我把APM32F003F6P6用JLink在Keil中烧写时最高频的报错整理成一张速查表方便大家直接对照排查。报错现象根本原因优先级排序的解决办法Connectivity Failed / Cannot connect to targetJLink与目标板物理链路断开或VTref未检测到1. 检查SWDIO/SWCLK/GND/VCC四线连接2. 确认目标板上电3. 降低SWD速度到1MHz以下4. 勾选Connect under ResetRDDI-DAP ErrorKeil内置的DLL版本过旧或JLink驱动与Keil版本不匹配1. 升级JLink驱动到V7.962. 升级Keil MDK到5.36以上3. 手动指定DLL路径JLinkARM.dll initialization failedJLink驱动安装顺序错误或DLL文件被其他软件覆盖1. 卸载后重装JLink驱动2. 从SEGGER安装目录手动复制JLinkARM.dll到Keil目录3. 重启KeilFlash Download failed - Could not load file代码生成了错误的文件格式或Flash算法缺失1. 检查工程输出选项生成HEX/ELF文件2. 在Utilities中添加APM32F003 Flash算法Cannot load flash programming algorithmAPM32F003 Pack未安装或Device选型错误1. 在Pack Installer中安装Geehy APM32F003 DFP2. 确认Device列表中选的是APM32F003F6P6Error: Flash Download failed - Cortex-M0擦除或写入Flash过程中通信中断1. 降低SWD速度2. 排查USB线材和杜邦线连接3. 检查目标板3.3V供电是否稳定烧录过程中Keil直接闪退新版JLink驱动DLL与老Keil不兼容1. 降级JLink驱动到V6.80e2. 升级Keil MDK版本3. 换用CMSIS-DAP调试器5.2 独家排查技巧除了上面的报错对应表再分享几个常规教程里不太会写的细节技巧都是我实际踩出来的。技巧一Keil闪退别急着重装先手动指定DLL。之前我遇到Keil一打开下载就闪退的情况网上几乎都说要退JLink版本。但后来我去SEGGER安装目录下翻了一眼发现DLL文件是新的而Keil加载的路径却是另一个老路径。手动在Options for Target - Debug - Settings里把DLL路径强制指到SEGGER当前版本路径问题瞬间解决根本不用降级。这个技巧可以帮你在不改动全局环境的情况下只针对当前工程修复问题。技巧二烧写失败后用JLink RTT当测试探针。APM32F003F6P6资源不多但SEGGER JLink RTT功能在调试阶段非常好用。烧录失败后与其反复猜测是不是Flash算法问题不如先用J-Link Commander连接目标尝试用RTT回读芯片的IDCODE。RTT通道只要能建立说明JLink到芯片的SWD链路是通的问题更大比例在Keil的Flash算法配置上。这个思路能把硬件问题和软件问题分得更干净。技巧三VCC是信号线不是电源线。ALL JLink的VTref引脚只是为了检测目标板的逻辑电平参考电压它的输入阻抗很高不能给目标板供电。如果你用了那种只有排针供电、没有独立电源的目标板一定要另外给板子接一个稳定的3.3V电源。我一开始贪图方便想用JLink的3.3V输出直接给整块板子供电结果电压不稳烧写经常半路失败后来老老实实接外部电源才解决。技巧四AXF文件缺失也会报烧写失败。有朋友问为什么报错说Could not load file排查之后发现Keil工程的输出配置里没有勾选Create HEX File和Create Batch File烧录时找不到新的Hex文件Keil自然罢工。在Options for Target - Output选项卡里勾选Create HEX File然后重新编译确保编译日志里显示生成了hex文件再烧录就正常了。6. 一次完整排障流程参考这节把前面所有知识串起来以一个真实的场景为例走一遍标准排障流程。场景是新拿到的APM32F003F6P6板子Keil里编译通过点击Download报错Error: Flash Download failed - Target DLL has been cancelled。第一步打开J-Link Commander输入连接命令。如果Commander能连上芯片并识别Cortex-M0说明物理链路OK问题在Keil配置如果Commander也连不上先查硬件连接用万用表测量JLink和板子的VCC、GND是否正确导通确认SWDIO/SWCLK没有接反。第二步确认Commander能连上后回到Keil检查Options for Target中的Device选择。我之前就出现过Device选错的情况因为新建工程时手快直接选了其他通用型号没在意。改成APM32F003F6P6后重新编译再看Utilities里是否出现了APM32F003的Flash算法。没有算法就回Pack Installer里补装。第三步确认Debug选项卡的下拉框选择了J-LINK/J-TRACE CortexSettings里端口是SW速度从默认的5MHz降为1MHz。配置完成后再编译下载。按这个顺序走完90%的目标DLL已取消报错都能解决。剩下的10%基本是驱动版本问题就按第三章介绍的驱动升级或降级方案处理。写在最后回头再看APM32F003F6P6配合JLink在Keil里烧写这件事技术难度其实不大真正让人焦躁的是版本匹配这个隐性工程问题。我在实际芯片调试中体会最深的一点是不要迷信最新版也不要死守旧版本稳定工具链的版本关系更像一张组合表找到适合你当前Keil版本的JLink驱动、配套正确的Pack烧录链路自然就通了。建议大家在拿到一颗新型号MCU时第一时间去厂商官网把DFP Pack和推荐工具链版本下载齐别等到烧录报错再临时补课。如果这篇文章帮你少熬了几个小时的夜那我的目的就达到了。
返回列表