STM32-USB:USB复合设备使用时的一些注意事项

一、注意事项

相关STM32 USB的内容,可以查看一下我之前写的USB系列的文章。本文只讲述一些,本人在USB项目中遇到的一些问题以及解决方案

问题点1:MSC与HID设备复合之后,直接使用USBD_HID_SendReport不能直接发送的原因以及解决方法

  在MSC与HID的复合设备执行初始化的时候,会执行对应 USBD_HID_Init 与 USBD_MSC_Init 的初始化函数。这些个初始化函数的作用主要是为HID 与 MSC 分配对应类型的操作句柄(如:USBD_HID_HandleTypeDef 与 USBD_MSC_BOT_HandleTypeDef )并将对应的操作句柄添加到USB设备的操作句柄中( USBD_HandleTypeDef  ) 的 pClassData 。但是由于HID 与 MSC的初始化由分先后,所以最终USB设备中的 pClassData 指向的是最后一个USB设备类型的操作句柄(MSC 或者 HID 的操作句柄),这样的原因导致在使用USBD_HID_SendReport的时候,并不能获取到真正HID操作句柄,因此没办反判断正确的 hhid->state ,所以导致无法发送报文。

  解决方法:

  1. 分别创建HID 与 MSC 操作句柄的全局变量,并且将原来USBD_HID_Init 中分配堆空间的操作,改为直接指向对应的全局变量。然后对应DeInit 中将有关堆空间释放的操作给注释掉。
  2. 在复合设备中的DataIn 与 DataOut 以及 其他有关对应类型的数据交互中,需要将 USBD_HandleTypeDef  *pdev->pClassData 指向对应USB类型的全局变量,以及USBD_HandleTypeDef  *pdev->pUserData 指向对应USB类型的用户函数