前言
為啥是TinyUSB?給強大的RT配個輕巧的USB棧!
USB這個讓我們方便快捷的接口,幾乎無處不在。在嵌入式世界里,尤其是用上了像NXP i.MX RT這樣性能強勁的跨界MCU,我們自然希望它能輕松駕馭USB通信。官方所提供的示例只涵蓋了USB基礎(chǔ)類,對于諸如ECM、NCM等特定類的開發(fā)而言,若要從頭開始構(gòu)建,有可能會拖延客戶項目的推進。
這時候,TinyUSB閃亮登場!
想象一下,一個開源(MIT 協(xié)議)、輕量級、跨平臺、示例友好的USB協(xié)議棧,是不是有點小激動?
選擇TinyUSB的幾大優(yōu)勢:
-
輕巧高效:資源占用小,對內(nèi)存和 Flash 都很友好。對于性能本就充裕的RT系列,更是能跑得飛起
-
功能全面:支持常見的設(shè)備類(CDC, MSC, HID, MIDI, Vendor等)和主機功能,甚至復雜的復合設(shè)備也不在話下。你想讓你的RT板子變成U盤、虛擬串口、鍵盤鼠標?TinyUSB都能幫你搞定
-
易于移植:清晰的架構(gòu)設(shè)計和OSAL,無論是裸機還是RTOS環(huán)境,移植起來都相對順暢
-
社區(qū)活躍 & 開源免費:MIT協(xié)議方便客戶使用。同時提供了大量的例程,即使是初學者也可以通過這個項目入門USB開發(fā)
一、準備事項:裝備檢查
動手之前,確保你的“武器庫”齊全:
-
硬件平臺:一塊NXPi.MX RT開發(fā)板,本文以RT1060-EVK為例,和能把它“安排”明白的調(diào)試器(JLink或LinkServer都行)。
-
軟件工具:
-
MCUXpresso IDE: NXP 的官方 IDE,我們的主戰(zhàn)場(版本越新越好)
-
Git: 版本控制神器,管理代碼和子模塊的必備佳品
-
Make: 構(gòu)建工具,跑 TinyUSB 自帶腳本會用到
-
Python: 同樣是跑腳本用
開辟工作目錄并獲取TinyUSB源碼。創(chuàng)建項目文件夾,然后用 Git 初始化,拉取TinyUSB庫。
|
mkdir //TinyUSB_Porting
|
把TinyUSB官方倉庫加進來,用子模塊的方式,既能保持項目整潔,又能方便地到最新版。
|
git submodule add https://github.com/hathach/tinyusb.git tinyusb
|
二、小試牛刀:命令行下的“熱身運動”
在直接跳進IDE的“大坑”之前,咱們先在命令行下跑個官方示例,確保TinyUSB和 NXP的底層驅(qū)動能跑通,能避免很多不必要的麻煩。
步驟1: 選個入門示例開動
TinyUSB 的examples/device 目錄下有很多好玩的示例。我們就選 cdc_msc 這個經(jīng)典的“二合一”設(shè)備(虛擬串口 + U盤)開刀。
|
cd tinyusb/examples/device/cdc_msc
|
步驟2:TinyUSB獲取NXP的依賴項
TinyUSB支持很多芯片和開發(fā)板,對于NXP RT,它提供了腳本來自動下載 MCUXpresso SDK的相關(guān)驅(qū)動。
|
# 告訴 Make 我們用的是 RT1060EVK 板子
|
??!友情提示:NXP 的 Kinetis、LPC、MCX等系列需要用不同的參數(shù)去拉取各自的依賴包,別搞混了,對于同一個系列的MCU,只需要拉取一次就可以了。
步驟3: 編譯!看看會不會“炸”
是時候檢驗成果了。用Make命令編譯這個示例:
|
# 參數(shù)解釋:
|

步驟4: 下載!是騾子是馬拉出來遛遛
把編譯好的固件燒錄到你的RT板子上,插上USB線(連接到板子的 USB Device 端口)。如果你的電腦成功識別出一個U盤,那就穩(wěn)了!這證明TinyUSB和NXP底層驅(qū)動這對“CP”在你這塊板子上是能正常工作的。
三、主戰(zhàn)場:MCUXpresso IDE集成
熱身完畢,該進入主戰(zhàn)場——MCUXpresso IDE了。我們要把TinyUSB“塞”進一個標準的IDE工程里。
步驟1: 建立“根據(jù)地” (創(chuàng)建基礎(chǔ)工程)
在 IDE 里,為你的 RT MCU創(chuàng)建一個新的工程。你可以從 hello_world 這種簡單的 SDK 示例開始,或者干脆創(chuàng)建一個只包含必要驅(qū)動的空工程。確保這個基礎(chǔ)工程能獨立編譯、下載、運行。
步驟2: 給 TinyUSB 安個“家” (添加源碼文件夾)
為了不讓項目結(jié)構(gòu)亂成一鍋粥,我們在 IDE 里給 TinyUSB 單獨創(chuàng)建一個“家”(源文件夾)。
1.右鍵項目-> New -> Source Folder。
2.取個名字,比如tinyusb。
步驟3: 搬運 TinyUSB 的“家當” (復制核心文件)
把之前 Git 下載的 tinyusb/src目錄下的核心文件復制到剛創(chuàng)建的 tinyusb 文件夾里。注意只選擇需要的device端代碼即可。主要包括:
-
src/common: 通用工具函數(shù)
-
src/device: USB 設(shè)備協(xié)議棧核心代碼
-
src/class: 你需要用到的 USB 功能類驅(qū)動(比如cdc, msc)
-
src/osal: 操作系統(tǒng)抽象層
-
src/portable/nxp/chipidea/ci_hs和nxp/ehci: NXP RT 芯片上USB 控制器的底層驅(qū)動
-
src/tusb.c, src/tusb.h:TinyUSB 的主入口和核心頭文件
-
src/tusb_option.h: 默認編譯選項

步驟4: 把“說明書”和“應(yīng)用代碼”也拿過來 (復制配置和示例文件)
cdc_msc 示例能跑起來,還需要幾個關(guān)鍵的配置文件和應(yīng)用層代碼。把它們從 examples/device/cdc_msc/src/ 復制到 IDE 項目的主源碼目錄(通常叫source 或src):
-
main.c: 示例的主函數(shù)(替換掉hello_world.c)
-
msc_disk.c / .h: U盤功能的底層存儲接口(你需要實現(xiàn)它來讀寫你的存儲器)
-
tusb_config.h: TinyUSB的配置文件。所有功能的開關(guān)、參數(shù)都在這里調(diào)
- usb_descriptors.c / .h:USB設(shè)備的“身份證”——各種描述符。電腦就是靠這些信息來認識設(shè)備
示例代碼會調(diào)用TinyUSB重寫的板級初始化函數(shù)。檢查下 examples/device/cdc_msc/src/ 和 hw/bsp 目錄下類似 board_api.h family.c 這樣的文件,有的話也一并復制到你項目的board 或bsp目錄。
步驟6: 給編譯器“指路” (配置 IncludePaths)
現(xiàn)在文件都搬過來了,但編譯器還不知道去哪找頭文件。我們需要在 IDE 里配置包含路徑:
-
右鍵項目-> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCUC Compiler -> Includes
-
點擊"Add...",把下面這些路徑加進去(根據(jù)實際項目結(jié)構(gòu)可能需要微調(diào))

TinyUSB 用宏定義來識別目標平臺和開關(guān)功能。我們需要告訴它現(xiàn)在是在為誰工作:
-
右鍵項目-> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCUC Compiler -> Preprocessor。
-
點擊"Add...",添加以下宏定義:
-
CFG_TUSB_MCU=OPT_MCU_MIMXRT1XXX: 關(guān)鍵!這就是告訴 TinyUSB:“現(xiàn)在需要跑在 NXP RT 芯片上!”
- 按需添加其他調(diào)試宏,比如 CFG_TUSB_DEBUG=2

步驟8: 配置“硬件接口” (Pin Mux 和 Clock)
別忘了硬件!它們負責開發(fā)板上的各種PINMUX,直接使用TinyUSB中:tinyusbhwspimxrtoardsmimxrt1060_evk下提供的配置替換即可!

集成路上總會有些小坎坷:
-
SDK 組件缺失: 從hello_world工程開始移植TinyUSB可能會缺少相關(guān)組件,比如OCOTP,可以通過MCUXpressoIDE中的管理工具很方便的添加它們。
-
family.c和board_api.h的“戲份”: 這些文件通常負責板級的初始化(比如 board_init())。確保它們已經(jīng)正確移植好!
4. TinyUSB配置文件和Class文件
-
tusb_config.h (協(xié)議棧的“控制面板”):
-
這個文件用于TinyUSB的基礎(chǔ)配置。雖然有些配置(如MCU類型 CFG_TUSB_MCU)可能通過編譯器 -D參數(shù)傳入,但大部分基礎(chǔ)和類相關(guān)的配置都在這里完成。
-
usb_descriptors.c / .h (設(shè)備的“身份證”和“說明書”):
-
這里定義了所有USB 描述符:設(shè)備描述符、配置描述符、接口描述符、端點描述符、字符串描述符等等。
-
class文件夾:參考cdc/msc,其他類型的示例移植方法也是類似的。
五、勝利收官:總結(jié)展望
恭喜!如果你一路跟著走到這里,并且成功讓你的NXP RT開發(fā)板在電腦上被識別為一個 USB disk 設(shè)備,那么你已經(jīng)掌握了在MCUXpresso IDE環(huán)境下移植TinyUSB 的核心技巧。


現(xiàn)在,RTMCU已經(jīng)插上了TinyUSB的“翅膀”,可以更自由地翱翔在USB的世界里了。以此為起點,我們可以探索TinyUSB 支持的其他USB Class (HID, MIDI, 網(wǎng)卡等)、將TinyUSB集成到你的實際項目中,實現(xiàn)更復雜的USB功能或者host端協(xié)議棧!這些就留給感興趣的小伙伴來嘗試了!
[參考鏈接]:
-
https://github.com/hathach?/tinyusb
-
https://docs.tinyusb.org/en/stable/r?eference/getting_started.html
恩智浦MCU加油站
恩智浦半導體NXP Semiconductors N.V.(納斯達克股票代碼:NXPI)是汽車、工業(yè)物聯(lián)網(wǎng)、移動設(shè)備和通信基礎(chǔ)設(shè)施市場值得信賴的合作伙伴,致力于提供創(chuàng)新解決方案。
-
mcu
+關(guān)注
關(guān)注
147文章
18917瀏覽量
397863 -
usb
+關(guān)注
關(guān)注
60文章
8438瀏覽量
284391 -
恩智浦
+關(guān)注
關(guān)注
14文章
6095瀏覽量
146973 -
i.mxrt1060
+關(guān)注
關(guān)注
1文章
3瀏覽量
3173
原文標題:RT1060移植TinyUSB:快速擴展大量USB Class示例
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
探索NXP EdgeReady智能HMI解決方案:i.MX RT117H的無限可能
基于i.MX RT106V跨界MCU的智能語音UI邊緣就緒解決方案
探索NXP i.MX 93應(yīng)用處理器家族:高效邊緣計算的理想之選
探索i.MX RT1180:高性能處理器的技術(shù)剖析與應(yīng)用指南
FRDM i.MX 9平臺選型指南:FRDM i.MX 9系列開發(fā)平臺解析
i.MX RT1180實現(xiàn)EtherCAT+伺服控制的終極實踐
簡單認識NXP FRDM i.MX 93開發(fā)板
恩智浦i.MX RT1180跨界MCU助力下一代伺服控制系統(tǒng)
米爾NXP i.MX 91核心板發(fā)布,助力新一代入門級Linux應(yīng)用開發(fā)
NXP i.MX 91開發(fā)板#支持快速創(chuàng)建基于Linux?的邊緣器件
《電子發(fā)燒友電子設(shè)計周報》聚焦硬科技領(lǐng)域核心價值 第11期:2025.05.12--2025.05.16
使用RT1060的mcuboot開源sdk示例擦除主插槽中的錯誤鏡像怎么解決?
NXP i.MX 93 開發(fā)板#提供高效的機器學習 支持高能效的邊緣計算
NXP i.MX RT1060移植TinyUSB:快速擴展大量USB Class示例

評論