微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 基于STM32CubeMX生成HID双向通讯工程的说明

基于STM32CubeMX生成HID双向通讯工程的说明

时间:09-21 来源:互联网 点击:
数据发送
  就类似串口通讯,我们首先做一个数据的发送工作。
  在Main.c文件中,我们在while(1)的主循环中增加我们的发送函数,主要就是调用发送报文的
  API:USBD_CUSTOM_HID_SendReport()
  /* USER CODE BEGIN 2 */
  uint8_t i=0;
  sendbuffer[0]=0x07; //这个是report ID,每次发送报文都需要以这个为开始,这样主机才能正确//解析后边的数据含义
  sendbuffer[1]=0x01; //这个是实际发送的数据,可以自由定义,只要不超过报文描述符的限制
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  HAL_Delay(100); //延迟100ms
  sendbuffer[1]++; //每次发送都将变量自加1
  USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,sendbuffer,2);//发送报文
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  编译后下载到MCU内,连接上位机软件即可看到如下所示的进度条在不断的增长。
  


  这个就是我们上传到的数据在上位机的图形显示,你也可以看Input/outputtransfer里的数据变化。
  


  这样看起来是不是更像是串口调试助手了?嘿嘿本来机制就差不多的。
  数据接收
  MCU的USB数据是如何接收的呢?是不是调用一个类似于串口接收的API呢?
  不是的!USB的数据接收都是在中断中完成的,在新建的工程中,我们在函数CUSTOM_HID_OutEvent_FS内增加如下代码。
  static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
  {
  /* USER CODE BEGIN 6 */switch(event_idx)
  {
  case 1: /* LED3 */
  (state == 1) ?HAL_GPIO_WritePin(LD3_GPIO_Port,LD3_Pin,GPIO_PIN_SET) :
  HAL_GPIO_WritePin(LD3_GPIO_Port,LD3_Pin,GPIO_PIN_RESET);
  break;
  case 2: /* LED4 */
  (state == 1) ?HAL_GPIO_WritePin(LD4_GPIO_Port,LD4_Pin,GPIO_PIN_SET) :
  HAL_GPIO_WritePin(LD4_GPIO_Port,LD4_Pin,GPIO_PIN_RESET);
  break;
  case 3: /* LED5 */
  (state == 1) ?HAL_GPIO_WritePin(LD5_GPIO_Port,LD5_Pin,GPIO_PIN_SET) :
  HAL_GPIO_WritePin(LD5_GPIO_Port,LD5_Pin,GPIO_PIN_RESET);
  break;
  case 4: /* LED6 */
  (state == 1) ?HAL_GPIO_WritePin(LD6_GPIO_Port,LD6_Pin,GPIO_PIN_SET) :
  HAL_GPIO_WritePin(LD6_GPIO_Port,LD6_Pin,GPIO_PIN_RESET);
  break;
  default:
  break;
  }
  return (0);
  /* USER CODE END 6 */
  }
  编译之后下载到MCU内,通过USB USER连接到PC端,打开Usb HidDemonstrator,我们可以通过勾选右下角的图形界面来实现控制开发板上的LED电量或者关闭。
  


  当然,这个是通过图像化的界面来进行控制,你也可以通过Input/outputtransfer中的写入对话框来完成这个操作。注意,写入的第一个字节是ID,表示你想控制的是哪个LED;第二个字节是0或者是1,表示你想让这个LDE的状态变成灭还是亮。
  


  总结:
  本范例程序是为了快速实现USB 从机设备与主句设备双向通讯目的,其初始化代码是用STM32CubeMX来生成的,大大降低了工程师开发USB设备的难度(尤其是是入门阶段的难度)。从这个工程的基础上,工程师可以比较方便的建立好框架工程并,对其中的代码进行研究,进而移植或增加自己的应用代码。
                                
                                                               
                                
               

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top