資料介紹
描述
使用 Nucelo32 的 HID USB 設(shè)備 - 第 1 部分
由于 STM 引入了用于代碼生成的 CubeMX,我尋找了一個有趣的應(yīng)用程序來使用這個工具并檢查它的易用性。選擇是制作一個 HID 設(shè)備,特別是具有 X/Y 模擬輸入和一些按鈕的操縱桿或游戲手柄,在 Window10 下支持。
第 1 部分:使用模擬點(diǎn)擊設(shè)置 USB 設(shè)備
使用 Cube 項(xiàng)目“USBTest4_joystick”
Nucleo32對于硬件,我們使用 STM43L432KC Nucleo-32 板,但您可以使用任何其他支持備用 USB 接口的 nucleo(32/64/144) 板,但我喜歡小巧的外形和 Arduino 接頭樣式。它配備了一個大型 32 位微控制器,在本例中為 Cortex-M4 - QFN32 封裝中的低功耗
該板預(yù)定義了一個調(diào)試芯片 - ST-Link -,它使用頂部的 mico-usb 通過虛擬 com 端口和/或大容量存儲接口進(jìn)行通信。這個 ST-Link 是您的程序和調(diào)試接口(和電源),并且使用 UArt2 RX/TX 進(jìn)行接口,(這不是我們將使用的 USB ?。。﹤溆?USB 設(shè)備被移植到 PA_12(D2 ) 和板上的 PA_11 (D10)。為了準(zhǔn)備,您可以使用舊的 USB 電纜,切斷外圍連接器(迷你或微型 USB)并剝?nèi)ル娋€。:
紅色 = 5V,黑色 = GND,綠色 =D+,白色 =D-。這個不錯的部分是您可以將 USB 直接連接到核板,不需要接口,如果您愿意,除了一些保護(hù)(即鉗位二極管,或者在我的情況下,5V 電源線上的二極管以避免核電源在連接錯誤)。現(xiàn)在您已準(zhǔn)備好設(shè)置工具。
立方體MX
CubeMX 是一款免費(fèi)工具,支持使用基本驅(qū)動程序或 Bsp(板級支持包)輕松設(shè)置 STM32 設(shè)備,以用于新的開發(fā)項(xiàng)目。它會生成一組標(biāo)準(zhǔn)的庫和驅(qū)動程序,因此您可以快速準(zhǔn)備好構(gòu)建自己的應(yīng)用程序。CubeMX 可在此處下載,CubeIDE在此處,安裝在您的系統(tǒng)上并啟動 CubeMX。
現(xiàn)在選擇新項(xiàng)目,并使用板選擇器工具找到您的核板。生成默認(rèn)值,您最終將得到所選設(shè)備的引腳。
當(dāng)您選擇板時,布局已經(jīng)預(yù)先定義,板上的 IO 布線,如 OSC、UArt2 RX/TX 和 PB3 上的綠色 LED。在左側(cè),您可以選擇每個功能塊的芯片布局詳細(xì)信息。要添加 USB,請選擇connecivity ,選擇USB并選擇FS device ,現(xiàn)在已經(jīng)配備了引腳 PA11 和 PA12。對于中間件(驅(qū)動程序),選擇中間件部分,USB_Device并選擇人機(jī)接口設(shè)備(HID)的下拉框(不要使用自定義的)USB需要48Mhz時鐘,所以在頂部選擇時鐘配置,您可以使用自動時鐘解析器將USB 時鐘設(shè)置為 48Mhz。您幾乎可以編寫應(yīng)用程序了!
立方IDE
還有一些準(zhǔn)備工作的步驟:選擇Project Manager選項(xiàng)卡,為項(xiàng)目命名,使用Basic Application Structure(對于 main.c 結(jié)構(gòu)),然后在 Toolchain 部分選擇CubeIDE 。保存您的項(xiàng)目....然后按右上角的生成代碼!準(zhǔn)備好后,您可以打開項(xiàng)目,CubeIDE 將啟動:
我不打算解釋 CubeIDE 接口,假設(shè)您以前使用過像 Gnu 或 Keil 這樣的 IDE。這是 CubeMX 所做的好事:
- 它生成了您的完整項(xiàng)目,包括驅(qū)動程序、庫和一個 main() 函數(shù),其中設(shè)置了初始化并且您可以編寫程序代碼,它編譯無錯誤哇!
- 有一些缺點(diǎn):它只生成一種 USB HID:鼠標(biāo),因此您可以在 Middelwares>...> Class>HID>Inc 和 >Src 中更改 USB 描述符。
- 有一個主要缺點(diǎn):一旦您重新運(yùn)行 CubeMX 生成器,即在您添加了一些 GPIO 或 DMA 之后,它會覆蓋您的 Middelware 更改......所以請進(jìn)行備份!
- 一般來說,我的印象是它覆蓋了除 main() 之外的所有代碼,在 "/* USER CODE BEGIN.... */" 和 /* USER CODE END... */." 部分的注釋之間。BE知道的 ?。?!
USB 描述符
這本身就是一個故事。請讓自己了解 USB 是如何工作的,以及描述符是如何工作的。有趣的鏈接是:
那么要改變什么呢?- 檢查這篇文章中的 CubeMX 項(xiàng)目文件,打開帶有項(xiàng)目的 CubeIDE:USBTest4_joystick 。此示例構(gòu)建 USB 接口并生成“假”XY 運(yùn)動和按鈕按下作為示例。
中間件部分:Class>HID>SRC>usbd_hid.c - 在這里我們必須更改描述符。首先適配“ USB HID device Configuration Descriptor ”:,這有3個部分:FS/HS和OtherSpeed,都是一樣的設(shè)置。將接口子類更改為無啟動 (0x00) 并將接口協(xié)議更改為 0x04 = 操縱桿。對所有 3 個部分執(zhí)行此操作(!)
0x00, /* bInterfaceSubClass : 1=BOOT, 0=no boot */
0x04, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse 4=joystick */
其次,我們必須更改 HID 設(shè)備描述符。這描述了我們發(fā)送給 USB 主機(jī)的報(bào)告,以告知我們的設(shè)備正在吐出哪些數(shù)據(jù):find static uint8_t HID_MOUSE_ReportDesc (我們保持相同的鼠標(biāo)命名,但如果您愿意,可以在整個文件中更改它)。數(shù)組內(nèi)容將是:
0x05, 0x01, // Usage Page ( Generic Desktop controls)
0x09, 0x04, // Usage (Joystick)
0xA1, 0x01, // Collection (Application)
0xA1, 0x02, // Collection (Logical)
0x05, 0x01, // Usage Page (Generic Ctrls)
0x09, 0x30, // Usage X
0x09, 0x31, // Usage Y
0x15, 0x81, // Logical Minimum (-127)
0x25, 0x7F, // Logical Maximum (127)
0x75, 0x08, // Report Size (8) -> 8 bits (1 byte value)
0x95, 0x02, // Report Count (2) -> 2x = 2 bytes -> no bit stuffing
0x81, 0x02, // Input (Data,Var,Abs,...)
0x05, 0x09, // Usage Page (Button)
0x09, 0x01, // Usage Button1
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1) -> 1 bit
0x95, 0x01, // Report Count (1) -> 1 value : need to stuff 7 more bits
0x81, 0x02, // Input (Data,Var,Abs...)
0x75, 0x07, // Report Size (7) -> 7 bit
0x95, 0x01, // Report Count (1) -> 1 value 7 bits for byte alignment
0x81, 0x03, // Input (Const,Var,Abs,,,,,)
0xC0, // end collection Logical
0xC0, // End Collection => 46 bytes
// Report 2 bytes signed for XY and 1byte unsigned for button info bit-0
現(xiàn)在更改包含文件以將 Class>HID>SRC>usbd_hid.h 中此數(shù)組的大小更改為 46:
#define HID_EPIN_ADDR 0x81U
#define HID_EPIN_SIZE 0x04U // kept the same
#define USB_HID_CONFIG_DESC_SIZ 34U
#define USB_HID_DESC_SIZ 9U
#define HID_MOUSE_REPORT_DESC_SIZE 46U // CHANGED
現(xiàn)在,對這兩個文件進(jìn)行備份,因?yàn)楫?dāng)您運(yùn)行另一個代碼生成器時,cubeMX 會覆蓋這些文件!這就是我們所做的全部更改,USB 部分將使用 STM USB-ID,并且設(shè)備將被識別為 STM 產(chǎn)品。對于測試,這很好,對于您自己的產(chǎn)品,您應(yīng)該通過 USB.ORG 獲取您自己的 ID。
Src > Main() :首先將 Hid 包含文件添加到用戶包含部分:
/* USER CODE BEGIN Includes */
#include
#include "usbd_hid.h"
/* USER CODE END Includes */
其次,我必須顯式聲明 USB 句柄,否則編譯器會出錯(可能是我的路徑有問題?):
/* USER CODE BEGIN PV */
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END PV */
現(xiàn)在設(shè)置一個符合 usbd_hid.c 中報(bào)告描述符的結(jié)構(gòu)和變量:
// HID Game
struct gameHID_t {
int8_t JoyX; // X 1 byte, signed value
int8_t JoyY; // Y 1 byte, signed value
uint8_t JoyB1; // Button, one byte, button is bit #0
};
struct gameHID_t gameHID;
gameHID.JoyX = 0;
gameHID.JoyY = 0;
gameHID.JoyB1 = 0;
int8_t counter1=0; // counter for makingthe fake values wrapping around
最后但同樣重要的是,在主 while 循環(huán)中設(shè)置和發(fā)送報(bào)告值:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// Send HID report
counter1=(counter1+1)%32-127; // faking X,Y and button values
gameHID.JoyX = counter1*2;
gameHID.JoyY = counter1*4;
gameHID.JoyB1 = ~gameHID.JoyB1; //
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t*) &gameHID, sizeof(struct gameHID_t));
HAL_Delay(100);
}
/* USER CODE END 3 */
編譯項(xiàng)目,并啟動代碼(使用調(diào)試器或使用 Bin 文件轉(zhuǎn)儲到 PC 上 nucleo 的大容量存儲驅(qū)動器。如果您需要使用 nucleo 板在 CubeIDE 中設(shè)置調(diào)試器的幫助,這是有趣的閱讀:
- nucleo32 入門
- 生成二進(jìn)制文件:查看項(xiàng)目的Postbuild 設(shè)置- 鏈接
視窗 USB
運(yùn)行后,將 USB 插入系統(tǒng),它應(yīng)該可以識別 USB 設(shè)備。在 Windows> ControlPanel > Devices & Printers 下,會彈出一個新設(shè)備作為 GameController STM32 !
左鍵單擊新設(shè)備,然后選擇設(shè)置,雙擊 STM 控制器打開測試窗口。- 如果您的設(shè)備根本不顯示,請檢查您的 USB HID 代碼。- 如果您的設(shè)備顯示,但有感嘆,點(diǎn)擊設(shè)備,windows給你一個故障描述,主要是描述符有問題(錯誤代碼,或者數(shù)組大小不匹配)-如果你的設(shè)備顯示正常,但測試結(jié)果不存在(沒有移動或按鈕閃爍),報(bào)告發(fā)送有問題,請檢查 main() 中的報(bào)告數(shù)據(jù)和結(jié)構(gòu)。
要進(jìn)行更多調(diào)試,您可以使用由 CubeMX 實(shí)例化的 ST-Link 調(diào)試 Uart(在本例中為 uart2)并使用虛擬 com-port 通過 HAL_UART_Transmit( ) 函數(shù)發(fā)送/接收文本,請參閱此閱讀鏈接。(它在 115200baud, 8, n, 1 上啟動)
第 2 部分:使用真正的按鈕和滑塊構(gòu)建 HID 設(shè)備
工作正在進(jìn)行中....
- 電源設(shè)計(jì)方法-第1部分
- 用于Nucleo32和CubeMX第2部分的USB HID
- 電氣過應(yīng)力簡介-第1部分
- 了解你的電池組:第1部分
- 保護(hù)汽車USB電路防電池短路故障——第1部分
- 如何進(jìn)行電源設(shè)計(jì) - 第1部分
- LDO基礎(chǔ)知識:噪聲 - 第1部分
- 集成智能第1部分:EMI管理
- 照明電器團(tuán)標(biāo)《多功能路燈技術(shù)規(guī)范 第1-8部分 》
- STM32CubeMX學(xué)習(xí)(一) USB HID 雙向通信
- 用電信息采集系統(tǒng)型式規(guī)范第1部分 1次下載
- 用電信息采集系統(tǒng)技術(shù)規(guī)范第1部分 3次下載
- 用電信息采集系統(tǒng)檢驗(yàn)規(guī)范第1部分 2次下載
- NUCLEO32開發(fā)板的電路原理圖免費(fèi)下載 32次下載
- 電壓基準(zhǔn)如何影響ADC性能,第2部分 10次下載
- 雙極踏腳車(第二部分):微步和衰減模式 656次閱讀
- ADC數(shù)字下變頻器:抽取濾波器和ADC混疊,第2部分 2051次閱讀
- ADI公司設(shè)計(jì)工具:ADIsimRF第1部分 1832次閱讀
- ADC眼中的虛擬評估,第2部分 822次閱讀
- 邊緣智能第1部分:邊緣節(jié)點(diǎn) 1251次閱讀
- 實(shí)時控制技術(shù)滿足實(shí)時工業(yè)通信發(fā)展的需求 —— 第2部分 1074次閱讀
- 沁恒股份串口轉(zhuǎn)HID鍵盤鼠標(biāo)芯片 CH9329概述 5448次閱讀
- JESD204C入門第2部分:新特性及其內(nèi)容 6517次閱讀
- DC/DC轉(zhuǎn)換器傳導(dǎo)EMI - 第2部分,噪聲傳播和濾波 3338次閱讀
- 電壓檢測器、監(jiān)控器和高級監(jiān)控各種功能介紹:第1部分 5094次閱讀
- 關(guān)于如何「訓(xùn)練」神經(jīng)網(wǎng)絡(luò)的一部分經(jīng)驗(yàn)與見解 7633次閱讀
- 優(yōu)化您的汽車USB防電池短路設(shè)計(jì)——第2部分 1370次閱讀
- 防止汽車USB電路電池短路故障——第1部分 3289次閱讀
- 無源元件并非真的“無源”:第1部分——電容 2519次閱讀
- 混合信號系統(tǒng)接地揭秘之第二部分 1712次閱讀
下載排行
本周
- 1AN158 GD32VW553 Wi-Fi開發(fā)指南
- 1.51MB | 2次下載 | 免費(fèi)
- 2嵌入式軟件開發(fā)符合ISO 26262 功能安全標(biāo)準(zhǔn)
- 1.61 MB | 1次下載 | 免費(fèi)
- 3AN148 GD32VW553射頻硬件開發(fā)指南
- 2.07MB | 1次下載 | 免費(fèi)
- 4PZT驅(qū)動開關(guān)電路
- 0.09 MB | 1次下載 | 免費(fèi)
- 5模擬電路仿真實(shí)現(xiàn)
- 2.94MB | 1次下載 | 免費(fèi)
- 6PCB繪制基礎(chǔ)知識
- 2.44MB | 1次下載 | 免費(fèi)
- 7電子線路板及仿真實(shí)現(xiàn)
- 1.54MB | 1次下載 | 免費(fèi)
- 8T028M規(guī)格書 2.8寸TFT液晶屏 高清智能串口彩屏LCD顯示屏 IPS全視角豎屏顯示
- 480.15 KB | 次下載 | 免費(fèi)
本月
- 1ADI高性能電源管理解決方案
- 2.43 MB | 452次下載 | 免費(fèi)
- 2免費(fèi)開源CC3D飛控資料(電路圖&PCB源文件、BOM、
- 5.67 MB | 139次下載 | 1 積分
- 3基于STM32單片機(jī)智能手環(huán)心率計(jì)步器體溫顯示設(shè)計(jì)
- 0.10 MB | 132次下載 | 免費(fèi)
- 4美的電磁爐維修手冊大全
- 1.56 MB | 24次下載 | 5 積分
- 5如何正確測試電源的紋波
- 0.36 MB | 19次下載 | 免費(fèi)
- 6感應(yīng)筆電路圖
- 0.06 MB | 10次下載 | 免費(fèi)
- 7LZC3106G高性能諧振控制器中文手冊
- 1.29 MB | 9次下載 | 1 積分
- 8萬用表UT58A原理圖
- 0.09 MB | 9次下載 | 5 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935121次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233088次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191367次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73810次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論
查看更多