貌似一个ST官方USB库的bug

[复制链接]
9364|50
 楼主| quyifei 发表于 2013-6-10 21:07 | 显示全部楼层 |阅读模式
ST, BUG, USB, ic, TI
本帖最后由 quyifei 于 2013-6-10 21:42 编辑

本人最近调试USB的虚拟串口,修改自st官方固件库(STM32 USB-FS-Device Library 4.0.0)的例程。 程序实现的功能是每隔1s从STM32向上位机发送“Hello 21ic”的字符串。如果一切正常,PC的上位机“串口调试助手”会不停的接收到“Hello 21ic”

修改后的源代码下面会给出。其中USB_VirtualCOM_t1是成功的, USB_VirtualCOM_t2是失败的。两者的区别就在于延时的方式不同,

USB_VirtualCOM_t1 采用的是非精确延时, tmp=10000000; while(tmp--); 大概延时1s。
USB_VirtualCOM_t2 采用的是精确延时,采用systick,程序中配置systick为1000Hz,Delay_ms(1000)用来延时1s。 下面是代码main()

  1. int main(void)
  2. {
  3. /*Configuration Systick as 1000Hz*/
  4. if (SysTick_Config(SystemCoreClock / 1000))
  5. {
  6. while (1);
  7. }
  8. Set_System();
  9. USB_Interrupts_Config();
  10. Set_USBClock();
  11. USB_Init();
  12. while (1)
  13. {
  14. if (bDeviceState == CONFIGURED)
  15. {
  16. UserToPMABufferCopy(USBData, ENDP1_TXADDR, 11);
  17. SetEPTxCount(ENDP1, 11);
  18. SetEPTxValid(ENDP1); //Valid EDNP1 to start sending "Hello 21ic" to PC
  19. }
  20. /*
  21. volatile uint32_t tmp=0;
  22. tmp=10000000;
  23. while(tmp--); //delay 1s */
  24. Delay_ms(1000); //delay 1s
  25. }
  26. }

遇到的问题是:如果你把USB插入到PC后很快的打开“串口调试助手”,并打开串口,开始几秒会正常接收,但是几秒钟后接收中断

上面是在WINXP下测试,WIN7稍好,会连续接收1分多钟,然后才中断接收。

接收中断后观察寄存器的值,发现USB_EP1R的STAT_TX=0x03,说明ENDP1的IN是总是处于Valid状态。 这是不对的,如果从PC接收到IN指令后,USB_EP1R的STAT_TX会从0x03变到0x02。 很显然问题出在 USB_EP1R的STAT_TX无法从0x03变到0x02。

测试用的开发板是我自制的,叫攸米板,芯片是STM32F103C8T6,攸米板的介绍请看 https://bbs.21ic.com/icview-560714-1-1.html。使用的开发工具是IAR EWARM6.40。 在目录EWARM打开Project.eww,build all,然后下载即可运行。

如果你的板子是其他的芯片,只要是STM32F103系列的,只要把启动文件更改下(我的是md的,你的可能是hd的),源代码无需更改。再在项目的Opitions里把目标芯片改下就可以了。


仅仅是延时方式的不同就会造成结果的不同,我觉得可能是一个bug。开始怀疑是不是Systick中断会对USB的中断造成影响,可是Systick中断的优先级已经设为最低了(0x0F)。 ST官方的例程里是没有打开Systick的,可是Systick是一个非常基本的中断,实际应用中几乎没法不用。

恳请ST的FAE帮忙测试,谢谢!

源代码:
USB_VirtualCOM_t1.zip (543.9 KB, 下载次数: 28)

USB_VirtualCOM_t2.zip (543.92 KB, 下载次数: 17)


dong_abc 发表于 2013-6-12 04:05 | 显示全部楼层
hkcj 发表于 2013-6-12 18:57 | 显示全部楼层
不是很了解这一块   楼主   帮你顶一个   再看看别人的意见吧
s_f_tan 发表于 2013-6-13 09:36 | 显示全部楼层
我也遇到过类似的问题,定时在 In中断中填写好数据包后发送后,上位机有时要过一段时间才能收到,有时会收到一大段数据
 楼主| quyifei 发表于 2013-6-13 13:41 | 显示全部楼层
ST的FAE, 有人会反应这个问题吗?
 楼主| quyifei 发表于 2013-6-13 13:55 | 显示全部楼层
s_f_tan 发表于 2013-6-13 09:36
我也遇到过类似的问题,定时在 In中断中填写好数据包后发送后,上位机有时要过一段时间才能收到,有时会收 ...

那是怎么解决的呢?
STARM 发表于 2013-6-13 15:43 | 显示全部楼层
发送新数据包之前确认前一个数据包已经发送 ?
 楼主| quyifei 发表于 2013-6-13 16:15 | 显示全部楼层
本帖最后由 quyifei 于 2013-6-13 16:18 编辑
STARM 发表于 2013-6-13 15:43
发送新数据包之前确认前一个数据包已经发送 ?

USB的波特率是12M,每一秒仅仅发送一个11个字节的字符串,这个发送频率可以保证每次发送之前上一次发送已经完成,所以是不需要确认的。
cjhk 发表于 2013-6-13 22:04 | 显示全部楼层
感觉应该是你程序的问题     STM的芯片一般还是很可靠的   楼主   仔细查一查你的程序   
 楼主| quyifei 发表于 2013-6-13 22:17 | 显示全部楼层
cjhk 发表于 2013-6-13 22:04
感觉应该是你程序的问题     STM的芯片一般还是很可靠的   楼主   仔细查一查你的程序    ...

其实我自己写的代码很少,基本上是沿用ST 官方给的例子,并且在不用systick的时候已经实现了自己想要的结果。 我已经仔细检查过代码,没有发现问题。

问题是当我使用systick,结果开始几秒是对的,几秒钟后就不对了。

我并不怀疑芯片本身有什么问题,我怀疑ST的官方库有问题。
STARM 发表于 2013-6-14 08:22 | 显示全部楼层
quyifei 发表于 2013-6-13 16:15
USB的波特率是12M,每一秒仅仅发送一个11个字节的字符串,这个发送频率可以保证每次发送之前上一次发送已 ...

能否测试一下 ? 尽管可以发送完成, 是不是 PC 太忙了, 没有发出in请求?
 楼主| quyifei 发表于 2013-6-14 14:34 | 显示全部楼层
STARM 发表于 2013-6-14 08:22
能否测试一下 ? 尽管可以发送完成, 是不是 PC 太忙了, 没有发出in请求?

应该不是PC太忙了。 总不会一打开Systick PC就忙,关掉Systick PC 就不忙了。
hawksabre 发表于 2013-6-14 19:08 | 显示全部楼层
个人觉得应该不会是单片机的bug  应该是你代码的问题  个人的理解
STARM 发表于 2013-6-14 23:30 | 显示全部楼层
应该不会是单片机的bug, 要么是st的代码有问题, 要么是你的代码有问题吧
STARM 发表于 2013-6-14 23:32 | 显示全部楼层
什么事件触发的中断 ?
 楼主| quyifei 发表于 2013-6-16 09:55 | 显示全部楼层
STARM 发表于 2013-6-14 23:32
什么事件触发的中断 ?

中断的触发是CTR_Tx, 中断的管理都是库写好的。
STARM 发表于 2013-6-16 10:31 | 显示全部楼层
quyifei 发表于 2013-6-16 09:55
中断的触发是CTR_Tx, 中断的管理都是库写好的。

接收中断后观察寄存器的值,发现USB_EP1R的STAT_TX=0x03,说明ENDP1的IN是总是处于Valid状态。
这是不对的,如果从PC接收到IN指令后,USB_EP1R的STAT_TX会从0x03变到0x02。
很显然问题出在 USB_EP1R的STAT_TX无法从0x03变到0x02。

这么看来是 USB 硬件的问题, 而不是代码问题

另外, 你是否开了双缓冲 ?
STARM 发表于 2013-6-16 11:16 | 显示全部楼层
能够上传驱动程序 ? 编译,下载了, 没有驱动可用
STARM 发表于 2013-6-16 14:54 | 显示全部楼层
安装 Virtual COM Port driver - Release 1.3.1 驱动后测试
没有发现楼主提及的问题吆
STARM 发表于 2013-6-16 14:57 | 显示全部楼层
用到 WIN8, 使用的软件是 SecureCRT, 会不会是“串口调试助手”的问题呢 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:最小STM32开发板-攸米板淘宝: yifei-stm.taobao.com 博客: blog.sina.com.cn/yifeistm

29

主题

146

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部