OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 27491|回复: 33

发个STM32的USB库函数一个bug的解决方法

[复制链接]

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
发表于 2015-12-8 14:18:04 | 显示全部楼层 |阅读模式

声明一:
本资料是我在别处发现的,非我原创;
但我已经使用一年多了,确实有效。

声明二:
希望各位不要传播到A莫那里,自己用没问题!

STM32的USB库函数有bug。
在使用USB虚拟串口的时候,如果上位机软件没有打开(或者类似情况下),
下位机CPU会频繁进入USB库的中断,非常频繁,以至于不能正常执行其他操作,和死机基本相同。
原发帖人解决了这个问题,
我也遇到完全相同的问题,用这个解决方法同样有效。


ps:这个方法被本坛另一位网友验证了,参见    http://openedv.com/posts/list/0/64138.htm#365570



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-4-28 19:33:50 | 显示全部楼层
V2.2.0的库已经修正了上述错误,修正如下:

[mw_shl_code=c,true]ep->xfer_buff  += len;
    ep->xfer_count += len;
   
    txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS);

/* Mask the TxFIFOEmpty interrupt  */
    if (ep->xfer_len == ep->xfer_count)
    {
      fifoemptymsk = 0x1 << ep->num;  
      USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK,
                           fifoemptymsk, 0);
    }[/mw_shl_code]
回复 支持 1 反对 0

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
 楼主| 发表于 2015-12-8 14:20:31 | 显示全部楼层

原帖如下:

usb_dcusb_dcd_int.c文件中,函数DCD_WriteEmptyTxFifo有个bug,会导致经常死循环,导致usb库耗时过长。
应该如下修改,在原始程序中增加红框内的语句:



回复 支持 0 反对 1

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12991
金钱
12991
注册时间
2012-11-26
在线时间
3789 小时
发表于 2015-12-8 14:22:37 | 显示全部楼层
收藏下  也许之后用的上,感谢
学无止境
回复 支持 反对

使用道具 举报

18

主题

112

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
363
金钱
363
注册时间
2015-10-29
在线时间
49 小时
发表于 2015-12-8 17:28:29 | 显示全部楼层
马克下。感谢分享!
回复 支持 反对

使用道具 举报

48

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2015-4-6
在线时间
3 小时
发表于 2015-12-8 20:16:40 | 显示全部楼层
好东西  必须收藏
回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
 楼主| 发表于 2015-12-10 17:54:24 | 显示全部楼层
好消息,这个方法被本坛另一位网友验证了,有效。

http://openedv.com/posts/list/64138.htm#365570
回复 支持 反对

使用道具 举报

26

主题

193

帖子

8

精华

金牌会员

Rank: 6Rank: 6

积分
1800
金钱
1800
注册时间
2012-8-23
在线时间
57 小时
发表于 2015-12-10 21:55:52 | 显示全部楼层
之前遇到过这种问题....
回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
 楼主| 发表于 2015-12-10 23:17:30 | 显示全部楼层
回复【7楼】beyond696:
---------------------------------
有然后吗?我关心怎么解决的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-12-10 23:47:53 | 显示全部楼层
不错,谢谢分享。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

193

帖子

8

精华

金牌会员

Rank: 6Rank: 6

积分
1800
金钱
1800
注册时间
2012-8-23
在线时间
57 小时
发表于 2015-12-11 18:02:35 | 显示全部楼层
回复【8楼】xuande:
---------------------------------
我的情况稍有不同,解决办法也不优雅,不值得推荐
回复 支持 反对

使用道具 举报

43

主题

481

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1352
金钱
1352
注册时间
2014-12-24
在线时间
321 小时
发表于 2016-3-11 15:16:25 | 显示全部楼层
不错,点赞!
回复 支持 反对

使用道具 举报

23

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-1-20
在线时间
34 小时
发表于 2016-3-11 16:50:37 | 显示全部楼层
码。   以后用到的时候看。
回复 支持 反对

使用道具 举报

4

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2016-3-31
在线时间
42 小时
发表于 2016-4-1 00:37:24 | 显示全部楼层
收藏,谢谢
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2014-12-2
在线时间
34 小时
发表于 2016-6-13 15:27:17 | 显示全部楼层
xuande 发表于 2015-12-8 14:20
原帖如下:

usb_dcusb_dcd_int.c文件中,函数DCD_WriteEmptyTxFifo有个bug,会导致经常死循环,导致us ...

按照这个修改进行操作结果总是丢包。发不出去
回复 支持 反对

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-4-30
在线时间
44 小时
发表于 2016-6-14 12:06:29 | 显示全部楼层
MARK下
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-8-22
在线时间
2 小时
发表于 2016-8-22 19:50:16 | 显示全部楼层
lvehe 发表于 2016-4-28 19:33
V2.2.0的库已经修正了上述错误,修正如下:

[mw_shl_code=c,true]ep->xfer_buff  += len;

你好,请问下V2.2.0的库能在哪里下载到?
回复 支持 反对

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-8-22 22:16:15 | 显示全部楼层
zyzy1251 发表于 2016-8-22 19:50
你好,请问下V2.2.0的库能在哪里下载到?

ST官网啊
回复 支持 反对

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-8-22 22:59:05 | 显示全部楼层
xuande 发表于 2015-12-8 14:20
原帖如下:

usb_dcusb_dcd_int.c文件中,函数DCD_WriteEmptyTxFifo有个bug,会导致经常死循环,导致us ...

CDC类,我在用STM32做主机时发现类似问题,如果向U转串芯片发IN包查询是否有收到数据,那没有数据时串口芯片会应答NAK,按STM32库的逻辑,收到NAK之后会再次重启IN令牌,然后再次收到NAK,直到超时退出.
那么这样一来,只要串口芯片没有数据,那就会对IN令牌应答NAK,STM32就会一直在处理NAK中断,导致系统很卡.
这也应该算是一个BUG.我的处理方法并不优雅,就不献丑了
回复 支持 反对

使用道具 举报

1

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2016-8-15
在线时间
20 小时
发表于 2016-8-23 12:21:50 | 显示全部楼层
还没有学到
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-1-17
在线时间
3 小时
发表于 2016-9-21 09:52:41 | 显示全部楼层
记号一下,USB BUG
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2016-4-7
在线时间
96 小时
发表于 2016-9-21 17:23:34 | 显示全部楼层
谢谢分享,先收藏了
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-5-31
在线时间
7 小时
发表于 2016-9-21 22:14:21 | 显示全部楼层
好东西  正在学习USB
置之死地而后生,放手一搏............
回复 支持 反对

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2016-7-19
在线时间
168 小时
发表于 2017-3-1 08:11:14 | 显示全部楼层
收下了,谢谢楼主!!
回复 支持 反对

使用道具 举报

41

主题

113

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2016-12-16
在线时间
222 小时
发表于 2017-3-1 13:54:57 | 显示全部楼层
阿mo的人品是不是很差????
https://shop298719590.taobao.com/
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
636
金钱
636
注册时间
2014-6-20
在线时间
168 小时
发表于 2017-3-6 10:53:57 | 显示全部楼层
收了 多谢分享!
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
391
金钱
391
注册时间
2014-8-25
在线时间
157 小时
发表于 2017-5-22 08:32:51 | 显示全部楼层
挖坟, mark!我以前试过,确实有用!
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2014-12-2
在线时间
34 小时
发表于 2018-5-24 10:54:23 | 显示全部楼层
我改了之后传输速度相当慢呀
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
379
金钱
379
注册时间
2016-8-1
在线时间
108 小时
发表于 2019-12-28 00:28:29 | 显示全部楼层
这几天一直在弄VCP还没有发现问题
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2019-12-11
在线时间
7 小时
发表于 2019-12-29 09:04:14 | 显示全部楼层
看不到~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

3

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2015-10-28
在线时间
56 小时
发表于 2019-12-30 11:28:17 | 显示全部楼层
MARK,以后或许能用到!感谢
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-5-27
在线时间
8 小时
发表于 2020-4-15 09:25:05 | 显示全部楼层
zmingwang 发表于 2016-8-22 22:59
CDC类,我在用STM32做主机时发现类似问题,如果向U转串芯片发IN包查询是否有收到数据,那没有数据时串口芯片 ...

大佬您好,请问一下,这个您是怎么解决的,遇到了类似的问题,看看能不能借用一下
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-5-5
在线时间
7 小时
发表于 2020-4-22 04:57:52 | 显示全部楼层
楼上得图片都失效了,这里附上函数:
  1. static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum)
  2. {
  3.     uint32_t fifoemptymsk;

  4.     USB_OTG_DTXFSTSn_TypeDef  txstatus;
  5.     USB_OTG_EP *ep;
  6.     uint32_t len = 0;
  7.     uint32_t len32b;
  8.     txstatus.d32 = 0;

  9.     ep = &pdev->dev.in_ep[epnum];

  10.     len = ep->xfer_len - ep->xfer_count;

  11.     if (len > ep->maxpacket)
  12.     {
  13.         len = ep->maxpacket;
  14.     }

  15.     len32b = (len + 3) / 4;
  16.     txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS);

  17.     while  (txstatus.b.txfspcavail > len32b &&
  18.             ep->xfer_count < ep->xfer_len &&
  19.             ep->xfer_len != 0)
  20.     {
  21.         /* Write the FIFO */
  22.         len = ep->xfer_len - ep->xfer_count;

  23.         if (len > ep->maxpacket)
  24.         {
  25.             len = ep->maxpacket;
  26.         }
  27.         len32b = (len + 3) / 4;

  28.         USB_OTG_WritePacket (pdev, ep->xfer_buff, epnum, len);

  29.         ep->xfer_buff  += len;
  30.         ep->xfer_count += len;

  31.         txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS);

  32.         /* Mask the TxFIFOEmpty interrupt  */
  33.         if (ep->xfer_len == ep->xfer_count)
  34.         {
  35.             fifoemptymsk = 0x1 << ep->num;
  36.             USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK,
  37.                                  fifoemptymsk, 0);
  38.         }
  39.     }

  40.     return 1;
  41. }
复制代码
回复 支持 反对

使用道具 举报

4

主题

116

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3944
金钱
3944
注册时间
2017-11-15
在线时间
323 小时
发表于 2021-12-5 22:52:59 | 显示全部楼层
放上4.1.0的官方库

en.stsw-stm32121_v4.1.0.zip

6.2 MB, 下载次数: 2

www.littlebutler.top
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 10:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表