搜索
bottom↓
回复: 21

分享stm32f042f6p6 USB HID改BULK传输程序

  [复制链接]

出0入0汤圆

发表于 2018-1-6 10:46:04 | 显示全部楼层 |阅读模式
本帖最后由 mii 于 2018-1-6 10:48 编辑

近期项目有用STM32F042F6P6做了简单的控制,后来需要扩展功能。随带做了USB的功能测试。

晶振使用外置的8M,当然可以使用内部48MRC。其他就是直接USB连接,做回环测试。

好了,废话不说,先上程序


下面开始修改
1.首先使用STM32CubeMX生成可用的HID程序。看图配置


2.生成的程序打开后,打开usbd_conf.h,新增端点定义

  1. /*
  2. *   endpoint 0x80 and 0x00 are used for enumerating device.
  3. *   endpoint 0x81 and 0x80 are used for control xfer.
  4. */
  5. #define HID_IN_EP                    0x81
  6. #define HID_OUT_EP                   0x01 //使用端点1

  7. #define HID_IN_BULK_PACKET           64 //按照协议,FS模式下最大就64个字节
  8. #define HID_OUT_BULK_PACKET          64
复制代码


3.打开usbd_desc.h修改VIP,PID。这个最好修改了不然又是识别为HID设备。
对应的驱动生成,可以使用libusb提供的工具。使用方法自行查找。

  1. /** @defgroup USBD_DESC_Private_Defines
  2.   * @{
  3.   */
  4. #define USBD_VID     0x0483//1155
  5. #define USBD_LANGID_STRING     1033
  6. #define USBD_MANUFACTURER_STRING     "STMicroelectronics"
  7. #define USBD_PID_FS     0x5710//22315
  8. #define USBD_PRODUCT_STRING_FS     "STM32 Human interface"
  9. #define USBD_SERIALNUMBER_STRING_FS     "00000000001A"
  10. #define USBD_CONFIGURATION_STRING_FS     "HID Config"
  11. #define USBD_INTERFACE_STRING_FS     "HID Interface"
复制代码


4..打开usbd_desc.c开始修改描述符,首先修改设备描述符USBD_FS_DeviceDesc
bDeviceClass 修改为0xff,为自定义设备


5.打开usbd_hid.c,修改配置,接口,端口等描述符,直接上代码

其中描述符的长度要修改一下,就是其中的  USB_HID_CONFIG_DESC_SIZ = 36;

  1. /* USB HID device Configuration Descriptor */
  2. __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ]  __ALIGN_END =
  3. {
  4.   0x09, /* bLength: Configuration Descriptor size */
  5.   USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
  6.   USB_HID_CONFIG_DESC_SIZ,
  7.   /* wTotalLength: Bytes returned */
  8.   0x00,
  9.   0x01,         /*bNumInterfaces: 1 interface*/
  10.   0x01,         /*bConfigurationValue: Configuration value*/
  11.   0x00,         /*iConfiguration: Index of string descriptor describing
  12.   the configuration*/
  13.   0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */
  14.   0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
  15.   
  16.   /************** Descriptor of Joystick Mouse interface ****************/
  17.   /* 09 */
  18.   0x09,         /*bLength: Interface Descriptor size*/
  19.   USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
  20.   0x00,         /*bInterfaceNumber: Number of Interface*/
  21.   0x00,         /*bAlternateSetting: Alternate setting*/
  22.   0x02,         /*bNumEndpoints*/
  23.   0x00,         /*bInterfaceClass: HID*/
  24.   0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  25.   0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  26.   0,            /*iInterface: Index of string descriptor*/
  27. //  /******************** Descriptor of Joystick Mouse HID ********************/
  28. //  /* 18 */
  29. //  0x09,         /*bLength: HID Descriptor size*/
  30. //  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
  31. //  0x11,         /*bcdHID: HID Class Spec release number*/
  32. //  0x01,
  33. //  0x00,         /*bCountryCode: Hardware target country*/
  34. //  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
  35. //  0x22,         /*bDescriptorType*/
  36. //  HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  37. //  0x00,
  38.   /******************** Descriptor of Mouse endpoint ********************/
  39.   /* 18 */
  40.   0x07,          /*bLength: Endpoint Descriptor size*/
  41.   USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
  42.   
  43.   HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
  44.   0x02,          /*bmAttributes: bulk endpoint*/
  45.   HID_IN_BULK_PACKET, /*wMaxPacketSize: 64 Byte max */
  46.   0x00,
  47.   HID_FS_BINTERVAL,          /*bInterval: Polling Interval (10 ms)*/
  48.   /* 25 */
  49.         0x07,          /*bLength: Endpoint Descriptor size*/
  50.   USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
  51.   
  52.   HID_OUT_EP,     /*bEndpointAddress: Endpoint Address (OUT)*/
  53.   0x02,          /*bmAttributes: bulk endpoint*/
  54.   HID_OUT_BULK_PACKET, /*wMaxPacketSize: 64 Byte max */
  55.   0x00,
  56.   HID_FS_BINTERVAL,          /*bInterval: Polling Interval (10 ms)*/
  57.         /* 32 */
  58. } ;
复制代码


6.初始化端点与接收缓冲,USB_Rx_Buffer为自己定义接收缓冲区大小 为64个字节
  1. /**
  2.   * @brief  USBD_HID_Init
  3.   *         Initialize the HID interface
  4.   * @param  pdev: device instance
  5.   * @param  cfgidx: Configuration index
  6.   * @retval status
  7.   */
  8. static uint8_t  USBD_HID_Init (USBD_HandleTypeDef *pdev,
  9.                                uint8_t cfgidx)
  10. {
  11.   uint8_t ret = 0;
  12.   
  13.   /* Open EP IN */
  14.   USBD_LL_OpenEP(pdev,
  15.                  HID_IN_EP,
  16.                  USBD_EP_TYPE_BULK,
  17.                  HID_IN_BULK_PACKET);  
  18.        
  19.         /* Open EP OUT */
  20.   USBD_LL_OpenEP(pdev,
  21.                  HID_OUT_EP,
  22.                  USBD_EP_TYPE_BULK,
  23.                  HID_OUT_BULK_PACKET);  
  24.        
  25.                 /* Prepare Out endpoint to receive next packet */                       
  26.         USBD_LL_PrepareReceive(pdev,
  27.                  HID_OUT_EP,
  28.                  (uint8_t*)(USB_Rx_Buffer),
  29.                  HID_OUT_BULK_PACKET);        
  30.        
  31.   
  32.   pdev->pClassData = USBD_malloc(sizeof (USBD_HID_HandleTypeDef));
  33.   
  34.   if(pdev->pClassData == NULL)
  35.   {
  36.     ret = 1;
  37.   }
  38.   else
  39.   {
  40.     ((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE;
  41.   }
  42.   return ret;
  43. }
复制代码


7.同时也设置一下重置函数
  1. /**
  2.   * @brief  USBD_HID_Init
  3.   *         DeInitialize the HID layer
  4.   * @param  pdev: device instance
  5.   * @param  cfgidx: Configuration index
  6.   * @retval status
  7.   */
  8. static uint8_t  USBD_HID_DeInit (USBD_HandleTypeDef *pdev,
  9.                                  uint8_t cfgidx)
  10. {
  11.   /* Close HID EPs */
  12.   USBD_LL_CloseEP(pdev,
  13.                   HID_IN_EP);
  14.         /* Close HID EPs */
  15.   USBD_LL_CloseEP(pdev,
  16.                   HID_OUT_EP);

  17.   
  18.   /* FRee allocated memory */
  19.   if(pdev->pClassData != NULL)
  20.   {
  21.     USBD_free(pdev->pClassData);
  22.     pdev->pClassData = NULL;
  23.   }
  24.   
  25.   return USBD_OK;
  26. }
复制代码

8.新增out函数,先声明
static uint8_t  USBD_HID_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum);
然后注册一下
  1. /** @defgroup USBD_HID_Private_Variables
  2.   * @{
  3.   */

  4. USBD_ClassTypeDef  USBD_HID =
  5. {
  6.   USBD_HID_Init,
  7.   USBD_HID_DeInit,
  8.   USBD_HID_Setup,
  9.   NULL, /*EP0_TxSent*/  
  10.   NULL, /*EP0_RxReady*/
  11.   USBD_HID_DataIn, /*DataIn*/
  12.   USBD_HID_DataOut, /*DataOut*/
  13.   NULL, /*SOF */
  14.   NULL,
  15.   NULL,      
  16.   USBD_HID_GetCfgDesc,
  17.   USBD_HID_GetCfgDesc,
  18.   USBD_HID_GetCfgDesc,
  19.   USBD_HID_GetDeviceQualifierDesc,
  20. };
复制代码

再然后就是在里面实现回环
  1. /**
  2.   * @brief  USBD_HID_DataIn
  3.   *         handle data IN Stage
  4.   * @param  pdev: device instance
  5.   * @param  epnum: endpoint index
  6.   * @retval status
  7.   */
  8. static uint8_t  USBD_HID_DataOut(USBD_HandleTypeDef *pdev,
  9.                               uint8_t epnum)
  10. {
  11.   
  12.   uCountRXbuff = USBD_GetRxCount(pdev,epnum);

  13.     // add your own data to process the received data
  14.     /*   
  15.     *    printf_the_received_data((char *)USB_Rx_Buffer, USB_Rx_Cnt);
  16.     */

  17.   /* Prepare Out endpoint to receive next packet */
  18.     USBD_LL_PrepareReceive(pdev,
  19.                        HID_OUT_EP,
  20.                        (uint8_t*)(USB_Rx_Buffer),
  21.                        HID_OUT_BULK_PACKET);
  22.        
  23.         USBD_HID_SendReport (pdev,
  24.                  (uint8_t*)&USB_Rx_Buffer,
  25.                  uCountRXbuff);
  26.        
  27.         return USBD_OK;
  28. }
复制代码


9.基本完成了,然后打开usbd_conf.c,新增OUT缓冲地址,分配 64个字节
  1. /**
  2.   * @brief  Initializes the Low Level portion of the Device driver.
  3.   * @param  pdev: Device handle
  4.   * @retval USBD Status
  5.   */
  6. USBD_StatusTypeDef  USBD_LL_Init (USBD_HandleTypeDef *pdev)
  7. {
  8.   /* Init USB_IP */
  9.   /* Link The driver to the stack */
  10.   hpcd_USB_FS.pData = pdev;
  11.   pdev->pData = &hpcd_USB_FS;

  12.   hpcd_USB_FS.Instance = USB;
  13.   hpcd_USB_FS.Init.dev_endpoints = 8;
  14.   hpcd_USB_FS.Init.speed = PCD_SPEED_FULL;
  15.   hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_64;
  16.   hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
  17.   hpcd_USB_FS.Init.low_power_enable = DISABLE;
  18.   hpcd_USB_FS.Init.lpm_enable = DISABLE;
  19.   hpcd_USB_FS.Init.battery_charging_enable = DISABLE;
  20.   if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK)
  21.   {
  22.     _Error_Handler(__FILE__, __LINE__);
  23.   }

  24.   HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18);
  25.   HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58);
  26.   HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x100);
  27.         HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0x140);   
  28.   return USBD_OK;
  29. }
复制代码


10.编译下载,你就可以测试了。测试使用了bus hound


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
头像被屏蔽

出0入0汤圆

发表于 2018-1-6 11:19:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入13汤圆

发表于 2018-1-6 11:31:07 | 显示全部楼层
不错,写得挺详细的

出0入0汤圆

发表于 2018-1-6 14:29:31 | 显示全部楼层
不错,不错,谨收藏先

~~~~~~~~~~

出0入0汤圆

发表于 2018-1-6 18:08:47 | 显示全部楼层
收藏了 mark usb

出0入0汤圆

发表于 2018-1-6 18:44:36 | 显示全部楼层
mark.......

出100入101汤圆

发表于 2018-1-7 15:53:15 | 显示全部楼层
收藏,USB搞过,但后来就忘了

出0入0汤圆

发表于 2018-1-7 18:14:42 | 显示全部楼层
请问楼主,STM32CubeMX默认生成的代码,使用者不修改任何地方,接着编译烧录、USB电缆连接到PC后,PC能识别到该USB设备吗?
还是说,必须需要修改才能识别到?

出0入0汤圆

 楼主| 发表于 2018-1-8 09:18:03 | 显示全部楼层
ANHOME 发表于 2018-1-7 18:14
请问楼主,STM32CubeMX默认生成的代码,使用者不修改任何地方,接着编译烧录、USB电缆连接到PC后,PC能识别 ...

生成就可以识别为HID设备,网上有例程,修改一下就可以变成鼠标了,传送门http://blog.csdn.net/xqhrs232/article/details/77740508

出0入0汤圆

发表于 2018-1-10 13:02:51 | 显示全部楼层
这个必须收藏,好东西。USB HID改BULK

出0入45汤圆

发表于 2018-7-13 18:06:26 | 显示全部楼层
好东西,顶一下。USB HID改BULK

出0入0汤圆

发表于 2018-9-17 21:52:26 | 显示全部楼层
厉害了,收藏收藏
头像被屏蔽

出0入0汤圆

发表于 2018-9-18 17:04:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入8汤圆

发表于 2019-5-20 13:43:47 | 显示全部楼层
照着操作一遍, 打开bus houd 抓包没效果啊

出0入0汤圆

发表于 2019-5-27 12:23:58 | 显示全部楼层
不错,先收下。。。

出0入0汤圆

 楼主| 发表于 2019-5-27 14:13:34 | 显示全部楼层
justdomyself 发表于 2019-5-20 13:43
照着操作一遍, 打开bus houd 抓包没效果啊

您先生成工程后编译下载,能识别HID才进行修改

出0入8汤圆

发表于 2019-5-28 10:57:28 | 显示全部楼层
mii 发表于 2019-5-27 14:13
您先生成工程后编译下载,能识别HID才进行修改

您的bulk传输速度能够到多少?是不是必需帧大小都是64字节,一秒钟多少帧?

出0入0汤圆

 楼主| 发表于 2019-5-28 11:35:59 | 显示全部楼层
justdomyself 发表于 2019-5-28 10:57
您的bulk传输速度能够到多少?是不是必需帧大小都是64字节,一秒钟多少帧? ...

没测试,不会写上位机。大小必须是64,这是协议规定的

出0入8汤圆

发表于 2019-5-28 11:45:01 | 显示全部楼层


我这里有个c#版本的你看能不能用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2021-9-11 17:25:18 | 显示全部楼层
能突破64K吗。  现在我们项目至少需要500K字节/秒。   用什么传输更好

出0入8汤圆

发表于 2021-9-12 09:15:26 | 显示全部楼层
zengxianqian 发表于 2021-9-11 17:25
能突破64K吗。  现在我们项目至少需要500K字节/秒。   用什么传输更好

那么快的速度上以太网

出100入312汤圆

发表于 2021-9-12 09:42:36 来自手机 | 显示全部楼层
不错,学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-29 01:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表