程式功能
- 将STM32的USB枚舉為HID裝置。
- STM32使用3個端點,端點0用于枚舉用,端點1和2用于資料的發送和接收。
- 端點長度為64,也就是單次最多可以傳輸64個位元組資料。
- STM32擷取上位機下發的資料并将該資料通過USB原樣傳回,同時将資料列印輸出。
- 上位機程式通過調用windows的API實作對HID裝置的讀寫控制。
USB接口原理圖:
<ignore_js_op>

HID枚舉成功:
<ignore_js_op>
程式效果圖
<ignore_js_op>
圖一 上位機程式運作圖
<ignore_js_op>
圖二 STM32序列槽列印輸出
<ignore_js_op>
圖三 Bus Hound抓取的資料
程式部分代碼
STM32的報告描述符:
- const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
- {
- 0x05, 0x8c,
- 0x09, 0x01,
- 0xa1, 0x01,
- // The Input report
- 0x09,0x03, // USAGE ID - Vendor defined
- 0x15,0x00, // LOGICAL_MINIMUM (0)
- 0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
- 0x75,0x08, // REPORT_SIZE (8bit)
- 0x95,0x40, // REPORT_COUNT (64Byte)
- 0x81,0x02, // INPUT (Data,Var,Abs)
- // The Output report
- 0x09,0x04, // USAGE ID - Vendor defined
- 0x15,0x00, // LOGICAL_MINIMUM (0)
- 0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
- 0x75,0x08, // REPORT_SIZE (8bit)
- 0x95,0x40, // REPORT_COUNT (64Byte)
- 0x91,0x02, // OUTPUT (Data,Var,Abs)
- 0xc0
- };
複制代碼
上位機測試程式
- void HIDSampleFunc(void)
- {
- HANDLE hDev;
- BYTE recvDataBuf[1024],reportBuf[1024];;
- DWORD bytes;
- hDev = OpenMyHIDDevice(0); // 打開裝置,不使用重疊(異步)方式 ;
- if (hDev == INVALID_HANDLE_VALUE){
- printf("INVALID_HANDLE_VALUE\n");
- return;
- }
- reportBuf[0] = 0; // 輸出報告的報告 ID 是 0
- for(int i=0;i<REPORT_COUNT;i++){
- reportBuf[i+1]=i+1;//将資料存放在資料緩沖區
- }
- printf("開始寫資料到裝置...\n");
- // 寫入資料到裝置,注意,第三個參數值必須為REPORT_COUNT+1,否則會傳回1784錯誤
- if (!WriteFile(hDev, reportBuf, REPORT_COUNT+1, &bytes, NULL)){
- printf("write data error! %d\n",GetLastError());
- return;
- }else{
- printf("成功向裝置寫出%d個資料... \n",bytes);
- }
- printf("開始從裝置讀取資料...\n");
- // 從裝置讀取資料,注意,第三個參數值必須大于等于REPORT_COUNT+1,否則會傳回1784錯誤
- if(!ReadFile(hDev, recvDataBuf, REPORT_COUNT+1, &bytes, NULL)){ // 讀取裝置發給主機的資料
- printf("read data error! %d\n",GetLastError());
- return;
- }else{
- printf("成功向裝置讀出%d個資料... \n",bytes);
- }
- printf("裝置傳回的資料為:\n");
- //顯示讀取回來的資料
- for(int i=0;i<REPORT_COUNT;i++){
- printf("0x%02X ",recvDataBuf[i+1]);
- }
- printf("\n\r");
- }
複制代碼
源碼下載下傳
STM32程式下載下傳: <ignore_js_op>
stm32_usb_hid.zip
STM32F105/107版本源碼下載下傳: <ignore_js_op>
usb_hid.rar
HID上位機程式下載下傳(VS2010): <ignore_js_op>
STM32_HID_PC_Driver.zip
HID上位機程式下載下傳(VS2008): <ignore_js_op>
PC_HID.zip )
USB開發相關資料下載下傳
<ignore_js_op>
USB2.0技術規範(中文).pdf
<ignore_js_op>
Windows主機端與自定義USB_HID裝置通信詳解.pdf
<ignore_js_op>
STM32F10xxx USB-FS-Device firmware library.pdf
<ignore_js_op>
STM32F10xxx USB開發工具包.pdf
<ignore_js_op>
STM32_USB-FS-Device_Lib_V3.0.1.zip
<ignore_js_op>
STM32_usb固件庫.pdf
<ignore_js_op>
基于STM32的USB程式開發筆記.pdf
<ignore_js_op>
深入解析STM32_USB-FS-Device_Lib庫.pdf
出處:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=199&extra=&page=1
轉載于:https://www.cnblogs.com/flyheart33/p/3610866.html