【平头哥Sipeed LicheeRV 86 Panel测评】自制CKLink-lite调试器,调试D1裸机编程
[复制链接]
本帖最后由 mars4zhu 于 2022-4-19 11:53 编辑
自制CKLink-lite调试器,调试D1裸机编程
摘要:
使用了一块STM32F103开发板(市面上最常见的正点原子的miniSTM32开发板),利用平头哥的DebugServer中的固件(稍微魔改一下),变身为CKLink-Lite调试器,接入LicheeRV开发板的JTAG引脚上,可以直接使用调试D1芯片的裸机编程,如断点、单步运行、查看寄存器等,跟单片机开发一样方便。
正文:
在之前的帖子中(https://bbs.eeworld.com.cn/thread-1199389-1-1.html 【平头哥Sipeed LicheeRV 86 Panel测评】D1作为单片机裸奔编程点灯——LED-Blinky),由于没有调试器连接JTAG进行单片机常用的调试方法,所以观察程序功能正确与否,只能查看板子上的反应来确定。而D1的CPU内核C906的调试接口及其协议是自己开发的,并非RISCV标准调试接口,因此使用其余的JLink+OpenOCD方案无法实施,经过网络查找,发现有不少人可以DIY自制CKLink:
https://www.bilibili.com/video/av977444179 自制CKlink阿里平头哥w801/w806仿真器DIY全教程
看了一下里面的原理图,都是使用STM32F103C8T6主控,外围几个电阻、LED而已。烧写入CKLink-Lite固件,主要功能就是USB转JTAG,使用几个GPIO引脚作为JTAG信号引脚,如图:
作为最热门的MCU,大家伙手里应该都有一两个STM32F103的板子吧,我手头上有个STM32F103RBT6的开发板(市面上最常见的正点原子的miniSTM32开发板);跟STM32F103C8T6是同架构,仅仅是封装和Flash存储容量不同而已,应该可以通用固件;
然后D1的手册上表明,RISCV内核的JTAG信号可以复用到SD卡槽上,刚好之前使用SD-NAND的时候,有一个SD引出IO引脚的转接小板子,可以把D1芯片的SD卡槽上的信号引出,两边对应的引脚连接关系如图:
先烧写CKLink-Lite的固件,平头哥的DebugServer软件里面,提供了两个CK-Link-Lite的固件,位于T-HeadDebugServer\bin\links\CK-Link目录下,分别是cklink_lite_iap.hex和cklink_lite.hex,用文本编辑器打开,发现cklink_lite.hex是从0x08004000开始,而cklink_lite_iap.hex是从0x08000000开始(STM32芯片的Flash空间起始地址),很显然是先烧写IAP功能的固件,可以随时更新CKLink调试功能的固件,因此先烧入cklink_lite_iap.hex。采用Jlink或者BOOT0串口下载等方式烧入cklink_lite_iap.hex后,USB口插入电脑发现C-SKY CKLink-Lite Firmware Loader,看名称就知道是加载调试功能固件的,打开Debugger-Server,发现固件更新,但是这里却无法更新。最后无奈,依然采用Jlink烧入cklink_lite.hex
(1)注意这次烧写固件,不要擦除芯片,避免把之前烧入的cklink_lite_iap.hex给擦除了。
(2)也可以使用文本编辑器,把两个hex文件合并为一个,然后再一次性烧写。
烧写后插入电脑,依然出现C-SKY CKLink-Lite Firmware Loader,使用Debugger-Server也无法进入调试功能。
尝试了方法:
(1)刚插上电脑,设备管理器里冒出来的是“C-Sky CKLink-Lite Firmware Loader”,之后换了好多驱动libusbK、winusb、libusb-win32,在C-Sky Debugger Server里面都没法成功识别出CKLink。
(2)尝试了好多次,最后设备管理器里卸载设备,然后右键选择“扫描检测硬件改动”,重新扫描后,CKLink就重新枚举变为“CKLink-Lite”然后就可以用Debugger Server识别,并创建gdb调试服务。。。
总结一下,估计还是硬件差异的问题吧,毕竟STM32开发板跟CKLink-Lite原理图相比,有两三个电阻没接,特别是USB_CNCT(PB5)到USB-D+(PA12)的1.5K电阻没有连接,这个肯定是用来实现USB重新枚举的,所以无法从IAP功能切换到CKLink功能。用这种方法,只能采用卸载设备然后重新枚举的方式,才能进入CKLink-Lite固件;
PS1:在压箱底找到一个STM32F103C8T6的最小系统开发板,烧入这个固件,也一样可以调试,说明这个固件对于STM32F103R/C等封装都通用,我推测对于其他如V、Z封装,不同Flash容量的芯片型号,也一样通用,但没有测试,手上有板子的朋友不妨都去试试。
PS2:突发奇想,既然CKLink固件的起始地址是0x08004000,那么我把这一段的中断向量表复制到0x08000000,是不是可以直接忽略IAP固件,而是直接执行CKLink固件呢?采用文本编辑器,在头部复制中断向量表,并且把地址全部改为0x080000xx开头,hex文件最后的校验和也修改一下,如图:
烧入后插上电脑,果然直接显示为CKLink-Lite设备,大功告成!!!!
附带DebugServer的原始的两个固件(cklink_lite.hex、cklink_lite_iap.hex)、合并后的固件cklink_lite_merge.hex、以及复制中断向量表的固件cklink_lite_mod.hex,以及网上的固件CKLinkLite2.30.hex(这个也是两个固件合并在一起)
自制CKLink-lite调试器,调试D1裸机编程.zip
(3.27 MB, 下载次数: 242)
|