【STM32F4xx】USB开发的一些坑!

时间:2024-04-07 22:42:24

        因为某些需求,需要在STM32上开发USB驱动,从网上找了个CDC的例子,又找了VC的上位机进行通信测试,把我两百多的下载积分都用光了,哎真是坑啊,有些下载了基本不能用,不是endpoint的通信。

        第一个坑:USB开发时,其系统频率必须使用168MHz,具体我就不细说了,可以参考下面的帖子:

        https://blog.csdn.net/zhengnianli/article/details/102946950

        USB的系统频率配置如下:

        【STM32F4xx】USB开发的一些坑!

        【STM32F4xx】USB开发的一些坑!

        由于板子外接晶振频率为8MHz,所以PPL_M为8,PPL_N为336,PPL_P为2,PPL_Q为7,SystemCoreClock为168MHz,计算公式如下:

        SystemCoreClock = ExtFreq/PPL_M*PPL_N/PPL_P = 8MHz/8*336/2 = 168MHz

        USB的时钟为 ExtFreq/PPL_M*PPL_N/PPL_Q = 8MHz/8*336/7 = 48MHz

        由于USB的始终必须为48MHz,因此系统时钟需要用168MHz,详细原因参考上述连接。

 

        第二个需要注意的地方:我把所有的USB驱动移植到工程文件里后,系统启动不了,经过排查,原来是忘了添加USB的中断处理程序:

        【STM32F4xx】USB开发的一些坑!

 

        第三个需要注意的地方:USB移植完成后,使用USBTreeView查看USB节点,USB节点上有一个黄色的感叹号,使用上位机软件可以打开USB设备,但是在数据传输时失败。

【STM32F4xx】USB开发的一些坑!

        查找问题,原来是USB在调用USBD_malloc() 申请内存是失败,导致数据无法接收。

        【STM32F4xx】USB开发的一些坑!

        网上查找,找到解决方法如下,修改startup_stm32f429_439xx.s文件中的Heap_Size为0x400或者0x800,具体原因参考以下链接:

        https://blog.csdn.net/qcopter/article/details/52510923

        【STM32F4xx】USB开发的一些坑!

        修改后,可以正常通信了。

        【STM32F4xx】USB开发的一些坑!

 

        另附:调试USB设备用到的软件名称:

        BusHound:可查看USB设备节点,可进行USB的通信测试,监控USB收发数据。

        USBTreeView:可查看USB设备节点,可查看USB节点的具体信息,如描述,路径,ID等。

        NI-VISA:可生成USB驱动文件。