STM32F103ZET6 - USB_HID -1 (USB发送和接收)

*STM32F103ZET6 - USB_HID -1 (USB发送和接收)

示例详解: (参考 : https://blog.csdn.net/zhanglifu3601881/article/details/89675307)
基于硬件平台: STM32F103ZET6正点原子的精英板, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。

  1. STM32CubeMX生成代码过程如下:

    1>. 打开SWD - debug调试模式, STM32CubeMX生成的代码默认是没打开debug调试模式的 在这里插入图片描述
    2>. 外部时钟配置, HSE选择为外部晶振在这里插入图片描述
    3>. CLOCK Configuration 配置如下: 选择HSE,PLL倍频为9, USB分频为1.5=48M在这里插入图片描述
    4>. USB功能选中在这里USB插入图片描述
    5>. USB_DEVICE --> 选择HID功能 . 参数设置保持默认不变.
    在这里插入图片描述
    在这里插入图片描述
    6>. 中断配置保持默认.
    在这里插入图片描述
    7>. 生成代码配置在这里插入图片描述

点击生成代码,然后烧录默认代码,连上电脑可在电脑的设备管理器中可以看到人全学输入设备中可以看到USB输入设备,但是有个叹号:
在这里插入图片描述
二、接下来我们将要在生成的HID框架上修改代码, 主要有修改设备描述符,传输的字节,轮询的时间,中断回调函数接收( usbd_custom_hid_if.c,usbd_conf.h,usbd_customhid.h)

  1. 在 usbd_custom_hid_if.c 中修改设备描述符函数 CUSTOM_HID_ReportDesc_FS。
/** @defgroup USBD_CUSTOM_HID_Private_Variables USBD_CUSTOM_HID_Private_Variables
  * @brief Private variables.
  * @{
  */

/** 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,
	0x05, 0x8c, /* USAGE_PAGE (ST Page) */
    0x09, 0x01, /* USAGE (Demo Kit) */
    0xa1, 0x01, /* COLLECTION (Application) */
 
    // 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,CUSTOM_HID_EPIN_SIZE, // 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,CUSTOM_HID_EPOUT_SIZE, // REPORT_COUNT (64Byte)
    0x91,0x02, // OUTPUT (Data,Var,Abs)
  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION	             */
};
  1. 在usbd_conf.h 中修改设备描述符USBD_CUSTOM_HID_REPORT_DESC_SIZE的大小 ,原为2个字节. 现根据之前的修改代 码改为33个字节.
    USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 发送BUF改为64字节,原为2个字节
/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines
  * @brief Defines for configuration of the Usb device.
  * @{
  */

/*---------- -----------*/
#define USBD_MAX_NUM_INTERFACES     1
/*---------- -----------*/
#define USBD_MAX_NUM_CONFIGURATION     1
/*---------- -----------*/
#define USBD_MAX_STR_DESC_SIZ     512
/*---------- -----------*/
#define USBD_DEBUG_LEVEL     0
/*---------- -----------*/
#define USBD_SELF_POWERED     1
/*---------- -----------*/
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     64//2 /* 64字节 */
/*---------- -----------*/
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE     33U//2 /* 设备描述符大小 */
/*---------- -----------*/
#define CUSTOM_HID_FS_BINTERVAL     0x5
  1. 在 usbd_customhid.h 中修改 CUSTOM_HID_EPIN_SIZE,CUSTOM_HID_EPOUT_SIZE,和轮循时间CUSTOM_HID_HS_BINTERVAL

/** @defgroup USBD_CUSTOM_HID_Exported_Defines
  * @{
  */
#define CUSTOM_HID_EPIN_ADDR                 0x81U
#define CUSTOM_HID_EPIN_SIZE                 0x40U//0x02U  /* 64字节 */
/*这个是USB的中断接收函数,根据USB设备的ID来接收字节,库生成的时候只能接收2个字节的,
当我们改成0x40,就能接收64个字节,USB HID一包只能64个字节*/

#define CUSTOM_HID_EPOUT_ADDR                0x01U
#define CUSTOM_HID_EPOUT_SIZE                0x40U//0x02U  /* 64字节 */

#define USB_CUSTOM_HID_CONFIG_DESC_SIZ       41U
#define USB_CUSTOM_HID_DESC_SIZ              9U

#ifndef CUSTOM_HID_HS_BINTERVAL
#define CUSTOM_HID_HS_BINTERVAL            0x01U//0x05U //1ms轮询
#endif /* CUSTOM_HID_HS_BINTERVAL */
  1. 在main.c中加入代码 – 1s发送64字节数据代码:
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	uint32_t preticks;
	uint8_t report[64] = {1,2,3,4,5,6,7,8};
  /* 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 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		
    /* USER CODE BEGIN 3 */
		if(HAL_GetTick() - preticks > 1000)
		{
			preticks = HAL_GetTick();
			USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, report, 64);
		}
  }
  /* USER CODE END 3 */
}

至些代码修改完成, 这时重新编译。 然后烧录代码后, 手上USB,电脑会正确识别为HID设备, 这时没有了感叹号。
在这里插入图片描述
三、测试代码, 借助PortHelper.exe/USB调试工具。
1. 查找USB后,会出现STM32 Custom Human interface 这个HID设备,然后我们选择它, 再打开USB。
STM32F103ZET6 - USB_HID -1 (USB发送和接收)_第1张图片
2. 看到接收区在以1秒64字节的速度接收我们代码里发送的64字节数据。
STM32F103ZET6 - USB_HID -1 (USB发送和接收)_第2张图片
3. 接下来测试接收数据 – 同时用工具给程序发送数据,仿真调试程序可以看到程序可以正功接收到正常的数据:。
STM32F103ZET6 - USB_HID -1 (USB发送和接收)_第3张图片
STM32F103ZET6 - USB_HID -1 (USB发送和接收)_第4张图片
STM32F103ZET6 - USB_HID -1 (USB发送和接收)_第5张图片
致些USB-HID 发送和接收测试完成。

你可能感兴趣的:(STM32F103ZET6 - USB_HID -1 (USB发送和接收))