NXP MCU 技术论坛
直播中

绝代双骄

13年用户 1166经验值
私信 关注
[问答]

S32K3 Jlink为什么无法debug?

S32K344 使用Jlink  debug , 无法访问 0x20000000 地址内容





SEGGER J-Link GDB 服务器 v7.92a 命令行版本
JLinkARM.dll V7.92a(DLL 编译于 2023 年 8 月 16 日 15:34:08)
命令行: -if swd -device S32K344 -endian little -speed auto -port 2331 -swoport 2332 -telnetport 2333 -vd -ir -localhostonly 1 -singlerun -strict -timeout 0 -nogui
-----GDB Server 启动设置-----
GDBInit 文件:无
GDB 服务器监听端口:2331
SWO 原始输出侦听端口:2332
终端 I/O 端口:2333
接受远程连接:仅限 localhost
生成日志文件:off
验证下载:在
init regs on start: on
静音模式:关闭
单次运行模式:开
目标连接超时:0 毫秒
------J-Link 相关设置------
J-Link 主机接口:USB
J-Link 脚本:无
J-Link 设置文件:无
------Target 相关设置------
目标设备:S32K344
目标设备参数:无
目标接口:SWD
目标接口速度:auto
目标字节序:little
正在连接到 J-Link...
J-Link 已连接。
固件:J-Link V9 编译时间:2021 年 5 月 7 日 16:26:12
硬件:V9.60
序列号:69661698
功能: RDI, GDB, FlashDL, FlashBP, JFlash
正在检查目标电压...
目标电压:3.87 V
侦听 TCP/IP 端口 2331
正在连接到 target...
正在初始化 CPU 寄存器...已连接到目标
正在等待 GDB 连接...连接到 0000:0000:0000:0000:0000:0000:0000:0000:0001
GDB 客户端(连接 1304)向 GDB 服务器请求target.xml
读取公共寄存器:从硬件读取寄存器 'r0' (4 字节):0x00000000
从硬件读取寄存器 'r1' (4 字节): 0x00000000
从硬件读取寄存器 'r2' (4 字节): 0x00000000
从硬件读取寄存器 'r3' (4 字节): 0x00000000
从硬件读取寄存器 'r4' (4 字节): 0x00000000
从硬件读取寄存器 'r5' (4 字节): 0x00000000
从硬件读取寄存器 'r6' (4 字节): 0x00000000
从硬件读取寄存器 'r7' (4 字节): 0x00000000
从硬件读取寄存器 'r8' (4 字节): 0x00000000
从硬件读取寄存器 'r9' (4 字节): 0x00000000
从硬件读取寄存器 'r10' (4 字节): 0x00000000
从硬件读取寄存器 'r11' (4 字节): 0x00000000
从硬件读取寄存器 'r12' (4 字节): 0x00000000
从硬件读取寄存器 'sp' (4 字节): 0x00000000
从硬件读取寄存器 'lr' (4 字节): 0x00000000
从硬件读取寄存器 'pc' (4 字节): 0x00000000
从硬件读取寄存器 'xpsr' (4 字节): 0x00000001
读取 4 字节 @ 地址 0x00000000(数据 = 0x00000000)
读取 2 字节 @ 地址 0x00000000(数据 = 0x0000)
接收到的监控命令:speed 1000
目标接口速度设置为 1000 kHz
收到的 monitor 命令:clrbp
接收到的 monitor 命令:reset
重置目标
收到的 monitor 命令:halt
正在停止目标 CPU...
...目标已暂停 (PC = 0x20000008)
收到的 monitor 命令:regs
R0 = 20404000,R1 = 000000000,R2 = DEADBEEF,R3 = C0000000
R4 = E000E000,R5 = 000000000,R6 = 000000000,R7 = 000000000
R8 = 000000000,R9 = 000000000,R10= 00000000,R11= 20400AB8
R12= 20400068,R13= 20020000,MSP= 20020000,PSP= 204003D8
R14(LR) = 00404BF7,R15(PC) = 20000008
XPSR 61000003、APSR 60000000、EPSR 01000000、IPSR 00000003
CFBP 00001000,控制 00,故障掩码 00,BASEPRI 1000,PRIMASK 00
安全扩展寄存器:
MSP_S = 00000000,MSPLIM_S = 000000000
PSP_S = 00000000,PSPLIM_S = 000000000
MSP_NS = 20020000,MSPLIM_NS = 00000000
PSP_NS = 204003D8,PSPLIM_NS = 000000000
CONTROL_S 00、FAULTMASK_S 00、BASEPRI_S 00、PRIMASK_S 00
CONTROL_NS 00、FAULTMASK_NS 00、BASEPRI_NS 1000、PRIMASK_NS 00
读取公共寄存器:从硬件读取寄存器 'r0' (4 字节):0x00404020
从硬件读取寄存器 'r1' (4 字节): 0x00000000
从硬件读取寄存器 'r2' (4 字节): 0xEFBEADDE
从硬件读取寄存器 'r3' (4 字节): 0x000000C0
从硬件读取寄存器 'r4' (4 字节): 0x00E000E0
从硬件读取寄存器 'r5' (4 字节): 0x00000000
从硬件读取寄存器 'r6' (4 字节): 0x00000000
从硬件读取寄存器 'r7' (4 字节): 0x00000000
从硬件读取寄存器 'r8' (4 字节): 0x00000000
从硬件读取寄存器 'r9' (4 字节): 0x00000000
从硬件读取寄存器 'r10' (4 字节): 0x00000000
从硬件读取寄存器 'r11' (4 字节): 0xB80A4020
从硬件读取寄存器 'r12' (4 字节): 0x68004020
从硬件读取寄存器 'sp' (4 字节): 0x00000220
从硬件读取寄存器 'lr' (4 字节): 0xF74B4000
从硬件读取寄存器 'pc' (4 字节): 0x08000020
从硬件读取寄存器 'xpsr' (4 字节): 0x03000061
接收到监控命令:speed auto
选择自动目标接口速度 (2000 kHz)
收到的 monitor 命令:flash breakpoints 1
已启用 Flash 断点
收到的 monitor 命令:semihosting enable
已启用半托管(Handle on breakpoint instruction hit)
收到的 monitor 命令:semihosting IOClient 1
半托管 I/O 设置为 TELNET 客户端
收到的监控命令:SWO DisableTarget 0xFFFFFFFF
禁用 SWO 失败。
收到的监控命令:SWO EnableTarget 0 0 0x1 0
SWO 启用成功。
读取 64 字节 @ 地址 0x00400E80
读取 4 字节 @ 地址 0x00400F48(数据 = 0x0040E2AC)
读取 4 字节 @ 地址 0x00400F48(数据 = 0x0040E2AC)
读取 2 字节 @ 地址 0x00400EB0(数据 = 0x4825)
收到的 monitor 命令:clrbp
接收到的 monitor 命令:reset
重置目标
收到的 monitor 命令:halt
正在停止目标 CPU...
...目标已暂停 (PC = 0x20000004)
正在下载 16096 字节 @ 地址 0x00400000 - 验证正常
正在下载 16000 字节 @ 地址 0x00403EE0 - 验证正常
正在下载 15856 字节 @ 地址 0x00407D60 - 验证正常
正在下载 15060 字节 @ 地址 0x0040BB50 - 验证正常
正在下载 12 字节 @ 地址 0x0040F624 - 验证正常
正在下载 4 字节 @ 地址 0x0040F630 - 验证正常
写入寄存器 'pc' = 0x00400C20
比较闪光灯 [....................]做。
擦除闪光灯 [....................]做。
编程闪存 [....................]做。
读取 64 字节 @ 地址 0x00400E80
读取 4 字节 @ 地址 0x00400F48(数据 = 0x0040E2AC)
读取 4 字节 @ 地址 0x00400F48(数据 = 0x0040E2AC)
读取 2 字节 @ 地址 0x00400EB0(数据 = 0x4825)
读取 4 字节 @ 地址 0x00400F48(数据 = 0x0040E2AC)
读取 4 字节 @ 地址 0x00400F48(数据 = 0x0040E2AC)
读取 2 字节 @ 地址 0x00400EB0(数据 = 0x4825)
收到的 monitor 命令:regs
R0 = 0033799C,R1 = 00000000,R2 = DEADBEEF,R3 = C0000000
R4 = E000E000,R5 = 000000000,R6 = 000000000,R7 = 000000000
R8 = 000000000,R9 = 000000000,R10= 00000000,R11= 20400AB8
R12= 20400068,R13= 20020000,MSP= 20020000,PSP= 204003D8
R14(LR) = 00404BF7,R15(PC) = 20000004
XPSR 01000003、APSR 000000000、EPSR 01000000、IPSR 00000003
CFBP 00001000,控制 00,故障掩码 00,BASEPRI 1000,PRIMASK 00
安全扩展寄存器:
MSP_S = 00000000,MSPLIM_S = 000000000
PSP_S = 00000000,PSPLIM_S = 000000000
MSP_NS = 20020000,MSPLIM_NS = 00000000
PSP_NS = 204003D8,PSPLIM_NS = 000000000
CONTROL_S 00、FAULTMASK_S 00、BASEPRI_S 00、PRIMASK_S 00
CONTROL_NS 00、FAULTMASK_NS 00、BASEPRI_NS 1000、PRIMASK_NS 00
读取公共寄存器:从硬件读取寄存器 'r0' (4 字节):0x9C793300
从硬件读取寄存器 'r1' (4 字节): 0x00000000
从硬件读取寄存器 'r2' (4 字节): 0xEFBEADDE
从硬件读取寄存器 'r3' (4 字节): 0x000000C0
从硬件读取寄存器 'r4' (4 字节): 0x00E000E0
从硬件读取寄存器 'r5' (4 字节): 0x00000000
从硬件读取寄存器 'r6' (4 字节): 0x00000000
从硬件读取寄存器 'r7' (4 字节): 0x00000000
从硬件读取寄存器 'r8' (4 字节): 0x00000000
从硬件读取寄存器 'r9' (4 字节): 0x00000000
从硬件读取寄存器 'r10' (4 字节): 0x00000000
从硬件读取寄存器 'r11' (4 字节): 0xB80A4020
从硬件读取寄存器 'r12' (4 字节): 0x68004020
从硬件读取寄存器 'sp' (4 字节): 0x00000220
从硬件读取寄存器 'lr' (4 字节): 0xF74B4000
从硬件读取寄存器 'pc' (4 字节): 0x04000020
从硬件读取寄存器 'xpsr' (4 字节): 0x03000001
设置断点 @ 地址 0x00400EB0,种类 = 2,类型 = THUMB,BPHandle = 0x0005
正在启动目标 CPU...
...目标已暂停 (DBGRQ, PC = 0x20000000)
读取公共寄存器:从硬件读取寄存器 'r0' (4 字节):0x9C793300
从硬件读取寄存器 'r1' (4 字节): 0xFFFFFFFF
从硬件读取寄存器 'r2' (4 字节): 0xEFBEADDE
从硬件读取寄存器 'r3' (4 字节): 0x000000C0
从硬件读取寄存器 'r4' (4 字节): 0x00E000E0
从硬件读取寄存器 'r5' (4 字节): 0x00000000
从硬件读取寄存器 'r6' (4 字节): 0x00000000
从硬件读取寄存器 'r7' (4 字节): 0x00000000
从硬件读取寄存器 'r8' (4 字节): 0x00000000
从硬件读取寄存器 'r9' (4 字节): 0x00000000
从硬件读取寄存器 'r10' (4 字节): 0x00000000
从硬件读取寄存器 'r11' (4 字节): 0xB80A4020
从硬件读取寄存器 'r12' (4 字节): 0x68004020
从硬件读取寄存器 'sp' (4 字节): 0x00000220
从硬件读取寄存器 'lr' (4 字节): 0xF74B4000
从硬件读取寄存器 'pc' (4 字节): 0x00000020
从硬件读取寄存器 'xpsr' (4 字节): 0x03000081
删除断点 @ 地址 0x00400EB0,大小 = 2
读取 4 字节 @ 地址 0x20000000(数据 = 0x2202E8E0)
读取 2 字节 @ 地址 0x20000000(数据 = 0xE8E0)
读取 2 字节 @ 地址 0x20000002(数据 = 0x2202)
读取 4 字节 @ 地址 0x00404BF6(数据 = 0xFFFFFFFF)
读取 64 字节 @ 地址 0x20020000
警告:无法读取内存 @ 地址 0x20020000
警告:无法读取内存 @ 地址 0x20020014
读取 64 字节 @ 地址 0x20020000
警告:无法读取内存 @ 地址 0x20020000
警告:无法读取内存 @ 地址 0x20020014
读取 64 字节 @ 地址 0x20000000
读取 64 字节 @ 地址 0x1FFFFFC0
警告:无法读取内存 @ 地址 0x1FFFFFC0
警告:无法读取内存 @ 地址 0x1FFFFFFE
读取 64 字节 @ 地址 0x20000040
读取 64 字节 @ 地址 0x1FFFFFC0
警告:无法读取内存 @ 地址 0x1FFFFFC0
警告:无法读取内存 @ 地址 0x1FFFFFFE
                                                                                                                                                                                                                                                                                                                                                                                                      

回帖(1)

红旧衫

2025-3-2 13:18:42

针对S32K344使用J-Link无法访问0x20000000地址的问题,以下是逐步排查和解决方案:




1. 检查硬件连接



  • SWD接口:确认SWDIO(通常为PTA3)和SWCLK(PTA2)接线正确,接触良好,无短路或虚焊。

  • 电源与接地:确保目标板供电稳定(3.3V),J-Link与目标板共地。用万用表测量电压是否正常。

  • 复位引脚:检查复位电路是否正常,尝试手动复位后再连接调试器。




2. 调整SWD速度与模式



  • 降低SWD时钟:在J-Link命令行中手动设置低速(如-speed 1000或更低),避免因信号干扰导致通信失败。

  • 更换线缆/接口:使用短且屏蔽的线缆连接,排除物理干扰。




3. 验证J-Link兼容性



  • 更新软件/固件

    • 下载最新版J-Link软件,确认支持S32K344。

    • 通过J-Link Commander输入exec setsn=xxxxxxxx(若有许可证)并升级固件。


  • 使用J-Link Commander测试连接
    JLink.exe -device S32K344 -if SWD -speed 1000
    > connect
    > mem32 0x20000000 4  # 尝试读取RAM地址

    若返回错误,检查输出日志(如Can not read memoryCPU is not halted)。





4. 确认芯片状态与初始化



  • 复位后立即暂停:在GDB服务器参数中添加-halt或在初始化脚本中执行monitor reset halt,确保芯片复位后暂停在初始状态。

  • 初始化RAM和时钟

    • 若芯片未初始化,RAM可能不可用。在调试前运行以下命令(通过GDB或J-Link脚本):
      monitor reset
      monitor halt
      # 执行初始化代码(如通过load命令加载含初始化的固件)





5. 检查内存保护与安全配置



  • 禁用MPU/安全域:若项目启用了MPU或TrustZone,调试时需临时关闭相关设置。在连接后执行:
    monitor write register MSP 0x20001000  # 示例:设置堆栈指针
    monitor write register CPACR 0x00F00000 # 启用FPU(如需)

  • 检查选项字节:使用厂商工具(如S32 Design Studio)确认调试接口未锁定。




6. 使用正确的调试配置



  • GDB初始化脚本:在GDB启动时加载初始化脚本(如init.gdb),包含必要的硬件初始化命令:
    target remote localhost:2331
    monitor reset halt
    monitor flash device = S32K344
    # 添加其他初始化命令(如时钟配置)

  • 避免优化干扰:在工程编译选项中关闭优化(-O0),确保调试时代码与内存映射一致。




7. 其他可能原因



  • 芯片损坏:更换同型号芯片测试。

  • 软件冲突:关闭其他占用USB或调试端口的程序(如IDE、烧录工具)。




快速验证步骤




  1. J-Link Commander直连测试


    JLink.exe -device S32K344 -if SWD -speed 1000
    > connect
    > halt
    > mem32 0x20000000 4


    • 若成功读取,问题可能出在GDB配置;若失败,继续排查硬件或初始化。




  2. 更新S32K3支持包:在S32 Design Studio或IDE中安装最新SDK和设备支持包。






通过以上步骤应能定位问题根源。若仍无法解决,建议提供J-Link Commander的完整输出日志或截图,以便进一步分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分