STM32F103系列之USB HID接口实现

您所在的位置:网站首页 103键盘 STM32F103系列之USB HID接口实现

STM32F103系列之USB HID接口实现

2024-03-07 20:31| 来源: 网络整理| 查看: 265

  STM32F103芯片集成了USB2.0 Full-Speed接口,可以用作与外部设备进行通信,如电脑。基本连接如下:其中,V3P3是USB接口VBUS通过LDO转换为3.3V。

  

  因为STM32F103内部没有集成USB2.0 Full-Speed的上拉电阻,因此外接上拉电阻(详细见上篇文章“USB2.0系列—HID设备”),然后将MCU_DM和MCU_DP分别接MCU的DM和DP,即可实现USB2.0Full-speed硬件配置。

  关于STM32F103的Firmware,本文采用了STM32CubeIDE自动产生相应的参考代码,配置信息如下:

  

  

  通过配置上述参数,然后即可生成相应的参考代码。注意:这个生产的参考代码是不完整的,不能直接用的。还需要填写Report Descriptor数据(详细见上篇文章“USB2.0系列—HID设备”)。打开USB_Device-->App-->usbd_custom_hid_if.c文件,找到下面的定义,将其大学内容书写完整。如下图所示:(数一下下面这个数组的Byte数为38,将上面配置中的Report Descriptor数目改为38,OUT Report Bytes设置为64)

  __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =

  {

  /* USER CODE BEGIN 0 */

  0x05, 0x8c, //0x05:USAGE PAGE

  0x09, 0x00, //0x09:USAGE

  0xA1, 0x00, //0xA1:COLLECTION

  //下面开始数据配置

  0x09, 0x00, //0x09:USAGE

  0xA1, 0x00, //0xA1:COLLECTION

  0x09, 0x00, //0x09:USAGE

  0x15, 0x00, //0x15:LOGICAL MIN 最小数为0x00

  0x26, 0xFF, 0x00, //0x26:LOGICAL MAX 最大数为0XFF

  0x75, 0x08, //0x75:REPORT SIZE;0x08:8位bit

  0x95, 0x40, //0x95:REPORT COUNT;0x40:最大64 bytes传输

  0x91, 0x02, //0x91:OUTPUT;0x02:Var(可变量)

  //上面OUT格式

  0x09, 0x00, //0x09:USAGE

  0x15, 0x00, //0x15:LOGICAL MIN

  0x26, 0xFF, 0x00, //0x26:LOGICAL MAX

  0x75, 0x08, //0x75:REPORT SIZE

  0x95, 0x40, //0x95:REPORT COUNT

  0x81, 0x02, //0x81:INPUT; 0x02:Var(可变量)

  //上面IN格式

  //有两个 COLLECTION,就需要两个END COLLECTION

  0xC0, //END COLLECTION

  /* USER CODE END 0 */

  0xC0 /* END_COLLECTION */

  };

  然后设置USB接收的中断优先级,我这里设置为6,根据不同的需求进行调整。

  

  另外,USB的时钟只能设置为48M,因此在设置Clock的时候要尤其注意,见下图所示:

  

  这样,我们的STM32下位机插入电脑之后,电脑就会认为是HID设备,在电脑上打开USBTreeView.exe。可以看到我们设置的是否正确,如果是以上面的配置设置,那么电脑端应该显示如下:

  

  那么,设备可以识别了,那么Firmware中通信要怎么弄呢?调用两个函数即可:

  uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev,uint8_t *report,uint16_t len);

  //上面为STM32向主机发送数据

  static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state);

  //上面为STM32接收到HOST的数据会执行的函数,这个函数需要自己完善,我自己完善的数据如下:

  static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)

  {

  /* USER CODE BEGIN 6 */

  USBD_CUSTOM_HID_HandleTypeDef *hhid_temp=(USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceFS.pClassData; //STM32会将数据存储的位置

  usb_status_t *usb_status_temp=get_usb_status();//自己定义的数组存储位置

  uint8_t temp=0;

  for(;temp



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3