调试Flash应用程序

简介

SPV1x支持JTAG(4线)在线调试和cJTAG(2线)在线调试。两者的调试体验相近,但是cJTAG需要的引脚更少,因此推荐使用cJTAG调试。 由于芯片的调试存在诸多限制,因此请务必仔细阅读本章内容后面的注意事项。

准备工作

  1. JTAG调试器(Straw Mini)安装驱动

首次使用调试器,需要安装调试器驱动。

(1). 安装调试器原厂驱动。

调试器驱动程序安装文件在SDK包内,具体文件为:tool->下载器驱动->FTDI系列->CDM212364_Setup.zip。压缩包解压后,双击exe文件开始安装,勾选同意协议并点击next,直至安装完成。

(2). 给调试器打libusbk驱动。

驱动替换工具在SDK包内,具体文件为:tool->驱动替换工具-> zadig-2.4.exe。工具为绿色软件,双击exe即可运行。

  1. 软件打开后,先点击”Options”->“List All Devices”,列举出所有支持的设备。

../_images/debug-zadig-list-all-devices.png
  1. 在设备下拉列表中,找到”SpaceTouch USB Device(Interface 0)”。

../_images/debug-zadig-select-device.png
  1. 在”Driver”一行,将目标驱动选择为libusbK。

../_images/debug-zadig-select-driver.png
  1. 点击”Replace Driver”按钮,开始替换驱动,并耐心等待驱动替换完成。

../_images/debug-zadig-replace-driver.png
  1. 最后,在系统设备管理器中,确认出现对应的”libusbK USB Devices”。

../_images/debug-check-libusbk-device.png

备注

Straw Mini采用FT2232HL作为主控芯片,该IC具有2路信号通道。JTAG/cJTAG调试只用到通道0,通道1可以用作SPV1x的下载和调试打印串口。 如果电脑没有出现通道1的串口,请到设备管理器中检查” USB Serial Converter B”是否勾选了”加载VCP”选项,如下图所示:

../_images/debug-enable-ch1-vcp-driver.png
  1. 复制OpenOCD配置文件到OpenOCD程序目录下

OpenOCD配置文件在SDK包内,具体位置为:tool->openocd配置文件->openocd_spv1x_jtag.cfg和tool->openocd配置文件->openocd_spv1x_cjtag.cfg,这2个文件分别对应JTAG调试和cJTAG调试

  1. 下载需要调试的程序到芯片

编译需要调试的工程,并将生成的bin文件,使用串口下载到芯片。后续如果代码发生更改,则需要重新下载更改后的程序,以保证代码和芯片内部的bin文件一致。

备注

在执行用户程序时,芯片GPIO引脚的JTAG复用功能默认是关闭的。为了保证程序运行过程中,调试器可以连接到芯片的JTAG,需要在程序中显式地开启GPIO引脚的JTAG复用功能。

对于JTAG调试,需要在app_init()的最前面加上如下代码:

DEV_GPIO->CTL[0] = 10;  //CPU_TCK
DEV_GPIO->CTL[1] = 10;  //CPU_TMS
DEV_GPIO->CTL[2] = 10;  //CPU_TDO
DEV_GPIO->CTL[3] = 10;  //CPU_TDI

对于cJTAG调试,需要在app_init()的最前面加上如下代码:

DEV_GPIO->CTL[0] = 10;  //CPU_TCK
DEV_GPIO->CTL[1] = 10;  //CPU_TMS
  1. 连接调试器和待调试的芯片。

  1. 如果使用JTAG调试,则需要连接6根线:

  1. 调试器TCK连接芯片GPIO00;

  2. 调试器TDO连接芯片GPIO02;

  3. 调试器TMS连接芯片GPIO01;

  4. 调试器TDI连接芯片GPIO03;

  5. 调试器GND连接芯片GND;

  6. 调试器VREF连接芯片IOVCC;

(2). 如果使用cJTAG调试,则需要连接4根线:

  1. 调试器TCK连接芯片GPIO00;

  2. 调试器TMS连接芯片GPIO01;

  3. 调试器GND连接芯片GND;

  4. 调试器VREF连接芯片IOVCC;

  1. IDE调试功能配置

工程的调试功能配置,只需要在首次启动调试前配置一次,后续启动调试不用再配置。

(1). 对需要进行调试的工程右键,然后选择“Debug As”->”Debug Configurations…”。

../_images/debug-open-configurations-dialog.png

(2). 在弹出的”Debug Configurations”窗口中,双击”GDB OpenOCD Debugging”,新建一个调试配置。

../_images/debug-create-configuration.png

(3). 在”Debug Configurations”窗口的”Main”标签页中,选择需要调试的”C/C++ Application”。

  1. 点击”Browse…”按钮

../_images/debug-select-application-step1.png
  1. 在弹出的文件选择对话框中,选择需要调试的elf程序文件

../_images/debug-select-application-step2.png
  1. 选择完成后的效果

../_images/debug-select-application-step3.png

(4). 在”Debug Configurations”窗口的”Debugger”标签页中,配置openocd和gdb相关配置,参考配置如下:

../_images/debug-configuration-table-debugger.png

配置部分文本内容:

${openocd_path}/${openocd_executable}

-f "${openocd_path}/openocd_spv1x_cjtag.cfg"

${cross_prefix}gdb${cross_suffix}

set  remotetimeout 250
set arch riscv:rv32

备注

OpenOCD的 “Actual executable”中的内容,与IDE的安装路径相关,不同电脑显示的路径会不一样。 如果路径存在错误,需要在”Window”->”Preferences”->”MCU”->”Global OpenOCD Path”中进行配置。如下图所示:

../_images/debug-global-openocd-path.png

(5). 在”Debug Configurations”窗口的”Startup”标签页中,配置调试启动时的一些初始化参数和行为,参考配置如下:

../_images/debug-configuration-table-startup.png

配置部分文本内容:

mem 0x48000000 0x48FFFFFF ro
mem 0x4C000000 0x4CFFFFFF ro

41000000
app_init

(6). 点击“Apply”,然后点击”Debug”,启动调试。后续可以直接使用IDE主界面上的快捷图标启动调试。

../_images/debug-start.png

注意事项

  1. SPV1x只有2个硬件断点。对于c语言程序的调试,由于需要给gdb留一个临时断点,因此用户同一时刻,只能打一个断点。

  2. SDK默认是O1优化,编译器对程序进行优化后,程序的实际执行流程和源代码中的代码顺序会有所出入,但是结果的正确性是可以保证的。

  3. 开启调试前,请确认芯片内部的程序和IDE中的代码是一致的。程序不一致会出现许多让人误解的行为,如IDE显示在执行A函数,但是芯片实际效果是B函数的行为。

  4. IDE在进入调试后,会切换到调试界面布局。可以通过”Window”->”Perspective”->”Open Derspective”->”C/C++”切换回代码编辑界面。或者通过菜单栏的快捷图标进行切换。

../_images/debug-switch-perspective.png