因爲某些需求,需要在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驅動文件。