用J-Link读内存,先要确定地址、读取宽度,以及目标当时是否在运行。普通RAM可以连续查看,外设寄存器可能要求固定的访问宽度;外部存储器在初始化前也未必可读。先完成一次范围明确的读取,再根据失败发生的位置排查,会更容易找到问题。
一、J-Link怎么配置内存访问方式
1、在J-Link Commander中选定目标
器件型号、SWD或JTAG接口、通信速度,应与实际板卡一致。设置完成后再连接目标。
①打开【J-Link Commander】,输入Device<芯片型号>,按【Enter】。
②输入SelectInterface SWD,按【Enter】;若板卡接的是JTAG,改用SelectInterface JTAG。
③输入Speed 1000,按【Enter】;再输入connect,按【Enter】。
④查看连接输出中的目标电压和器件信息,确认连接的是预期芯片。
2、设置读取地址与数据宽度
Commander提供Mem8、Mem16、Mem32命令,分别按8位、16位、32位读取。命令末尾的数量表示读取多少个相应宽度的数据。
①从芯片手册找到待查区域的起始地址和允许的访问宽度。
②输入Mem32<地址>1,按【Enter】,读取一个32位数据。
③若区域要求8位或16位访问,改用Mem8<地址>1或Mem16<地址>1。
④需要读取连续内容时,增加命令末尾的数量,并核对结果是否跨出该区域。
⑤记录所用地址、宽度和命令返回信息。
二、J-Link访问目标内存失败如何检查
1、区分连接失败与读取失败
连接阶段就报错,和连接成功后某个地址无法读取,是两类问题。先用芯片手册中明确可读的内部区域作对照。
①查看【J-Link Commander】是否显示连接成功信息及目标电压。
②若未连接,检查目标板电源,以及调试接口的VTref、GND连接。
③重新输入SelectInterface SWD或SelectInterface JTAG,核对所用接口。
④输入Speed 100,按【Enter】,重新连接并读取已知可用的内部地址。
2、只在某一段失败时检查地址边界
调试软件的内存窗口可能一次读取整片显示范围。即使起始地址有效,范围跨入保留区域后也可能报错。先把读取量缩到一个数据。
①输入Mem32<失败地址>1,按【Enter】,检查单次读取结果。
②对照芯片内存表,核对该地址所属区域及区域结束地址。
③若单次读取成功,逐步增加命令末尾的数量,找出开始失败的边界。
3、核对访问宽度和地址对齐
外设寄存器未必允许按任意宽度读取。遇到访问错误或读数不符时,应以目标芯片手册规定的寄存器宽度为准。
①在芯片手册中查找该寄存器的地址、位宽和对齐要求。
②选择对应的Mem8、Mem16或Mem32命令,重新读取同一地址。
4、比较运行中与暂停后的结果
J-Link读取运行中的目标内存时,可能使用后台访问,也可能临时暂停核心;具体方式取决于目标和调试配置。暂停后正常、运行中失败时,还要留意程序是否进入了低功耗状态。
①在【J-Link Commander】输入halt,按【Enter】。
②按原地址和宽度重新执行读取命令。
③输入go,按【Enter】,在程序运行阶段再尝试读取。
④比较两次结果,记录失败是否只发生在运行中。
5、检查外部存储器是否完成初始化
外部RAM、QSPI映射区域,以及需要单独开启时钟的外设,可能在复位后尚不可访问。应比较初始化前后的读取结果。
①在【J-Link Commander】输入go,按【Enter】,让固件执行相应的初始化流程。
②初始化完成后输入halt,按【Enter】。
③使用原命令重读失败地址。
④若此时可读,对照工程启动代码,确认相关控制器在哪一步完成初始化。
⑤若仍不可读,核对芯片手册中的访问权限和当前保护设置。
6、确认读取路径对应的地址类型
部分目标提供不同的内存访问Zone。经AHB-AP等总线端口读取时,所用地址可能是物理地址;程序中使用的地址则可能经过转换,不能只比较两个相同的数字。
①查看【J-Link Commander】的连接输出,确认是否列出可用的Zone。
②仅在目标列出相应Zone时,按Mem32
③与不指定Zone时的结果比较,记录两次使用的地址和路径。
三、怎样验证内存访问配置
1、在J-Mem中查看稳定区域
J-Mem提供地址跳转、访问宽度和周期刷新设置。跨工具比较时,选内容稳定且明确可读的区域,并保持访问宽度一致。
①退出【J-Link Commander】,启动【J-Mem】,选择目标器件、接口和速度。
②在【Go To】输入已知可读的地址,点击宽度按钮【1】、【2】或【4】。
③将【Periodic Refresh】设为【off】,记录显示内容。
④与Commander中相同地址、相同宽度的读取记录对照。
2、对故障地址定点复查
调整设置后,继续读取原先失败的地址。每次只改变一个条件,才能判断哪项调整起了作用。
①记录失败地址、访问宽度、目标运行状态和原始报错。
②调整一项已发现的问题,例如降低【Speed】后重新连接。
③按原命令读取同一地址,比较错误信息是否变化。
3、保留复现条件
把“内存无法访问”落实到具体地址范围和程序阶段,后续检查启动代码、链接文件或目标板状态才有依据。
①保存【J-Link Commander】的连接输出和失败命令。
②记录芯片型号、固件版本、失败地址,以及读取时目标是运行还是暂停。
总结
“J-Link访问失败”只描述了结果,还不足以判断该检查连接、地址范围还是程序初始化。交流问题时,如果能同时给出失败地址、访问宽度和目标所处阶段,其他人就能按相同条件复现;再保留一条正常读取的地址作对照,排查方向也会更清楚。希望本文能帮助大家更顺利地检查J-Link内存访问问题;如有J-Link相关需求,欢迎联系我们咨询。