usb不同的應用需要使用到的端點數和端點資料長度各不相同,如果為每個端點都單獨規劃乙個儲存區非常浪費。
所以stm32為usb模組提供了共512個位元組的儲存區,至於如何為每個端點分配使用這512b的空間,就是使用者自己的事情了,這樣儲存區的分配就非常經濟靈活。這512b空間的首位址是0x40006000。
你看到的#define endp2_rxaddr
(0xd8),這個0xd8就是在這512b空間裡的偏移位址,
說明端點2收到的資料將放在0x40006000 + 0xd8 * 2的位址空間裡
。至於為什麼要×2,是因為這部分儲存區是按照2位元組訪問的,即每存放1個位元組的資料要佔據2個位元組的空間。所以這段儲存區的位址是從0x40006000到0x400063ff。
至於如何定義端點2的傳送緩衝區,就看你的應用了。你把端點2的接受緩衝區定義在0xd8,如果端點2的接收資料長度是64個位元組,那就要為端點2的接收保留64個位元組,端點2的傳送緩衝區就要定義到0xd8+64之後的空間。
即:#define endp2_txaddr
(0xd8+64),
當然也可以#define endp2_txaddr
(0xd8+100)或是其他。
總之如何分配這段儲存區,完全可以按照你應用的需求來做。
最近研究了下103vbt6的usb,看了很多次都看不明白,我開始懷疑我的閱讀能力了。現有以下幾點疑問請教大家
1.緩衝區描述表在緩衝區內即0x4000 6000--0x400063ff。如果我只用端點0,那麼端點0的緩衝區描述表為
addr0_tx、count0_tx、addr0_rx、count0_rx所對應的位址為0x4000 6000--0x4000 6008 (usb_btable = 0)
現在有兩人疑問:
a.0x4000 6008以後的位址可不可以作緩衝區?
b.如果給addr0_tx、count0_tx賦個合適的值,會不會端點0的緩衝區在0x4000 6000--0x4000 6008內,從而覆蓋了它的緩衝區描術表?
2.為什麼分組緩衝區位址(按位元組編址)要乘以2才是緩衝區在mcu的位址,能不能舉個例子說明?
3.0x4000 6000--0x400063ff等於1024位元組,為什麼是512位元組,是不是後一半沒有使用,晶元為103vbt6?如果我有乙個端
點用了512位元組緩衝區,那麼緩衝區就用完了,是不是表示其他端點就沒有緩衝區可用了,連緩衝區描述表都沒有空間可分配了
1.a) 如果只使用端點0,0x4000 6010以後的位址可以作緩衝區。注意不是0x4000 6008以後的位址,原因請看下面的2)。
1.b) 如果給addr0_tx、count0_tx賦的值不合適,端點0的緩衝區有可能覆蓋緩衝區描述表,所以請選擇合適的值,以避免衝突。
2)這是因為分組緩衝區是乙個雙埠的ram,cpu一端需要使用32位方式訪問,但usb模組一端使用16位方式訪問。
例如需要從0x4000 6010開始分配8個位元組的緩衝區,則從cpu一端看,需要占用0x4000 6010、0x4000 6014、0x4000 6018和0x4000 601c開始的4個字的空間,即cpu端每4個位元組的位址空間中,只有2個位元組的位址空間對應實際的儲存器,而另2個位元組的位址空間沒有對應到任何物理的儲存器。
3)1024位元組與512位元組的問題,請看上面的說明。
如果有乙個端點用了512位元組緩衝區,那麼緩衝區就用完了,表示其他端點就沒有緩衝區可用了,連緩衝區描述表都沒有空間可分配了。
STM32 USB學習筆記
stm32 usb學習筆記 一 usb fs device firmware library 使用韌體庫開發程式,需要包含幾個檔案 從圖中可見,應用程式介面部分,有 usb pwr,usb conf,usb desc,usb istr,usb prop,usb endp六個檔案,在裝置驅動中有六個檔...
STM32 USB設計 硬體篇
stm32晶元內部整合了usb外設,大大減輕了usb電路的設計負擔,只需設計usb介面電路,就可以實現基於stm32晶元的電路板的usb通訊設計。本文將具體講述基於stm32f103rbt6晶元的usb設計 本文為硬體篇。首先,我們來認識一下stm32f103rbt6晶元。其中usb相關引腳為pa1...
STM32 USB學習整理3
這個檔案主要和 vcp 驅動有直接關係!很多部分都是空的內容,其中包含了一些引數的設定,需要注意的是 波特率的大小與usb速度沒有關係,波特率的設定會影響串列埠速度 usb虛擬串列埠相關配置引數 line coding linecoding u8 usart printf buffer usb us...