读取目标芯片寄存器前,先分清要看的是CPU核心寄存器,还是通过内存地址访问的外设寄存器。J-Link Commander可用不同命令读取这两类数据;使用Ozone时,还可以在寄存器窗口查看寄存器名称和位字段。读数异常时,从目标型号、读取时机和访问条件入手,通常更容易缩小范围。
一、J-Link怎么读取目标芯片寄存器
1、连接目标并读取核心寄存器
J-Link Commander的Regs命令可显示CPU寄存器内容。读取前先暂停核心,便于记录同一运行时刻的数值。
①启动【J-Link Commander】,按连接提示选择目标芯片型号和调试接口。
②在命令提示符输入connect,按【Enter】连接目标。
③输入halt,按【Enter】暂停CPU。
④输入Regs,按【Enter】,查看当前核心寄存器数值。
2、单独读取某个核心寄存器
寄存器列表较长时,可先列出当前目标支持的名称,再指定其中一个读取,避免直接套用其他芯片的寄存器名称。
①在【J-Link Commander】中输入RReg,按【Enter】,查看可用寄存器名称。
②输入RReg<寄存器名称>,按【Enter】,记录返回值。
3、按地址读取外设寄存器
外设寄存器通常映射在内存地址空间。确认手册中的寄存器地址与访问宽度后,可用Mem32读取一个32位寄存器。
①在芯片手册中找到目标寄存器的地址和允许的访问宽度。
②在【J-Link Commander】输入Mem32<寄存器地址>1,按【Enter】。
③将返回值与手册中的位字段定义对照;读取8位或16位寄存器时,改用对应宽度的读取命令。
4、在Ozone中查看寄存器和位字段
Ozone的寄存器窗口可显示核心、系统及外设寄存器。外设名称和位字段依赖匹配的SVD设备描述文件;缺少相应文件时,不能仅凭窗口中没有条目判断芯片没有该寄存器。
①在Ozone中连接目标并暂停程序,打开【Registers】窗口。
②展开【Core Registers】,查看PC、SP等核心寄存器。
③展开【Peripheral Registers】,找到要检查的外设及其寄存器。
④若缺少目标外设,右键点击寄存器窗口,选择【Add SVD File】,载入与芯片型号匹配的SVD文件。
⑤展开目标寄存器,查看各位字段的当前值。
二、J-Link寄存器数据显示异常如何排查
1、核对芯片型号与寄存器定义
寄存器名称正确、地址却不对,或者位字段含义与手册不符,先检查调试工程选用的目标器件。相近型号的外设布局和寄存器定义可能不同。
①查看J-Link连接信息,核对所选芯片型号与板上器件标识。
②在Ozone中检查当前加载的SVD文件是否对应这一型号。
③对照芯片手册,逐项核对异常寄存器的基地址、偏移量和位字段。
2、检查读取时机与刷新方式
Ozone的寄存器窗口默认在目标停止时刷新。程序继续运行后,窗口里保留的数值不一定代表此刻的状态。部分外设寄存器读取后还会改变状态,不适合反复自动采样。
①在要观察的位置设置断点,点击【Continue】,等待目标暂停。
②回到【Registers】窗口,记录暂停后的寄存器值。
③若启用了周期读取,检查该寄存器所在行的【Auto】以及窗口中的【Refresh Rate】。
④对手册标注为“读后清除”等类型的寄存器,取消【Auto】,按规定时机单次读取。
3、检查外设访问条件
外设寄存器读出全零、固定值或访问错误时,要核对它在当前运行阶段是否可访问。外设时钟、芯片安全状态,以及寄存器要求的读取宽度,都可能影响结果。
①在【J-Link Commander】输入halt,按【Enter】,确认核心已暂停。
②用手册核对寄存器地址和访问宽度,选用对应的Mem8、Mem16或Mem32命令。
③将程序运行到外设初始化之后,再暂停并读取同一地址。
④查看芯片手册中的时钟使能和访问权限要求,核对当前初始化状态。
⑤若读取仍报错,记录命令返回信息,并检查目标芯片是否启用了限制调试访问的保护设置。
三、如何确认寄存器读数可信
1、用同一运行状态交叉核对
对普通可重复读取的寄存器,可以在相同停机状态下比较窗口值与按地址读取的结果。对于读操作会改变状态的寄存器,应以手册规定的读取方式为准。
①暂停目标,在【Registers】窗口记录目标寄存器的数值。
②在【J-Link Commander】用对应宽度的读取命令检查其地址,比较两次结果。
2、保留复查所需的信息
只保存一个十六进制数,很难判断它来自哪个运行阶段。把读取条件一起记下,换固件版本或交接问题时才容易复现。
①记录芯片型号、寄存器地址、访问宽度和读取时的暂停位置。
②保存【Registers】窗口中的位字段显示,以及命令行返回值。
③对照手册标出不一致的字段,再检查对应的初始化代码。
总结
寄存器读数有一个容易忽略的前提:它属于芯片运行过程中的某个时刻。同一个寄存器,在复位后、外设初始化后和程序进入中断时,显示不同数值可能完全正常。交流问题时,把目标型号、暂停位置和寄存器地址说清楚,比单独发送一张数值截图更有助于判断现象。希望这篇关于J-Link读取寄存器及排查显示异常的文章能对大家有所帮助;如有J-Link相关需求,欢迎联系我们咨询。