本帖最后由 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)
|