调试Flash应用程序
简介
SPV1x支持JTAG(4线)在线调试和cJTAG(2线)在线调试。两者的调试体验相近,但是cJTAG需要的引脚更少,因此推荐使用cJTAG调试。 由于芯片的调试存在诸多限制,因此请务必仔细阅读本章内容后面的注意事项。
准备工作
JTAG调试器(Straw Mini)安装驱动
首次使用调试器,需要安装调试器驱动。
(1). 安装调试器原厂驱动。
调试器驱动程序安装文件在SDK包内,具体文件为:tool->下载器驱动->FTDI系列->CDM212364_Setup.zip。压缩包解压后,双击exe文件开始安装,勾选同意协议并点击next,直至安装完成。
(2). 给调试器打libusbk驱动。
驱动替换工具在SDK包内,具体文件为:tool->驱动替换工具-> zadig-2.4.exe。工具为绿色软件,双击exe即可运行。
软件打开后,先点击”Options”->“List All Devices”,列举出所有支持的设备。
![]()
在设备下拉列表中,找到”SpaceTouch USB Device(Interface 0)”。
![]()
在”Driver”一行,将目标驱动选择为libusbK。
![]()
点击”Replace Driver”按钮,开始替换驱动,并耐心等待驱动替换完成。
![]()
最后,在系统设备管理器中,确认出现对应的”libusbK USB Devices”。
![]()
备注
Straw Mini采用FT2232HL作为主控芯片,该IC具有2路信号通道。JTAG/cJTAG调试只用到通道0,通道1可以用作SPV1x的下载和调试打印串口。 如果电脑没有出现通道1的串口,请到设备管理器中检查” USB Serial Converter B”是否勾选了”加载VCP”选项,如下图所示:
![]()
复制OpenOCD配置文件到OpenOCD程序目录下
OpenOCD配置文件在SDK包内,具体位置为:tool->openocd配置文件->openocd_spv1x_jtag.cfg和tool->openocd配置文件->openocd_spv1x_cjtag.cfg,这2个文件分别对应JTAG调试和cJTAG调试
下载需要调试的程序到芯片
编译需要调试的工程,并将生成的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
连接调试器和待调试的芯片。
如果使用JTAG调试,则需要连接6根线:
调试器TCK连接芯片GPIO00;
调试器TDO连接芯片GPIO02;
调试器TMS连接芯片GPIO01;
调试器TDI连接芯片GPIO03;
调试器GND连接芯片GND;
调试器VREF连接芯片IOVCC;
(2). 如果使用cJTAG调试,则需要连接4根线:
调试器TCK连接芯片GPIO00;
调试器TMS连接芯片GPIO01;
调试器GND连接芯片GND;
调试器VREF连接芯片IOVCC;
IDE调试功能配置
工程的调试功能配置,只需要在首次启动调试前配置一次,后续启动调试不用再配置。
(1). 对需要进行调试的工程右键,然后选择“Debug As”->”Debug Configurations…”。
![]()
(2). 在弹出的”Debug Configurations”窗口中,双击”GDB OpenOCD Debugging”,新建一个调试配置。
![]()
(3). 在”Debug Configurations”窗口的”Main”标签页中,选择需要调试的”C/C++ Application”。
点击”Browse…”按钮
![]()
在弹出的文件选择对话框中,选择需要调试的elf程序文件
![]()
选择完成后的效果
![]()
(4). 在”Debug Configurations”窗口的”Debugger”标签页中,配置openocd和gdb相关配置,参考配置如下:
![]()
配置部分文本内容:
${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”中进行配置。如下图所示:
![]()
(5). 在”Debug Configurations”窗口的”Startup”标签页中,配置调试启动时的一些初始化参数和行为,参考配置如下:
![]()
配置部分文本内容:
mem 0x48000000 0x48FFFFFF ro mem 0x4C000000 0x4CFFFFFF ro 41000000 app_init(6). 点击“Apply”,然后点击”Debug”,启动调试。后续可以直接使用IDE主界面上的快捷图标启动调试。
![]()
注意事项
SPV1x只有2个硬件断点。对于c语言程序的调试,由于需要给gdb留一个临时断点,因此用户同一时刻,只能打一个断点。
SDK默认是O1优化,编译器对程序进行优化后,程序的实际执行流程和源代码中的代码顺序会有所出入,但是结果的正确性是可以保证的。
开启调试前,请确认芯片内部的程序和IDE中的代码是一致的。程序不一致会出现许多让人误解的行为,如IDE显示在执行A函数,但是芯片实际效果是B函数的行为。
IDE在进入调试后,会切换到调试界面布局。可以通过”Window”->”Perspective”->”Open Derspective”->”C/C++”切换回代码编辑界面。或者通过菜单栏的快捷图标进行切换。
![]()