打印

貌似一个ST官方USB库的bug

[复制链接]
8055|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()

int main(void)
{
/*Configuration Systick as 1000Hz*/
if (SysTick_Config(SystemCoreClock / 1000))
{
while (1);
}
Set_System();
USB_Interrupts_Config();
Set_USBClock();
USB_Init();
while (1)
{
if (bDeviceState == CONFIGURED)
{
UserToPMABufferCopy(USBData, ENDP1_TXADDR, 11);
SetEPTxCount(ENDP1, 11);
SetEPTxValid(ENDP1); //Valid EDNP1 to start sending "Hello 21ic" to PC
}
/*
volatile uint32_t tmp=0;
tmp=10000000;
while(tmp--); //delay 1s */
Delay_ms(1000); //delay 1s
}
}

遇到的问题是:如果你把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)

USB_VirtualCOM_t2.zip (543.92 KB)


沙发
dong_abc| | 2013-6-12 04:05 | 只看该作者

使用特权

评论回复
板凳
hkcj| | 2013-6-12 18:57 | 只看该作者
不是很了解这一块   楼主   帮你顶一个   再看看别人的意见吧

使用特权

评论回复
地板
s_f_tan| | 2013-6-13 09:36 | 只看该作者
我也遇到过类似的问题,定时在 In中断中填写好数据包后发送后,上位机有时要过一段时间才能收到,有时会收到一大段数据

使用特权

评论回复
5
quyifei|  楼主 | 2013-6-13 13:41 | 只看该作者
ST的FAE, 有人会反应这个问题吗?

使用特权

评论回复
6
quyifei|  楼主 | 2013-6-13 13:55 | 只看该作者
s_f_tan 发表于 2013-6-13 09:36
我也遇到过类似的问题,定时在 In中断中填写好数据包后发送后,上位机有时要过一段时间才能收到,有时会收 ...

那是怎么解决的呢?

使用特权

评论回复
7
STARM| | 2013-6-13 15:43 | 只看该作者
发送新数据包之前确认前一个数据包已经发送 ?

使用特权

评论回复
8
quyifei|  楼主 | 2013-6-13 16:15 | 只看该作者
本帖最后由 quyifei 于 2013-6-13 16:18 编辑
STARM 发表于 2013-6-13 15:43
发送新数据包之前确认前一个数据包已经发送 ?

USB的波特率是12M,每一秒仅仅发送一个11个字节的字符串,这个发送频率可以保证每次发送之前上一次发送已经完成,所以是不需要确认的。

使用特权

评论回复
9
cjhk| | 2013-6-13 22:04 | 只看该作者
感觉应该是你程序的问题     STM的芯片一般还是很可靠的   楼主   仔细查一查你的程序   

使用特权

评论回复
10
quyifei|  楼主 | 2013-6-13 22:17 | 只看该作者
cjhk 发表于 2013-6-13 22:04
感觉应该是你程序的问题     STM的芯片一般还是很可靠的   楼主   仔细查一查你的程序    ...

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

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

我并不怀疑芯片本身有什么问题,我怀疑ST的官方库有问题。

使用特权

评论回复
11
STARM| | 2013-6-14 08:22 | 只看该作者
quyifei 发表于 2013-6-13 16:15
USB的波特率是12M,每一秒仅仅发送一个11个字节的字符串,这个发送频率可以保证每次发送之前上一次发送已 ...

能否测试一下 ? 尽管可以发送完成, 是不是 PC 太忙了, 没有发出in请求?

使用特权

评论回复
12
quyifei|  楼主 | 2013-6-14 14:34 | 只看该作者
STARM 发表于 2013-6-14 08:22
能否测试一下 ? 尽管可以发送完成, 是不是 PC 太忙了, 没有发出in请求?

应该不是PC太忙了。 总不会一打开Systick PC就忙,关掉Systick PC 就不忙了。

使用特权

评论回复
13
hawksabre| | 2013-6-14 19:08 | 只看该作者
个人觉得应该不会是单片机的bug  应该是你代码的问题  个人的理解

使用特权

评论回复
14
STARM| | 2013-6-14 23:30 | 只看该作者
应该不会是单片机的bug, 要么是st的代码有问题, 要么是你的代码有问题吧

使用特权

评论回复
15
STARM| | 2013-6-14 23:32 | 只看该作者
什么事件触发的中断 ?

使用特权

评论回复
16
quyifei|  楼主 | 2013-6-16 09:55 | 只看该作者
STARM 发表于 2013-6-14 23:32
什么事件触发的中断 ?

中断的触发是CTR_Tx, 中断的管理都是库写好的。

使用特权

评论回复
17
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 硬件的问题, 而不是代码问题

另外, 你是否开了双缓冲 ?

使用特权

评论回复
18
STARM| | 2013-6-16 11:16 | 只看该作者
能够上传驱动程序 ? 编译,下载了, 没有驱动可用

使用特权

评论回复
19
STARM| | 2013-6-16 14:54 | 只看该作者
安装 Virtual COM Port driver - Release 1.3.1 驱动后测试
没有发现楼主提及的问题吆

使用特权

评论回复
20
STARM| | 2013-6-16 14:57 | 只看该作者
用到 WIN8, 使用的软件是 SecureCRT, 会不会是“串口调试助手”的问题呢 ?

使用特权

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

本版积分规则

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

29

主题

146

帖子

1

粉丝