如何调试GD32虚拟串口的两个BUG?

最近鱼鹰在搞调试器,折腾了好多天终于理解了 mdk 、下载算法、调试器、mcu 之间的关系。
简单来说,就是,调试器作为 usb 转 swd 协议的转换工具,mdk 通过 usb 驱动这个工具,下载算法包含了一些 mcu 内部 flash 擦除、编程代码,和普通代码不同的是,该代码可以下载在任意位置运行。如果需要校验,还会加入 crc 校验代码,扇区检测代码。
mdk 首先通过调试器将算法写入内部 ram,然后把需要写入的固件程序写入 ram,再由 mdk 控制(通过调试器) mcu 执行相应代码(擦除或写入扇区),通过 mcu 的寄存器和设定软件断点得到执行结果,如此来回搬运,就可完成固件下载。
说起来简单,做起来很麻烦(调试器工具功能简单,只做协议转换,如何控制通过 mdk),这里点到为止,有时间会好好整理分享一下。
之后准备 usb 相关的工作,发现总是没有满意的 usb core 库,官方的库感觉还不错,可惜被封装了,看不到源码,放弃。
之前鱼鹰分享过虚拟串口的代码,于是下载下来使用,发现竟然在 gd32 中用不了,当初明明 st 测试没问题的。
还以为是 gd 芯片问题,然后使用之前的 usb 双缓冲读卡器代码,发现没有问题。
只能在线调试比较差异,借助逻辑分析仪,总算解决了这两个 bug,顺利自发自收。
bug 1
枚举失败。
通过逻辑分析仪发现,电脑发送控制帧给 usb 设备,竟然没有任何回应,即没有 nak,也米有 stall,更不用说 ack 了。
正常回应
无回应
通过调试发现,该端点接收状态为 0,禁用状态,再参考可用代码,发现在复位之后,应该设置为接收有效才对。因此修改如下:
void usbd_reset (void){  ………………  …… ……  epxreg(0) = ep_control | ep_rx_valid; // 除了设定端点类型外,还要使能接收 daddr = daddr_ef | 0; /* enable usb default address */}  
很奇怪的是,st 我以前测试是没问题的,可能也是两者之间的差异吧。。
bug 2
枚举成功后,又出现另外一个问题,就是串口只能发送第一帧数据,第二次卡死……
经过逻辑分析仪发现,发送的数据会被 nak。后来才发现下面的语句不满足,直接没有读 usb 数据包,从而没有恢复接收有效状态,导致串口助手卡死。
这段官方代码也确实比较迷,没有最大利用缓存空间(最少需要满一包的空间,但实际可能不满一包),不过按下不表。
那就是第一次收到的数据未读呗,在 main() 函数里面发现根本没进来,发现竟然一直在 usb 中断执行……
void main() { while(1) { …… if (usb_rx_ch == -1) usb_rx_ch = usbd_cdc_acm_getchar(); …… } }  
然后看到这个标志一直在,未清除导致。
但很奇怪的事,该代码在 st 里面跑的挺好的。不管它,加上处理:
void usb_lp_can1_rx0_irqhandler(void) { …… if (istr & istr_esof) { if (usbd_p_error_event) { usbd_p_error_event(3); } istr = ~istr_esof; } …… }   
这下串口助手一下子丝滑了,舒服!


威盛推出VB7009 Mini-ITX小板
中兴V5Max影音游戏功能怎么样
激光深熔焊接的主要工艺参数
移动照明是利益很大的生意吗?
魅蓝Note5引发的风暴?2017年国产手机全面涨价
如何调试GD32虚拟串口的两个BUG?
挑战不可能完成任务! 歪果仁无人机换灯泡看看是如何做到的
工厂人员定位系统,定位考勤系统详解
粮仓无线监测系统解决方案,粮仓也能实现无人值守!
利用人工智能技术推动智能化转型升级
基于二极管的限幅电路
技术分享 | 这么“省”是不是有点过头了?
作为全新类别的光学传感器,FAP 10模块获得美国认可
平安科技与山西省卫计委开展医疗AI合作,“解锁”医疗质控新模式
飞凌嵌入式RK3568J核心板助力工业机器人产业迈向高质量发展新阶段
借势物联网智能设备实现场景化
三星创建人工智能编解码器来支持8K内容
研究人员使用NVIDIA GPU构建活细胞模拟
DD马达DDR电机未来趋势分析
u-blox LEXI-R4模块支持2G回退功能