打印

关于GD32虚拟串口的两个BUG

[复制链接]
698|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 elephant00 于 2023-9-19 15:22 编辑

最近在搞调试器,折腾了好多天,终于理解了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;  }
  …… }
这下串口助手一下子丝滑了,舒服!



使用特权

评论回复
沙发
Bowclad| | 2023-9-27 19:56 | 只看该作者
封装了,拿来直接用不就好了

使用特权

评论回复
板凳
Undshing| | 2023-9-27 21:50 | 只看该作者
不让看源码也不影响用啊

使用特权

评论回复
地板
tpgf| | 2023-10-12 11:37 | 只看该作者
一般虚拟串口都可以通过什么方式创建呢

使用特权

评论回复
5
kxsi| | 2023-10-12 11:50 | 只看该作者
为什么虚拟串口的稳定性都比较差呢

使用特权

评论回复
6
zljiu| | 2023-10-12 12:10 | 只看该作者
这种通过更改配置就可以正常运行的地方 都不是芯片自身的问题

使用特权

评论回复
7
磨砂| | 2023-10-12 13:13 | 只看该作者
卡死的原因就是因为没有应答信号所以就死循环了吧

使用特权

评论回复
8
晓伍| | 2023-10-12 13:41 | 只看该作者
用户在调用相关功能的函数的时候 最好必要的操作封装在函数体内

使用特权

评论回复
9
aoyi| | 2023-10-12 20:46 | 只看该作者
楼主说的这两个bug应该不能叫bug  只是单片机之间的差异而已

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

968

主题

2962

帖子

7

粉丝