STM32 USB HID通訊移植步驟

2021-06-28 04:47:55 字數 4547 閱讀 3071

stm32 usb-hid通訊移植步驟

很久沒寫過文章了,趁今晚有空出來露一下。最近發現很多人對stm32的usb通訊很感興趣。要將usb的通訊協議搞懂確實是乙個比較漫長的過程。但是usb的hid通訊無論是上位機的設計還是stm32程式的程式設計都非常的簡單。只是我想很多人都不知道而已。這篇文章的目的是讓大家以最短的時間將usb加到你的裝置中。如果想學得更深就靠大家。

hid只是適合低速傳輸,其理論上可以達到64kb/s,但多由於windows系統和硬體的關係一般達不到這個傳輸數度。但這個速度對於一般系統的控制和資料傳輸都已經足夠了,而且是免驅,省去了很多麻煩。如果您需要高速傳輸可參考我的另外一篇文章《stm32的usb例程修改步驟》文章在

一、安裝完mdk後請開啟c:/keil/arm/examples/st/stm32f10xusblib/demos路徑,將custom_hid在同乙個目錄下複製乙份,如果你要放到其他路徑你需要在mdk options for target的c/c++中新增usb的標頭檔案路徑(mdk下的/inc/st/stm32f10x/usb)。

二、開啟usb_desc.c檔案,該檔案主要包含的端點描述符、裝置描述符、配置描述符和字元描述符等。具體請大家參考其他資料了,這裡主要說幾個常用。

u8 devicedescriptor[siz_device_desc]為usb裝置描述符。當中的

0x83,                       /*idvendor (0x0483)*/

0x04,

0x50,                       /*idproduct = 0x5750*/

0x57,

//idvender欄位。廠商id號,我們這裡取0x0483,僅供實驗用。

//實際產品不能隨便使用廠商id號,必須跟usb協會申請廠商id號。

//注意小端模式,低位元組在先。

//idproduct欄位。產品id號,我們這裡取0x5750。

//注意小端模式,低位元組應該在前。

const u8 configdescriptor[siz_config_desc]是配置描述符,注意如下

usb_endpoint_descriptor_type, /* bdescriptortype: */

0x81,          /* bendpointaddress: endpoint address (in) */

0x03,          /* bmattributes: interrupt endpoint */

0x02,          /* wmaxpacketsize: 2 bytes max */

0x00,

0x20,          /* binterval: polling interval (32 ms) */

/* 34 */

0x07,   /* blength: endpoint descriptor size */

usb_endpoint_descriptor_type,       /* bdescriptortype: */

/*    endpoint descriptor type */

0x01,   /* bendpointaddress: */

/*    endpoint address (out) */

0x03,   /* bmattributes: interrupt endpoint */

0x02,   /* wmaxpacketsize: 2 bytes max  */

0x00,

0x20,  /* binterval: polling interval (20 ms) */

上面包含了「輸入端點描述符」和「輸出端點描述符」。

//wmaxpacketsize欄位。該端點的最大包長。

//binterval欄位。端點查詢的時間,

為了實現更高速的通訊我們修改如下:

/******************** descriptor of  endpoint ********************/

/* 27 */

0x07,          /*blength: endpoint descriptor size*/

usb_endpoint_descriptor_type, /*bdescriptortype:*/

0x81,          /*bendpointaddress: endpoint address (in)*/

0x03,          /*bmattributes: interrupt endpoint*/

0x40,          /*wmaxpacketsize: 64 byte max */

0x00,

0x0a,          /*binterval: polling interval (10 ms)*/

/* 34 */

/******************** descriptor of  endpoint ********************/

/* 27 */

0x07,          /*blength: endpoint descriptor size*/

usb_endpoint_descriptor_type, /*bdescriptortype:*/

0x01,          /*bendpointaddress: endpoint address (out)*/

0x03,          /*bmattributes: interrupt endpoint*/

0x40,          /*wmaxpacketsize: 64 byte max */

0x00,

0x0a,          /*binterval: polling interval (10 ms)*/

const u8 reportdescriptor[siz_report_desc]為hid專用的報告描述符,具體的大家就參考資料了,這裡可以直接複製了。

const u8 customhid_reportdescriptor[customhid_siz_report_desc] =

; /* reportdescriptor */

const u8 customhid_stringvendor[customhid_siz_string_vendor]

const u8 stringproduct[siz_string_product]

const u8 stringserial[siz_string_serial]

分別是「廠商字元」、「產品字元」、「產品序列號」,這些將在usb hid裝置載入的時候顯示。但是這需要這些字元要求為unicode編碼,你需要將你要顯示的字元先轉為unicode編碼。你可以到

轉換。最好大家還要根據各個陣列的長度修改如下定義。

#define customhid_siz_report_desc               39

#define customhid_siz_string_vendor             64

#define customhid_siz_string_product            28

#define customhid_siz_string_serial             26

三、開啟hw_config.c檔案,將那些沒有的函式刪除,只保留如下函式

a)         set_system(void)

b)        void set_usbclock(void)

c)        void usb_interrupts_config(void)

d)        void usb_cable_config (functionalstate newstate)

特別要注意最後乙個函式,其主要作用是控制usb的上拉電阻,讓電腦檢測usb裝置是否連線的。

四、開啟stm32f10x_it.c檔案,把exti15_10_irqhandler等中斷內的**刪除。

開啟usb_prop.c檔案,修改如下:

void customhid_reset(void)

五、usb_endp.c檔案

void ep1_out_callback(void)

六、資料傳送和接收,舉例說明

1、資料接收

u8 datalen;

datalen = geteprxcount(endp1);

pmatouserbuffercopy(tx1_buffer, endp1_rxaddr, datalen);

seteprxvalid(endp1);

usart1_send(datalen);

count_out = 1;

2、資料傳送

usertopmabuffercopy(inbuffer, geteptxaddr(endp1), 64);

seteptxcount(endp1, 64);                    

seteptxvalid(endp1);

如果你傳送資料較為頻繁,每次傳送前應使用geteptxstatus(endp1)檢測上次傳送是否完成。如果端點狀態處於ep_tx_valid,說明傳送未結束,如果端點狀態處於ep_tx_nak,說明傳送結束。

STM32 USB HID通訊移植步驟

很久沒寫過文章了,趁今晚有空出來露一下。最近發現很多人對stm32的usb通訊很感興趣。要將usb的通訊協議搞懂確實是乙個比較漫長的過程。但是usb的hid通訊無論是上位機的設計還是stm32程式的程式設計都非常的簡單。只是我想很多人都不知道而已。這篇文章的目的是讓大家以最短的時間將usb加到你的裝...

STM32 USB HID裝置驅動分析

stm32 usb hid裝置驅動分析 daniellee 2014 9 29 一 usb hid的裝置描述符分析 usb hid的裝置描述符用以下結構定義 device property device prop device property 這是裝載了多個函式指標的結構體,用於統一管理usb的多...

STM32 USB HID裝置驅動分析

一 usb hid的裝置描述符分析 usb hid的裝置描述符用以下結構定義 device property device prop device property 這是裝載了多個函式指標的結構體,用於統一管理usb的多屬性及狀態,包括usb初始化 復位 輸入輸出狀態 資料傳輸引數請求 獲得裝置狀態...