1. 程式人生 > >STM32 之 USB IP(USB模組) 詳解

STM32 之 USB IP(USB模組) 詳解

模組分類

  在 STM32 眾多系列的 MCU 中,USB模組並不是相同的,官方稱呼為USB IP 不同。總的來說可以分文兩大類:USB IP、OTG IP。這兩種 IP又可以進行更進一步的細分,如下圖:
USB IP
上圖中羅列的晶片並不是很全面,某些新系列的晶片可能與上圖有出入。各IP的主要區別如下:

  • USB IP:
    • 僅可作為全速或低速的USB裝置;
    • 符合USB2.0中的全速規範
    • 可用資源:8個雙向可配置端點
    • 512位元組 的專用資料包緩衝儲存器SRAM
    • CRC(迴圈冗餘校驗)生成/校驗,反向不歸零(NRZI)編碼/解碼和位填充
    • 支援四種傳輸型別:對於bulk和同步傳輸,還支援double buffer模式;使得一個buffer用於USB硬體和PC
      交換資料的同時,另外一個buffer可被MCU使用
    • 支援USB裝置的掛起和喚醒操作(寫控制暫存器),從而停止裝置時鐘,以進入低功耗模式
      USB
      F102/103中的USB和CAN共享512位元組的專用SRAM來進行資料收發操作,因此兩個IP不能同時使用
  • USB+ IP: 是針對USB IP的擴充套件版本,同樣僅可作為全速或低速的USB裝置,但是ST針對這部分的USB模組進行了擴充套件,例如添加了USB低功耗管理等。除了以上USB IP特性外,還有如下:
    • 1024位元組 的專用資料包緩衝儲存器SRAM
    • 同步傳輸支援
    • USB 2.0 Link電源管理支援
    • 電池充電規範修訂版1.2支援
    • USB連線/斷開功能(USB_DP線上可控嵌入式上拉電阻)
      USB+
  • FS OTG IP:
    可作為全速和低速USB主機;可作為全速USB裝置
    USBFS
  • HS OTG IP: 可作為高速、全速和低速USB主機;可作為高速和全速USB裝置
    USB HS
    無論以上哪種 IP,其全部符合USB 2.0規範。

Packet buffer的使用

  Packet buffer存在於USB IPUSB+ IP中(在 OTG IP中稱為FIFO),其用法是一致的。每個雙向端點對應兩個packet buffer,分別用於傳送和接收。軟體通過packet buffer interface來訪問它們。
  這些packet buffer的位置和大小都可配置,由buffer描述表指定 ,Buffer描述表本身也在這塊memory裡,它自己的地址是由USB_BTABLE暫存器

指定的。Table裡每個entry由4個半字組成(分別表示雙向EP的接收packet和傳送packet的位置和大小) 因此該table的位置本身必須以8位元組對齊,即USB_BTABLE的低三位全部為0。
  USB外設硬體不會把本EP的資料溢位到與其相鄰的其他packet 如果收到的資料多於buffer的長度,則只把前length個數據放到該EP對應的Packet buffer中。
Packet buffer
在ST給出的驅動中,各端點的初始化情況如下:

  • 硬體傳送緩衝區
    • 在初始化時設定各個EP硬體傳送緩衝區的起始地址 @[email protected]硬體緩衝描述表
    • 在準備好要傳送的資料後,設定傳送長度@[email protected]硬體緩衝描述表
  • 硬體接收緩衝區
    • 在初始化時設定各個EP硬體接收緩衝區的起始地址 @[email protected]硬體緩衝描述表
    • 在初始化時設定各個EP硬體接收緩衝區的長度 @COUNTn_RX的高位@硬體緩衝描述表,以允許接收緩衝區的溢位檢測;一般都是接收EP的最大包長
    • 在收到資料併產生ISR中,從硬體接收快取讀取資料之前先要看收到了多少資料(實際收到的資料不一定填滿接收快取的)

FIFO的使用

  存在於 OTG IP中。使用相對來說要複雜不少。

驅動程式

  在實際使用中,發現USB驅動有許多bug,需要特殊注意!關於這部分請參考針對USB部分的獨立博文。無論是標準外設庫版還是HAL庫版,ST官方有針對各BUG的獨立說明文件,這個在做具體移植時需要特殊注意。

標準外設庫版(官方培訓文件稱為 Legacy library

  針對不同的晶片有不同的獨立版本驅動(主要是USB IP是有區別的)。目前有如下幾個:

STSW-STM32046: 主要是針對STM32F105/7, STM32F2 and STM32F4 USB on-the-go Host and device library,對應的說明文件為UM1021。下載地址為https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32046.html,該版本的驅動最新版本為2.2.0
  實現的裝置例程:AUDIO、DFU、HID、MSC、VCP、Dual Core(FS IP和HS IP同時工作,分別實現MSC和HID裝置)
  實現的主機例程:MSC、HID、Dual Core(FS IP和HS IP同時工作,分別實現MSC和HID主機功能)
  實現的雙角色例程:DRD(根據插入電纜的不同,分別作MSC主機和MSC裝置功能)
STSW-STM32121: 主要是針對STM32F10x, STM32L1xx and STM32F3xx USB full speed device library,對應的說明文件為UM0424。
下載地址為https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.html,該版本的驅動最新版本為4.0.1
  實現的例程(只能是Device):Audio_Speaker、DFU、MSC、Joystick、Custom_HID、VCP、MSC+HID 複合裝置
STSW-STM32092: 主要是針對STM32F0x2xx USB FS device library,對應的說明為UM1717。下載地址為https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32092.html,該版本驅動的最新版本為1.0.0這裡需要注意,該驅動是針對STM32F0x2xx的,但是可以非常方便的移植到STM32F0xx系列得MCU中。 需要根據具體晶片的時鐘,修改驅動的usb_conf.h和usb_bsp.c。關於具體的移植可參考網友的該文章USB庫STM32F0x2移植到STM32F070筆記
  實現的例程(只能是Device):Audio_Speaker、CCID、MSC、Custom_HID、HID、HID_LPM_test、DFU、Virtual_COM_Port、CDC+HID複合裝置、MSC+HID複合裝置

  該版本的驅動不但可以非常方便的與之前的標準外設庫一同使用,而且可以非常方便的與HAL庫一起使用。 博文STM32之標準外設版USB驅動+MSC(Host)+Fatfs移植就是使用的HAL外設庫+標準外設庫版的USB驅動的移植。使用標準外設庫版版USB庫的主要原因是,該版本的USB庫經過多年驗證,相對穩定!而在使用HAL版USB庫時,發現了許多BUG。
  以上這些驅動在ST官網一次次改版之後,已經非常難找到!我記得在之前都不需要登陸就可以下載,現在還必須登陸才可以下載!

HAL庫版(官方培訓文件稱為 Cube library

  從目前的情況來看,ST已經徹底放棄了之前用了很久的標準外設庫,全面轉投 STM32CubeTM。在驅動程式方面,標準外設庫也基本不再維護更新!
  STM32CubeTM系列的驅動相比較標準外設庫來說更將全面,同樣USB驅動也比標準外設庫更加全面。這部分驅動一般很少手動來移植處理,直接使用STM32CubeMX工具來處理。
  不同晶片的USB驅動均包含在針對各晶片的獨立Cube驅動包中。其中的USB驅動或多好少回有點區別,也可能沒有區別。具體可直接檢視Cube驅動包的驅動說明。總結一下:
CubeUSB
上圖由於比較早,其中部分晶片沒有列出。

配套工具

  ST為開發者提供了一些常用的工具,具體如下:

參考

  ST 的各種培訓資料

相關推薦

Hibernate入門命名策略naming strategy

前言 JPA和Hibernate都提供了預設對映策略,通過對映將每個實體類對映到具有相同名稱的資料庫表,它的每個屬性都對映到具有相同屬性的列, 但是,在實際專案開發中可能出現與預設命名約定不匹配,也就是說我們需要更改預設值,我們應該腫麼辦呢?此時我們就需要詳細瞭解Hibernate中的命名策略,本文略長,請耐

STM32 USB IPUSB模組

模組分類   在 STM32 眾多系列的 MCU 中,USB模組並不是相同的,官方稱呼為USB IP 不同。總的來說可以分文兩大類:USB IP、OTG IP。這兩種 IP又可以進行更進一步的細分,如下圖: 上圖中羅列的晶片並不是很全面,某些新系列的晶

《Python程式設計從入門到實踐》記錄測試程式碼unitttest模組

unittest模組提供了測試程式碼工具。 單元測試:用於核實函式的某個方面沒有問題 測試用例:一組單元測試,這些單元測試一起核實函式在各種情形下的行為都符合要求。 函式編寫測試用例時,要匯入模組unittest和要測試的函式,再建立一個繼承unittest.TestCase的類,並

Python日誌處理logging模組

本節內容 日誌相關概念 logging模組簡介 使用logging提供的模組級別的函式記錄日誌 logging模組日誌流處理流程 使用logging四大元件記錄日誌 配置logging的幾種方式 向日志輸出中新增上下文資訊 參考文件 一、日誌相關概念 日誌是

視訊、圖形影象處理Opencv技術記錄、Opencv教程影象處理imgproc模組平滑影象

目標 在本教程中,您將學習如何使用OpenCV函式應用各種線性濾鏡來平滑影象,例如: 理論 注意 下面的解釋屬於Richard Szeliski和LearningOpenCV的計算機視覺:演算法和應用一書 平滑,也稱為模糊,是一種簡單且經常使用的影象處理操作。

Android 學習《第一行程式碼》第二版 筆記十一廣播機制

一、廣播機制簡介 1. 四大元件之一 2. Android 提供了一套完整的API,允許應用程式自由地傳送和接收廣播。 A. 傳送廣播藉助Intent B. 接收廣播藉助廣播接收器(Broadcast Receiver) 3. 廣播型別: A. 標準廣播: 完全非同步執行

Android 學習《第一行程式碼》第二版 筆記十二廣播機制

廣播的最佳實踐——實現強制下線功能 思路:在介面上彈出一個對話方塊,讓使用者無法進行任何操作,必須點選對話方塊中的確定按鈕,然後回到登入介面即可。 一、效果圖 1. 登入介面並輸入賬號密碼 2. 登陸後的介面 3. 強制下線 4. 退回登陸的介面

Java併發十八:阻塞佇列BlockingQueue BlockingQueue阻塞佇列)詳解 二叉堆(一) 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

OpenLayers 3 地圖圖層資料來源ol.source

source 是 Layer 的重要組成部分,表示圖層的來源,也就是服務地址。除了在建構函式中制定外,可以使用 layer.setSource(source) 稍後指定。 一、包含的型別 ol.source.BingMaps ,必應地圖的切片資料,繼承

OpenLayers 地圖圖層資料來源ol.source,ps圖層混合模式

source 是 Layer 的重要組成部分,表示圖層的來源,也就是服務地址。除了在建構函式中制定外,可以使用 layer.setSource(source) 稍後指定。 一、包含的型別 上面介紹的都是可以例項化的類,還有一部分基類,不能被例項化,只負責被繼承,有:

C++函式物件/偽函式Function Object

       除了自定義的函式物件,標準庫還為我們提供了一系列現成的函式物件, 比如常見的數學、邏輯運算等。例如:negate<type>(),plus<type>(),minus<type>(),multiplies<type&g

生產者和消費者BlockingQueue阻塞佇列

注意:該隨筆內容完全引自http://wsmajunfeng.iteye.com/blog/1629354,寫的很好,非常感謝,複製過來算是個積累,怕以後找不到。 一. 前言   在新增的Concurrent包中,BlockingQueue很好的解決了多執行緒中,如何

VMware虛擬機文件後綴

blank mdk 記錄 tom 而不是 我們 sun 編輯 right VMware虛擬機文件(後綴)詳解 虛擬機的文件管理由VMware Workstation來執行,一個虛擬機一般以一系列文件的形式儲存在宿主機中,這些文件一般在由workstation為虛

#26 Linux kernel內核與uname、lsmod、modinfo、depmod、insmod、rmmod、modprobe...命令用法

linux kernel(內核)詳解與uname、lsmod、modinfo、depmod、insmod、rmmod、modprobe...命令用法Linux kernel: 內核設計流派: 單內核設計,但是充分借鑒了微內核體系設計的優點,為內核引入了模塊化機制,內核高度模塊化; 內核被模塊化之

C++11Mutex互斥鎖

AR c++ 條件 oid 簡單 但是 資源 void AD 多個線程訪問同一資源時,為了保證數據的一致性,最簡單的方式就是使用 mutex(互斥鎖)。 (1).直接操作 mutex,即直接調用 mutex 的 lock / unlock 函數。此例順帶使用了 boost:

java 內部類inner class

ron isp https nerd 對象 重寫 prot print 元素 優點 ⒈ 內部類對象可以訪問創建它的對象的實現,包括私有數據; ⒉ 內部類不為同一包的其他類所見,具有很好的封裝性; ⒊ 使用內部類可以很方便的編寫事件驅動程序; ⒋ 匿名內部類可以方便的定義運行

調用高德地圖API熱力圖

ocs use map asc type contain maps key script 具體腳本語言如下: <!doctype html> <html> <head> <meta charset="utf-8">

蘋果個人公司型別開發者賬號申請99美元

談到蘋果開發者賬號,我們需要區分一下個人賬號、公司賬號和企業賬號這三種,還有一種是教育賬號,這個就不多說了。     個人賬號:個人申請用於開發蘋果app所使用的賬號,僅限於個人使用,申請比較容易,$99。     公司賬號:以公司的名義申請的開發者賬

【轉載】BlockingQueue阻塞佇列

注意:該隨筆內容完全引自http://wsmajunfeng.iteye.com/blog/1629354,寫的很好,非常感謝,複製過來算是個積累,怕以後找不到。 一. 前言   在新增的Concurrent包中,BlockingQueue很好的解決了多執行緒中,如何高效安全“傳輸”資

Android VCard聯絡人備份恢復匯入/匯出

原文地址為: Android VCard聯絡人備份恢復(匯入/匯出)詳解 首先我們簡單的看下在Android中聯絡人的儲存結構. 工作環境:android 2.3.3聯絡人的主要資料存放在raw_contacts和data表裡,它兩構成主從表關係。 raw_contacts表結構