STM32F103系列之USB HID接口实现

  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<64;temp++)

  {

  usb_status_temp->usb_receive_data.usb_buffer[index]=hhid_temp->Report_buf[index];

  }

  //usb_status_temp->usb_receive_data.usb_buffer[index]将存储接受的数据,用来做你想要做的。

  return (USBD_OK);

  /* USER CODE END 6 */

  }

  另外提醒一下:

  在USB上电初始化之后,最好检查一下USB是否配置完成(即与HOST的初始通信是否建立),然后进行相关的USB操作。hUsbDeviceFS.dev_config!=0并且hUsbDeviceFS.dev_address!=0。只要这两个参数不为0,那么表示USB的设备通信已经建立完成,否则则是有问题的。

  USB HID接口建立完成,那么我们的HOST端(即电脑要怎么弄呢?),下一篇会介绍一下用C#实现简单的上位机软件与STM32进行通信。

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103C8是一款32位的ARM Cortex-M3内核的微控制器,它具有丰富的外设功能,包括USB HID(Human Interface Device)。 USB HID是一种用于创建和管理与计算机交互的设备的USB设备类别。它包括键盘、鼠标、游戏控制器等常见的输入设备。因此,使用STM32F103C8可以轻松地通过USB接口将这些设备连接到计算机。 在使用STM32F103C8实现USB HID功能时,首先需要配置USB接口,并启动USB时钟。 然后,我们需要设置相关的GPIO引脚,作为USB接口的数据线和时钟线,并使能相应的外设时钟。 接下来,我们需要编写代码来初始化USB HID功能,并配置相关的中断处理程序。这些中断处理程序将负责处理来自计算机的请求,并将数据发送回计算机。 在配置完成后,可以通过使用相应的库函数来发送和接收数据。 除了配置和代码编写之外,还需要确保硬件连接正确。例如,使用适当的电阻和电容来连接USB接口引脚,以提供相应的电气特性和防止信号干扰。 总之,STM32F103C8通过其丰富的外设功能,特别是USB HID,为我们提供了一种方便的方式来实现与计算机交互的设备。通过适当的配置和编码,我们可以实现键盘、鼠标等设备的功能,并将其连接到计算机上进行数据传输。 ### 回答2: STM32F103C8是一种集成了USB HID(Human Interface Device,人机接口设备)功能的微控制器。它是STMicroelectronics公司生产的一款基于ARM Cortex-M3内核的单片机。 USB HID是一种常见的USB设备类别,用于与计算机进行人机交互。它允许双向数据传输,使设备能够接收来自计算机的控制命令,并将数据传送回计算机。通过使用USB HID,开发者可以方便地设计和制造各种外部设备,如键盘、鼠标、游戏手柄等。 对于STM32F103C8来说,它的USB HID功能非常容易实现。通过使用相应的软件库和工具,我们可以轻松地编写代码来配置和驱动USB HID。我们可以定义设备的各种功能和特性,例如按键、滚轮、指针等。然后,我们可以将开发板与计算机连接,使其被识别为HID设备。 除了常见的人机交互设备外,STM32F103C8也可以通过USB HID实现其他功能,如数据采集、软件控制等。通过自定义数据报文框架,我们可以自定义设备的报文格式,并将其与计算机进行通信。 总的来说,STM32F103C8为开发者提供了实现USB HID功能的便利性和灵活性。无论是制造HID设备,还是实现其他功能,都可以通过这个微控制器轻松完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值