99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

基于CUBEMX的HID雙向通訊

在STM32中如何自定義HID設備,用cubemx怎么生成代碼并配置?

生成USB HID工程

可以看到,勾選usb device的功能后,右側的芯片引腳已經設置好了,DP和DM兩根線就是usb通信的差分線。

再配置USB的軟件中間件,選擇usb device,Custom Interface Device Class,這個選項生成的就是自定義的HID設備。

然后需要修改三個參數:

CUSTOM_HID_FS_BINTERVAL,這個設置的是HID設備的通信時間間隔,單位為ms,最快可以為1ms間隔;

USBD_CUSTOM_HID_REPORT_DESC_SIZE,設置的是報告描述符的長度,設為34(后面會提到為什么是這個值);

USBD_CUSTOMHID_OUTREPORT_BUF_SIZE,比較好理解,設置的是發送緩沖區的大小,HID一次最多可以發送64個字節,我們設置為最大值。

在另一個選項卡中,我們可以看到下面幾個參數:VID、PID,以及設備標識,這里我們都不修改。

其他的配置都不用改,就可以生成工程代碼了。

2)代碼編寫

打開生成的keil工程,可以看到已經生成了usb相關的源文件。

我們一步步添加需要的代碼。

首先添加報告描述符,如下圖,在usbd_custom_hid_if.c文件中,CUSTOM_HID_ReportDesc_FS定義數組內部添加:

/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
//  0x00,
	0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x95, 0x08,                    //   REPORT_COUNT (64字節)
    0x75, 0x08,                    //   REPORT_SIZE (8位)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              // LOGICAL_MAXIMUM (255)
    0x95, 0x08,                    // REPORT_COUNT (64)
    0x75, 0x08,                    // REPORT_SIZE (8)
    0x91, 0x02,                    // OUTPUT (Data,Var,Abs)
  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION	             */
};

描述符定義了usb傳輸數據的格式。

這里的數組長度USBD_CUSTOM_HID_REPORT_DESC_SIZE就是在cubemx中定義的34,與描述符數組的長度必須一樣。

然后,在usbd_customhid.c文件中,找到USBD_CUSTOM_HID_CfgHSDesc數組,修改里面的參數:

標記的四個參數,分別是:接收的長度、延時,發送的長度、延時;這里我們可以跳轉到它們的宏定義處修改;長度都修改為0x40;延時可以默認,也可以修改到1,也就是1ms周期,可以加快通信的最快速率。

接著,修改接收函數,如下圖,在usbd_custom_hid_if.c文件中,添加語句如下:

這個函數在usb接收到數據時會自動調用,這里我們在函數中,把接收到的數據用strncpy這個函數拷貝到usb_rx_data數組中,然后設置usb_rx_flag標志位。

到主函數中循環查詢標志位,查詢到則可以處理usb_rx_data中接收到的數據。

需要發送數據時,直接調用HAL庫生成的發送函數即可,函數原型如下:

uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef  *pdev,
                                   uint8_t *report,
                                   uint16_t len)
{
  USBD_CUSTOM_HID_HandleTypeDef     *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData;

  if (pdev->dev_state == USBD_STATE_CONFIGURED)
  {
    if (hhid->state == CUSTOM_HID_IDLE)
    {
      hhid->state = CUSTOM_HID_BUSY;
      USBD_LL_Transmit(pdev, CUSTOM_HID_EPIN_ADDR, report, len);
    }
    else
    {
      return USBD_BUSY;
    }
  }
  return USBD_OK;
}

主函數中主要添加的是:初始時將USB端口復位,以及主循環中的接收和發送數據。

USB_IO_rest();這個函數主要是用在初始時把usb接口引腳拉低一下,讓計算機知道有新設備插入(以前的文章講過,也可以參考源代碼,很容易理解);

主循環中檢測接收標志位,如果收到數據,則把數據更新到usb_tx_data中,每隔1s檢測一下;每隔1s把usb_tx_data中的數據發送出去。

看看具體的額效果,端點2接受和發送

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關注 211
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 久久热这里只有精品在线观看 | 日本伊人精品一区二区三区观看方式 | 99re8在线精品视频免费播放 | 午夜羞羞影院免费播放在线观看 | www.狠狠| 四虎国产精品成人 | 久久久久久久久免费 | 综合国产视频 | 免费视频一二三 | 成人在色线视频在线观看免费大全 | 永久免费不卡的AV网站 | 亚洲成年人网站在线观看 | 久久久久久在线观看 | 日本精品久久久久中文字幕 | 67194中文字幕在线观看日韩 | 四虎国产精品永久在线无码 | 啦啦啦啦WWW日本在线观看 | 日本免费一区二区三区高清视频 | 蜜臀久久精品久久久久久酒店? | 热久久综合网 | 久久久亚洲精品一区二区三区 | 精品国产高清一区二区三区 | 欧美精品中文 | 日本欧美一区二区三区视频麻豆 | 国产一级黄色录像片 | 精品乱码久久久久久中文字幕 | 天天摸天天澡天天看 | 婷婷成人丁香五月综合激情 | 国产精品日韩专区 | 免费人成再在线观看网站 | gogo大胆无码免费视频列表 | 看黄免费在线观看 | 精品欧美亚洲韩国日本久久 | 丁香花在线观看免费观看 | 亚洲精品一区二区三区中文字幕 | 天天操夜操视频 | 爱av在线| 性少妇无码播放 | 日韩经典在线观看 | 西出玉门40集全免费播放 | 九九热精品视频在线免费观看 |