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

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

3天内不再提示

关于GD32虚拟串口的两个BUG

Dp1040 来源:鱼鹰谈单片机 2023-07-25 09:55 次阅读

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

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

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

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

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

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

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

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

1c63214c-2a03-11ee-a368-dac502259ad0.png

BUG 1

枚举失败。

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

1c91f8be-2a03-11ee-a368-dac502259ad0.png

▲正常回应

1ca760f0-2a03-11ee-a368-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数据包,从而没有恢复接收有效状态,导致串口助手卡死。 1cc0d6de-2a03-11ee-a368-dac502259ad0.png 这段官方代码也确实比较迷,没有最大利用缓存空间(最少需要满一包的空间,但实际可能不满一包),不过按下不表。 那就是第一次收到的数据未读呗,在main()函数里面发现根本没进来,发现竟然一直在USB中断执行……

void main()
 {
   while(1)
   {
    ……
     if (usb_rx_ch == -1)
            usb_rx_ch = USBD_CDC_ACM_GetChar();
    ……  
   }
}
然后看到这个标志一直在,未清除导致。

1cf46878-2a03-11ee-a368-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;
  }


  ……
}

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

审核编辑:汤梓红

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

    关注

    146

    文章

    16848

    浏览量

    349788
  • 寄存器
    +关注

    关注

    31

    文章

    5282

    浏览量

    119763
  • 调试器
    +关注

    关注

    1

    文章

    298

    浏览量

    23662
  • 虚拟串口
    +关注

    关注

    3

    文章

    60

    浏览量

    13855
  • GD32
    +关注

    关注

    7

    文章

    403

    浏览量

    24092

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

文章出处:【微信号:玩点嵌入式,微信公众号:玩点嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是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与STM32之间的区别

    GD32与STM32的启动时间存在差异,为了让GD32 MCU更准确复位(不修改可能无法复位)。12.串口通信不同点: GD32在连续发送数据的时候每
    发表于 09-26 14:28

    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

    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 54次下载
    stm32f103&<b class='flag-5'>gd32</b>的usb<b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>,打印类printer组合设备

    STM32和GD32有什么区别?

    是不同的产品,不可能所有东西都沿用STM32,有些自主开发的东西还是有区别的。相同的地方我们就不说了,下面我给大家讲一下不同的地方。二、区别1、内核GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419
    发表于 12-24 19:09 15次下载
    STM32和<b class='flag-5'>GD32</b>有什么区别?

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

    最近鱼鹰在搞调试器,折腾了好多天终于理解了 MDK 、下载算法、调试器、MCU 之间的关系。
    的头像 发表于 07-18 17:40 1644次阅读
    如何调试<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 6997次阅读

    GD32和AT32哪个好?

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

    GD32与STM32兼容吗?

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

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

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