• 利用STM32CubeMX生成HID双向通讯工程


    使用开发板为正点原子ministm32

     现在我们先使用HID descriptor Tool来生成我们需要的hid的

     保存使用选择.H

    // D:usb资料HIDMSDEVProjects	estDesc_HID.h
    
    
    char ReportDescriptor[34] = {
        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, 0x40,                    //   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, 0x40,                    // REPORT_COUNT (64)
        0x75, 0x08,                    // REPORT_SIZE (8)
        0x91, 0x02,                    // OUTPUT (Data,Var,Abs)
        0xc0                           // END_COLLECTION
    };

    现在使用使用STM32CubeMX来生成我们的工程

     

     

    char ReportDescriptor[34] 修改工程中CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE]

    /** @defgroup USBD_AUDIO_IF_Private_Variables
     * @{
     */
    __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
    {
      /* USER CODE BEGIN 0 */     
        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, 0x40,                    //   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, 0x40,                    // REPORT_COUNT (64)
        0x75, 0x08,                    // REPORT_SIZE (8)
        0x91, 0x02,                    // OUTPUT (Data,Var,Abs)
      /* USER CODE END 0 */ 
      0xC0    /*     END_COLLECTION                 */
       
    }; 
    
    /* USER CODE BEGIN PRIVATE_VARIABLES */
    /* USER CODE END PRIVATE_VARIABLES */
    /**
      * @}
      */ 

    现在编译下载测试

    先使用USBlyzer来看看

    现在继续修改我们代码增加发送PC数据

    /**
      ******************************************************************************
      * File Name          : main.c
      * Description        : Main program body
      ******************************************************************************
      * This notice applies to any and all portions of this file
      * that are not between comment pairs USER CODE BEGIN and
      * USER CODE END. Other portions of this file, whether 
      * inserted by the user or by software development tools
      * are owned by their respective copyright owners.
      *
      * Copyright (c) 2017 STMicroelectronics International N.V. 
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without 
      * modification, are permitted, provided that the following conditions are met:
      *
      * 1. Redistribution of source code must retain the above copyright notice, 
      *    this list of conditions and the following disclaimer.
      * 2. Redistributions in binary form must reproduce the above copyright notice,
      *    this list of conditions and the following disclaimer in the documentation
      *    and/or other materials provided with the distribution.
      * 3. Neither the name of STMicroelectronics nor the names of other 
      *    contributors to this software may be used to endorse or promote products 
      *    derived from this software without specific written permission.
      * 4. This software, including modifications and/or derivative works of this 
      *    software, must execute solely and exclusively on microcontroller or
      *    microprocessor devices manufactured by or for STMicroelectronics.
      * 5. Redistribution and use of this software other than as permitted under 
      *    this license is void and will automatically terminate your rights under 
      *    this license. 
      *
      * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
      * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
      * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
      * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
      * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
      * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
      * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
      * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
      * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
      * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
      * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      *
      ******************************************************************************
      */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "stm32f1xx_hal.h"
    #include "usb_device.h"
    
    /* USER CODE BEGIN Includes */
    #include "usbd_customhid.h"
    /* USER CODE END Includes */
    
    /* Private variables ---------------------------------------------------------*/
    
    /* USER CODE BEGIN PV */
    /* Private variables ---------------------------------------------------------*/
    extern USBD_HandleTypeDef hUsbDeviceFS;
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    
    /* USER CODE BEGIN PFP */
    /* Private function prototypes -----------------------------------------------*/
    
    /* USER CODE END PFP */
    
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    int main(void)
    {
    
      /* USER CODE BEGIN 1 */
        uint8_t send_buf[64] = {0};
        uint8_t i;
      /* USER CODE END 1 */
    
      /* MCU Configuration----------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USB_DEVICE_Init();
    
      /* USER CODE BEGIN 2 */
    
        for(i=0;i<64;i++)
        {
            send_buf[i] = i;
        }
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
      /* USER CODE END WHILE */
    
      /* USER CODE BEGIN 3 */
    
        USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, send_buf, 64);
        send_buf[0]++;
        HAL_Delay(2000);
      }
      /* USER CODE END 3 */
    
    }
    
    /** System Clock Configuration
    */
    void SystemClock_Config(void)
    {
    
      RCC_OscInitTypeDef RCC_OscInitStruct;
      RCC_ClkInitTypeDef RCC_ClkInitStruct;
      RCC_PeriphCLKInitTypeDef PeriphClkInit;
    
        /**Initializes the CPU, AHB and APB busses clocks 
        */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
      RCC_OscInitStruct.HSEState = RCC_HSE_ON;
      RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
        /**Initializes the CPU, AHB and APB busses clocks 
        */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
      PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
      PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
      if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
        /**Configure the Systick interrupt time 
        */
      HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
    
        /**Configure the Systick 
        */
      HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    
      /* SysTick_IRQn interrupt configuration */
      HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    }
    
    /** Configure pins as 
            * Analog 
            * Input 
            * Output
            * EVENT_OUT
            * EXTI
    */
    static void MX_GPIO_Init(void)
    {
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOD_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
    }
    
    /* USER CODE BEGIN 4 */
    
    /* USER CODE END 4 */
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @param  None
      * @retval None
      */
    void _Error_Handler(char * file, int line)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      while(1) 
      {
      }
      /* USER CODE END Error_Handler_Debug */ 
    }
    
    #ifdef USE_FULL_ASSERT
    
    /**
       * @brief Reports the name of the source file and the source line number
       * where the assert_param error has occurred.
       * @param file: pointer to the source file name
       * @param line: assert_param error line source number
       * @retval None
       */
    void assert_failed(uint8_t* file, uint32_t line)
    {
      /* USER CODE BEGIN 6 */
      /* User can add his own implementation to report the file name and line number,
        ex: printf("Wrong parameters value: file %s on line %d
    ", file, line) */
      /* USER CODE END 6 */
    
    }
    
    #endif
    
    /**
      * @}
      */ 
    
    /**
      * @}
    */ 
    
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

     可以看到下面的数据在变化

    bus hound的设置如下

     现在使用bus hound发送数据到MCU

     

     现在修改一下工程代码

    注释掉main.C中的

    //    USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, &send_buf[0],64);
    //    send_buf[0]++;
    //    HAL_Delay(2000);

    /**
      ******************************************************************************
      * File Name          : main.c
      * Description        : Main program body
      ******************************************************************************
      * This notice applies to any and all portions of this file
      * that are not between comment pairs USER CODE BEGIN and
      * USER CODE END. Other portions of this file, whether 
      * inserted by the user or by software development tools
      * are owned by their respective copyright owners.
      *
      * Copyright (c) 2017 STMicroelectronics International N.V. 
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without 
      * modification, are permitted, provided that the following conditions are met:
      *
      * 1. Redistribution of source code must retain the above copyright notice, 
      *    this list of conditions and the following disclaimer.
      * 2. Redistributions in binary form must reproduce the above copyright notice,
      *    this list of conditions and the following disclaimer in the documentation
      *    and/or other materials provided with the distribution.
      * 3. Neither the name of STMicroelectronics nor the names of other 
      *    contributors to this software may be used to endorse or promote products 
      *    derived from this software without specific written permission.
      * 4. This software, including modifications and/or derivative works of this 
      *    software, must execute solely and exclusively on microcontroller or
      *    microprocessor devices manufactured by or for STMicroelectronics.
      * 5. Redistribution and use of this software other than as permitted under 
      *    this license is void and will automatically terminate your rights under 
      *    this license. 
      *
      * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
      * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
      * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
      * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
      * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
      * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
      * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
      * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
      * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
      * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
      * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      *
      ******************************************************************************
      */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "stm32f1xx_hal.h"
    #include "usb_device.h"
    
    /* USER CODE BEGIN Includes */
    #include "usbd_customhid.h"
    /* USER CODE END Includes */
    
    /* Private variables ---------------------------------------------------------*/
    
    /* USER CODE BEGIN PV */
    /* Private variables ---------------------------------------------------------*/
    extern USBD_HandleTypeDef hUsbDeviceFS;
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    
    /* USER CODE BEGIN PFP */
    /* Private function prototypes -----------------------------------------------*/
    
    /* USER CODE END PFP */
    
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    int main(void)
    {
    
      /* USER CODE BEGIN 1 */
        uint8_t send_buf[65] = {0XFF};
        uint8_t i;
      /* USER CODE END 1 */
    
      /* MCU Configuration----------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USB_DEVICE_Init();
    
      /* USER CODE BEGIN 2 */
    
        for(i=0;i<65;i++)
        {
            send_buf[i] = i;
        }
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
      /* USER CODE END WHILE */
    
      /* USER CODE BEGIN 3 */
    
    //    USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, &send_buf[0],64);
    //    send_buf[0]++;
    //    HAL_Delay(2000);
      }
      /* USER CODE END 3 */
    
    }
    
    /** System Clock Configuration
    */
    void SystemClock_Config(void)
    {
    
      RCC_OscInitTypeDef RCC_OscInitStruct;
      RCC_ClkInitTypeDef RCC_ClkInitStruct;
      RCC_PeriphCLKInitTypeDef PeriphClkInit;
    
        /**Initializes the CPU, AHB and APB busses clocks 
        */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
      RCC_OscInitStruct.HSEState = RCC_HSE_ON;
      RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
        /**Initializes the CPU, AHB and APB busses clocks 
        */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
      PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
      PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
      if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
        /**Configure the Systick interrupt time 
        */
      HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
    
        /**Configure the Systick 
        */
      HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    
      /* SysTick_IRQn interrupt configuration */
      HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    }
    
    /** Configure pins as 
            * Analog 
            * Input 
            * Output
            * EVENT_OUT
            * EXTI
    */
    static void MX_GPIO_Init(void)
    {
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOD_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
    }
    
    /* USER CODE BEGIN 4 */
    
    /* USER CODE END 4 */
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @param  None
      * @retval None
      */
    void _Error_Handler(char * file, int line)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      while(1) 
      {
      }
      /* USER CODE END Error_Handler_Debug */ 
    }
    
    #ifdef USE_FULL_ASSERT
    
    /**
       * @brief Reports the name of the source file and the source line number
       * where the assert_param error has occurred.
       * @param file: pointer to the source file name
       * @param line: assert_param error line source number
       * @retval None
       */
    void assert_failed(uint8_t* file, uint32_t line)
    {
      /* USER CODE BEGIN 6 */
      /* User can add his own implementation to report the file name and line number,
        ex: printf("Wrong parameters value: file %s on line %d
    ", file, line) */
      /* USER CODE END 6 */
    
    }
    
    #endif
    
    /**
      * @}
      */ 
    
    /**
      * @}
    */ 
    
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
    View Code

    修改在usbd_custom_hid_if.c

    /**
      * @brief  CUSTOM_HID_OutEvent_FS
      *         Manage the CUSTOM HID class events       
      * @param  event_idx: event index
      * @param  state: event state
      * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
      */
    static int8_t CUSTOM_HID_OutEvent_FS  (uint8_t event_idx, uint8_t state)
    { 
      /* USER CODE BEGIN 6 */ 
         USBD_CUSTOM_HID_HandleTypeDef *hhid = hUsbDeviceFS.pClassData; 
        
        USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, hhid->Report_buf,64);
      return (0);
      /* USER CODE END 6 */ 
    }

    好了测试一下

     存在一个问题当PC发送不是64位时怎么处理??未解决

    后面找到一些资料: 所有的 HID 数据都必须使用定义过的报表格式来定义报表中数据的大小与内容。设备可
    以支持一个或多个报表。在固件中的报表描述符用来描述了此报表,以及如何使用报表数据的
    信息。

  • 相关阅读:
    WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别
    改善C#程序的建议1:非用ICloneable不可的理由
    WPF快速指导5:验证
    改善C#程序的建议4:C#中标准Dispose模式的实现
    我所入选的微软技术社区电子报
    C#中new, override, virtual的具体用法
    C#中FCL迭代器模式的一点问题
    WPF快速指导3:数据绑定
    WPF快速指导2:模板
    C#高效编程话题集2(每期10话题)
  • 原文地址:https://www.cnblogs.com/libra13179/p/7193375.html
Copyright © 2020-2023  润新知