性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

基于CUBEMX的HID雙向通訊

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

生成USB HID工程

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

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

然后需要修改三個(gè)參數(shù):

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

USBD_CUSTOM_HID_REPORT_DESC_SIZE,設(shè)置的是報(bào)告描述符的長(zhǎng)度,設(shè)為34(后面會(huì)提到為什么是這個(gè)值);

USBD_CUSTOMHID_OUTREPORT_BUF_SIZE,比較好理解,設(shè)置的是發(fā)送緩沖區(qū)的大小,HID一次最多可以發(fā)送64個(gè)字節(jié),我們?cè)O(shè)置為最大值。

在另一個(gè)選項(xiàng)卡中,我們可以看到下面幾個(gè)參數(shù):VID、PID,以及設(shè)備標(biāo)識(shí),這里我們都不修改。

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

2)代碼編寫

打開(kāi)生成的keil工程,可以看到已經(jīng)生成了usb相關(guān)的源文件。

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

首先添加報(bào)告描述符,如下圖,在usbd_custom_hid_if.c文件中,CUSTOM_HID_ReportDesc_FS定義數(shù)組內(nèi)部添加:

/** 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字節(jié))
    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傳輸數(shù)據(jù)的格式。

這里的數(shù)組長(zhǎng)度USBD_CUSTOM_HID_REPORT_DESC_SIZE就是在cubemx中定義的34,與描述符數(shù)組的長(zhǎng)度必須一樣。

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

標(biāo)記的四個(gè)參數(shù),分別是:接收的長(zhǎng)度、延時(shí),發(fā)送的長(zhǎng)度、延時(shí);這里我們可以跳轉(zhuǎn)到它們的宏定義處修改;長(zhǎng)度都修改為0x40;延時(shí)可以默認(rèn),也可以修改到1,也就是1ms周期,可以加快通信的最快速率。

接著,修改接收函數(shù),如下圖,在usbd_custom_hid_if.c文件中,添加語(yǔ)句如下:

這個(gè)函數(shù)在usb接收到數(shù)據(jù)時(shí)會(huì)自動(dòng)調(diào)用,這里我們?cè)诤瘮?shù)中,把接收到的數(shù)據(jù)用strncpy這個(gè)函數(shù)拷貝到usb_rx_data數(shù)組中,然后設(shè)置usb_rx_flag標(biāo)志位。

到主函數(shù)中循環(huán)查詢標(biāo)志位,查詢到則可以處理usb_rx_data中接收到的數(shù)據(jù)。

需要發(fā)送數(shù)據(jù)時(shí),直接調(diào)用HAL庫(kù)生成的發(fā)送函數(shù)即可,函數(shù)原型如下:

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;
}

主函數(shù)中主要添加的是:初始時(shí)將USB端口復(fù)位,以及主循環(huán)中的接收和發(fā)送數(shù)據(jù)。

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

主循環(huán)中檢測(cè)接收標(biāo)志位,如果收到數(shù)據(jù),則把數(shù)據(jù)更新到usb_tx_data中,每隔1s檢測(cè)一下;每隔1s把usb_tx_data中的數(shù)據(jù)發(fā)送出去。

看看具體的額效果,端點(diǎn)2接受和發(fā)送

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關(guān)注 210
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧