0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

鱼鹰谈单片机 来源:鱼鹰谈单片机 2023-07-18 17:40 次阅读

最近鱼鹰在搞调试器,折腾了好多天终于理解了 MDK 、下载算法、调试器、MCU 之间的关系。

简单来说,就是,调试器作为 USB 转 SWD 协议的转换工具,MDK 通过 USB 驱动这个工具,下载算法包含了一些 MCU 内部 FLASH 擦除、编程代码,和普通代码不同的是,该代码可以下载在任意位置运行。如果需要校验,还会加入 CRC 校验代码,扇区检测代码。

MDK 首先通过调试器将算法写入内部 RAM,然后把需要写入的固件程序写入 RAM,再由 MDK 控制(通过调试器) MCU 执行相应代码(擦除或写入扇区),通过 MCU 的寄存器和设定软件断点得到执行结果,如此来回搬运,就可完成固件下载。

说起来简单,做起来很麻烦(调试器工具功能简单,只做协议转换,如何控制通过 MDK),这里点到为止,有时间会好好整理分享一下。

之后准备 USB 相关的工作,发现总是没有满意的 USB CORE 库,官方的库感觉还不错,可惜被封装了,看不到源码,放弃。

之前鱼鹰分享过虚拟串口的代码,于是下载下来使用,发现竟然在 GD32 中用不了,当初明明 ST 测试没问题的。

还以为是 GD 芯片问题,然后使用之前的 USB 双缓冲读卡器代码,发现没有问题。

只能在线调试比较差异,借助逻辑分析仪,总算解决了这两个 BUG,顺利自发自收。

cb537256-254e-11ee-962d-dac502259ad0.png

BUG 1

枚举失败。

通过逻辑分析仪发现,电脑发送控制帧给 USB 设备,竟然没有任何回应,即没有 NAK,也米有 STALL,更不用说 ACK 了。

cb75ba14-254e-11ee-962d-dac502259ad0.png

正常回应

cb8f9236-254e-11ee-962d-dac502259ad0.png

无回应

通过调试发现,该端点接收状态为0,禁用状态,再参考可用代码,发现在复位之后,应该设置为接收有效才对。因此修改如下:

void USBD_Reset (void)
{
………………
……
  ……
EPxREG(0)=EP_CONTROL|EP_RX_VALID;// 除了设定端点类型外,还要使能接收
  DADDR = DADDR_EF | 0;                 /* Enable USB Default Address         */
}

很奇怪的是,ST 我以前测试是没问题的,可能也是两者之间的差异吧。。

BUG2

枚举成功后,又出现另外一个问题,就是串口只能发送第一帧数据,第二次卡死……

经过逻辑分析仪发现,发送的数据会被 NAK。后来才发现下面的语句不满足,直接没有读 USB 数据包,从而没有恢复接收有效状态,导致串口助手卡死。

cbad0dfc-254e-11ee-962d-dac502259ad0.png

这段官方代码也确实比较迷,没有最大利用缓存空间(最少需要满一包的空间,但实际可能不满一包),不过按下不表。

那就是第一次收到的数据未读呗,在 main() 函数里面发现根本没进来,发现竟然一直在 USB 中断执行……

void main()
 {
   while(1)
   {
    ……
     if (usb_rx_ch == -1)
            usb_rx_ch = USBD_CDC_ACM_GetChar();
    ……  
   }
}

然后看到这个标志一直在,未清除导致。

cbfbf354-254e-11ee-962d-dac502259ad0.png

但很奇怪的事,该代码在 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;
  }
  
  ……
}

这下串口助手一下子丝滑了,舒服!






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 缓冲器
    +关注

    关注

    6

    文章

    1920

    浏览量

    45450
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1367

    浏览量

    114548
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27486
  • 调试器
    +关注

    关注

    1

    文章

    300

    浏览量

    23696
  • GD32
    +关注

    关注

    7

    文章

    403

    浏览量

    24237

原文标题:关于 GD32 虚拟串口的两个 BUG

文章出处:【微信号:emOsprey,微信公众号:鱼鹰谈单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是GD32

    是不同的产品,不可能所有东西都沿用STM32,有些自主开发的东西还是有区别的。相同的地方我们就不说了,下面我给大家讲一下不同的地方。二、区别1、内核GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419
    发表于 08-12 07:46

    GD32与STM32有何区别

    所有东西都沿用STM32,有些自主开发的东西还是有区别的。相同的地方我们就不说了,下面我给大家讲一下不同的地方。二、区别1、内核GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419这一
    发表于 08-13 07:21

    GD32 DMA串口通讯DEMO的相关资料推荐

    GD32 DMA串口通讯GD32 USART0 DMA发送与接收不定长数据GD32E230简介GD32E230采用DMA进行
    发表于 12-10 06:26

    浅析stm32f103&gd32的u***虚拟串口+打印类printer组合设备

    stm32f103&gd32的u***虚拟串口+打印类printer组合设备@TOCstm32f103&gd32的u***虚拟
    发表于 01-26 06:27

    GD32串口回环的设置解析

    GD32串口IO该怎样去设置呢?GD32串口接收该怎样去设置呢?
    发表于 02-28 06:33

    GD32替换STM32?这些坑你别踩...

    STM32还是要高的。6、串口GD在连续发送数据的时候每两个字节之间会有一Bit的Idle,而STM32没有,如下图。GD
    发表于 03-31 10:51

    两个实用的串口调试助手

    电子发烧友网站提供《两个实用的串口调试助手.zip》资料免费下载
    发表于 07-22 15:22 8次下载

    虚拟串口VSPD

    虚拟串口,对于程序调试很有用,可以建立两个互联的虚拟串口
    发表于 01-08 12:03 46次下载

    GD32 DMA串口通讯DEMO

    GD32 DMA串口通讯GD32 USART0 DMA发送与接收不定长数据GD32E230简介GD32E230采用DMA进行
    发表于 11-26 19:36 74次下载
    <b class='flag-5'>GD32</b> DMA<b class='flag-5'>串口</b>通讯DEMO

    stm32f103&gd32的usb虚拟串口,打印类printer组合设备

    stm32f103&gd32的usb虚拟串口+打印类printer组合设备@TOCstm32f103&gd32的usb虚拟
    发表于 12-02 16:06 55次下载
    stm32f103&<b class='flag-5'>gd32</b>的usb<b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>,打印类printer组合设备

    关于GD32虚拟串口两个BUG

    最近在搞调试器,折腾了好多天,终于理解了MDK、下载算法、调试器、MCU之间的关系。
    的头像 发表于 07-25 09:55 1466次阅读
    关于<b class='flag-5'>GD32</b><b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>的<b class='flag-5'>两个</b><b class='flag-5'>BUG</b>

    gd32和stm32的区别

    gd32和stm32的区别 现在的市场上有很多种不同类型的微控制器,其中比较常见的有种,即gd32和stm32。种微控制器都是中国和欧洲的两个
    的头像 发表于 08-16 11:16 7099次阅读

    GD32和AT32哪个好?

    创科技(Atmel的中国合资公司)开发。这种型号都具有自己的特点和优缺点,选择哪一更好取决于你的具体需求。 GD32GD32是GigaDevice Semiconductor推
    的头像 发表于 08-16 11:32 2329次阅读

    GD32与STM32兼容吗?

    GD32与STM32兼容吗? GD32与STM32是两个不同的微控制器系列,是由两个不同的公司设计和生产的。GD32系列是由国内的长沙国芯微
    的头像 发表于 08-16 11:32 2859次阅读

    GD32 串口接受异常的几个原因

    前面我们介绍过GD32 485发送时出现异常的最常见原因,有小伙伴反馈想要知道GD32 串口接受异常的可能原因,今天我们就来安排。
    的头像 发表于 01-18 09:57 4139次阅读
    <b class='flag-5'>GD32</b> <b class='flag-5'>串口</b>接受异常的几个原因