1. 程式人生 > >STM32 USB學習筆記1

STM32 USB學習筆記1

主機環境:Windows 7 SP1

開發環境:MDK5.14

目標板:STM32F103C8T6

開發庫:STM32F1Cube庫和STM32_USB_Device_Library

之前在STM32論壇裡領取過一塊STM32開發板,本來以為是帶有USB模組介面的,最後發現NUCLEO裡是沒有把USB模組外接出來的,所以就自個兒掏錢買了一塊單板,如下圖所示:


單板很簡單,單純是為了學習一下STM32的USB模組,之所以選擇這個是因為它便宜,而且ST官方有提供USB模組庫方便開發。

USB開發博大精深,比之串列埠,SPI,I2C來說多了很多東西,一個很簡單的例子就是串列埠,SPI,I2C都可以使用通用IO口來模擬實現,但USB卻很少有人這麼做。學習USB模組就要學習USB協議,USB協議從1.1到2.0再到3.0,現在貌似到3.1版本了都,版本更替了這麼多但不影響我們學習,因為USB協議都是向後相容的,學習了一個就夠了。STM32F103C8T6的USB模組實現了USB2.0全速匯流排,符合USB2.0全速裝置的計數規範,支援8個雙向端點等。

USB匯流排使用兩根線實現差分傳輸D+、D-,這跟485匯流排類似。因此,在USB總線上同一時刻只能有一個方向上的傳輸。

有關USB2.0協議規範可以從USB官網上下載,重點看第9章節即可,600多頁的文件從頭看到尾是很枯燥的。當然如果有精力的話,整個規範都看完也是很有好處的。跟USB2.0規範相關的還有很多類規範,在開發時如果有需要再看就可以了。

一、USB器件庫概述

ST官網提供的USB文件有STM32Cube USB器件庫,以及USB培訓的一些文件,重點看USB器件庫文件就好了,因為我們是把STM32的USB模組當作從裝置,當然如果STM32支援USB主機的話還有另外一個主機庫(不在這裡討論)。通過檢視STM32Cube USB器件庫,可以幫助我們快速理解USB模組的架構,簡化應用開發。STM32CubeUSB裝置庫在Cube中所處位置如下:


USB裝置庫位於HAL驅動層之上,在開發中我們只需關注USB裝置庫即可,不必關注USB裝置的HAL驅動,不然USB裝置庫就沒有存在的意義了。而且USB裝置庫程式碼是隻讀的,不需要修改。

裝置庫中使用的主要結構體為裝置控制代碼,其型別為USBD_HandleTypeDef,我們不必刻意關注USB HAL驅動中USB所使用的資料結構,因為它們對於我們來說是隱藏的,只需關注裝置庫曝露給我們的介面即可,裝置庫是和USB2.0協議密切相關的,因此需要熟悉USB2.0文件有助於我們理解裝置庫的工作流程。

USB裝置庫目錄分為兩層:一層為Core(核心層);另一層為Class(類層),目錄結構如下:


結構比較清晰,核心層是不需要動的,類層是擴充套件用的。

USB裝置庫中核心層的usbd_conf檔案是需要使用者自己實現的,用來配置USB的屬性,其各個檔案的作用如下:


其中usbd_req改為了usbd_ioreq。由表7就可以看出USB2.0規範中第9章很重要。USB器件庫文件還詳細說明了一下控制端點0,這在USB開發中是一個重要的端點。其作為預設的控制端點用於接收主機發來的各種請求,請求作為Setup包傳送到裝置,請求又分為標準請求和非標準請求,標準請求在控制端點0上就可處理了,對於非標準請求通過回撥函式傳遞給特定類進行進一步處理。

USB裝置庫的類層中各個檔案作用如下:


其中的usbd_xxx_if_template檔案需要由使用者實現,目前跟USB裝置庫相關的檔案有兩個需要使用者去實現即usbd_conf檔案和usbd_xxx_if_template檔案。至此USB器件庫的概述說明就完畢了,更多詳細情況檢視USB器件庫文件即可。

二、USB協議概述

USB協議中用到的一些邏輯部件:

端點:資料傳輸的最終物件

管道:主機和裝置端點之間資料傳輸的模型

介面:用於描述特定的功能(有一組端點組成)

裝置:由一個或多個介面組成

USB傳輸分為了3層:Packet、Transaction、Transfer,三者是由小到大,關係如下圖:


一次Transfer傳輸分為幾個Transaction,一次Transaction由幾次Packer組成。

Packet包格式如下:


所有的USB傳輸都是由USB主機發起,這點跟I2C通訊有些類似。

USB的傳輸分為4類:控制傳輸、中斷傳輸、同步傳輸、批量傳輸,由此引申出4類端點型別:控制端點、中斷端點、同步端點、批量端點。


控制傳輸是雙向的,須有IN和OUT兩個方向上的端點號。其他型別的傳輸是單向的。各類傳輸差別不是很大,只是對時間的要求不同。

有關USB協議的大概情況就介紹到這,更多詳情請查閱USB2.0規範以及STM32F103的參考手冊。後面將通過VCP具體示例來分析USB開發。