本帖最后由 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, 下载次数: 28)
USB_VirtualCOM_t2.zip
(543.92 KB, 下载次数: 17)
|