因为某些需求,需要在STM32上开发USB驱动,从网上找了个CDC的例子,又找了VC的上位机进行通信测试,把我两百多的下载积分都用光了,哎真是坑啊,有些下载了基本不能用,不是endpoint的通信。
第一个坑:USB开发时,其系统频率必须使用168MHz,具体我就不细说了,可以参考下面的帖子:
https://blog.csdn.net/zhengnianli/article/details/102946950
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的中断处理程序:
第三个需要注意的地方:USB移植完成后,使用USBTreeView查看USB节点,USB节点上有一个黄色的感叹号,使用上位机软件可以打开USB设备,但是在数据传输时失败。
查找问题,原来是USB在调用USBD_malloc() 申请内存是失败,导致数据无法接收。
网上查找,找到解决方法如下,修改startup_stm32f429_439xx.s文件中的Heap_Size为0x400或者0x800,具体原因参考以下链接:
https://blog.csdn.net/qcopter/article/details/52510923
修改后,可以正常通信了。
另附:调试USB设备用到的软件名称:
BusHound:可查看USB设备节点,可进行USB的通信测试,监控USB收发数据。
USBTreeView:可查看USB设备节点,可查看USB节点的具体信息,如描述,路径,ID等。
NI-VISA:可生成USB驱动文件。