關鍵字:USBx, Device, HID,standalone
1.設計目的
目前 USBx Device standalone 的官方示例較少,不過使用 STM32CubeMX 可以快速地生成 USBx Device 相關類的示例工程,會很方便大家的開發。這里以 NUCLEO-H563 為例,實現 USBx Device HID Standalone 類,大家可以以此為參考移植到其他的 USBx Device 類。
2.示例移植
參考官方示例代碼:……\STM32Cube_FW_H5_V1.3.0\Projects\NUCLEO-H563ZI\Applications\USBX\Ux_Device_HID_Standalone
2.1.生成 STM32CubeMX 工程
新建 STM32CubeMX 工程 :STM32H563ZIT6U,選擇“without TrustZone activated”.
另外,STM32CubeMX 中未作說明的配置保持默認.
2.1.1 System Core 相關配置
在 System Core 框架下,Cortex_M33 標簽頁面下默認使用的是 HCLK. 如下圖:
RCC 的標簽頁下面:采用“BYPASS Clock Source ” MCO 引腳輸出作為 MCU 的系統時鐘源,如下圖:
在 ICACHE 的標簽頁面下的配置如下圖:
另外,SYS 標簽頁面下的“Timebase Source”設為 “Systick ”
2.1.2 Connectivity 的相關配置
根據 NUCLEO-H563 的硬件原理圖定義,這里選擇 USART3 打印輸出相關的 USB 操作信息。
不用開中斷或者 DMA,波特率默認 115200.
注意 USART3 使用的端口引腳是 PD8 與 PD9,與默認 STM32CubeMX 配置引腳不一樣。
在 USB 下面的配置如下:中斷優先等級設置為 6(在 NVIC 界面下修改);
2.1.3 Middleware 的相關配置
在 USBx 下面, 由于是 standalone 的示例,所以這里不用選擇操作系統的中間件。
? USBX 的具體配置如下圖,可以看出主要檢查或修改了默認的如下框出來的幾處地方。
? UXDevice memory pool size 由默認的 1024 設置為 4K(4*1024Bytes) 。
? UX_SLAVE_REQUEST_DATA_MAX_LENGTH 由默認的 2048 設置為 64 。
? 由于當前例程并非復合設備,所以 USBD_COMPOSITE_USE_IAD 設置為 false。
? USBX Device System Stack Size 由默認的 512 設置為 4K(4*1024Bytes) 。
? USBX Device Register Connection Callback 設置為 false 。
? 其余的配置保持默認即可。
2.1.4 System Clock 相關配置
由于選擇了 Bypass 模式的 8Mhz,注意要修改為一致(默認的是 25Mhz)。USB Device IP 的時鐘需要 48Mhz,這里選擇 HSI48=48Mhz ;
2.1.5 配置 HID 需要的按鍵
PC13 是對應原理圖中的 USER BUTTON,配置如下,中斷優先級為 7,比 USB(USB中斷優先級設為 6) 低:
并使能其中斷,生成相關中斷入口函數的代碼,
2.1.6 生成項目工程
為項目工程命名,生成項目工程,適當配置堆棧的大小:
這時候可能會提示警告,如下圖所示 :
回過頭去配置一下即可,如下圖:
然后生成項目工程代碼。
2.2.添加應用代碼
注意:這個 LAT 是基于 STM32Cube_FW_H5_V1.X.X 中的“\STM32Cube_FW_H5_V1.x.x\Projects\NUCLEO-H563ZI\Applications\USBX\Ux_Device_HID_Standalone \”例程,所以本 LAT 中提到的函數或者變量都可以直接使用或者參考例程中的函數或者變量。
2.2.1 完善串口打印
可以參考《STM32 USBx HOST HID standalone 示例移植》中的說明完善串口打印信息。由于是 USB Device,也可以通過 USB 協議分析儀去查看 log 調試(可選)。
2.2.2 添加 USBx 的初始化函數
在 main.c 中添加初始化函數如下圖,如果 main.c 中已經包含它,請忽略。
該函數在 CubeMX 中已經生成,添加調用即可;然后在 MX_USBX_Device_Init 函數的末尾去添加 USBX_APP_Device_Init ();的初始化的調用;
? 添加相關函數的聲明;
? 添加 PCD_HandleTypeDef hpcd_USB_DRD_FS;
? 添加USBX_APP_Device_Init函數中MX_USB_PCD_Init 函數的定義,該函數由STM32CubeMX 自動生成在 main.c 文件中,運行代碼,你會發現此時枚舉不成功。
2.2.3?添加 USBx 的處理函數
在 main 函數的 while 循環中添加函數 USBX_Device_Process(NULL);添加該函數USBX_Device_Process 的定義和申明在 app_usbx_device.c 文件中實現。
編譯無問題后,運行,實現枚舉。
2.2.4?HID 按鍵功能的實現
打開函數 USBX_DEVICE_HID_MOUSE_Task 并實現它,還有按鍵的 callback 回調函數的實現,復制粘貼例程程序的代碼即可。
添加相關變量的申明,解決相應的編譯錯誤之后,即可通過按鍵 User Button 模擬鼠標的功能。當每按一下 User Button(MCU 的 PC13 引腳),在 PC 端即可看到鼠標移動一下,符合預期。
?