请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F3系列和STM32F4系列的USB库Class应用层代码差异

[复制链接]
huahuahnu 提问时间:2022-9-23 16:46 / 未解决
对比了两个系列里Middlewares\ST\STM32_USB_Device_Library\Class路径下实现的代码差异,哪个系列写的更全面?像MSC的USBD_MSC_Setup函数

USB_REQ_CLEAR_FEATURE请求里
F4实现的比较简单
  1.    case USB_REQ_CLEAR_FEATURE:
  2.       if (pdev->dev_state == USBD_STATE_CONFIGURED)
  3.       {
  4.         if (req->wValue == USB_FEATURE_EP_HALT)
  5.         {
  6.           /* Flush the FIFO */
  7.           (void)USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex);

  8.           /* Handle BOT error */
  9.           MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
  10.         }
  11.       }
  12.       break;
复制代码
F3实现的比较复杂
  1.        case USB_REQ_CLEAR_FEATURE:

  2.           /* Flush the FIFO and Clear the stall status */
  3.           USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex);

  4.           /* Reactivate the EP */
  5.           USBD_LL_CloseEP(pdev, (uint8_t)req->wIndex);
  6.           if ((((uint8_t)req->wIndex) & 0x80U) == 0x80U)
  7.           {
  8.             pdev->ep_in[(uint8_t)req->wIndex & 0xFU].is_used = 0U;
  9.             if (pdev->dev_speed == USBD_SPEED_HIGH)
  10.             {
  11.               /* Open EP IN */
  12.               USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK,
  13.                              MSC_MAX_HS_PACKET);
  14.             }
  15.             else
  16.             {
  17.               /* Open EP IN */
  18.               USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK,
  19.                              MSC_MAX_FS_PACKET);
  20.             }
  21.             pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U;
  22.           }
  23.           else
  24.           {
  25.             pdev->ep_out[(uint8_t)req->wIndex & 0xFU].is_used = 0U;
  26.             if (pdev->dev_speed == USBD_SPEED_HIGH)
  27.             {
  28.               /* Open EP OUT */
  29.               USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK,
  30.                              MSC_MAX_HS_PACKET);
  31.             }
  32.             else
  33.             {
  34.               /* Open EP OUT */
  35.               USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK,
  36.                              MSC_MAX_FS_PACKET);
  37.             }
  38.             pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U;
  39.           }

  40.           /* Handle BOT error */
  41.           MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
  42.           break;
复制代码





另外还有MSC_BOT_Abort函数
F4实现的是:
  1. static void  MSC_BOT_Abort(USBD_HandleTypeDef *pdev)
  2. {
  3.   USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;

  4.   if ((hmsc->cbw.bmFlags == 0U) &&
  5.       (hmsc->cbw.dDataLength != 0U) &&
  6.       (hmsc->bot_status == USBD_BOT_STATUS_NORMAL))
  7.   {
  8.     (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
  9.   }

  10.   (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);

  11.   if (hmsc->bot_status == USBD_BOT_STATUS_ERROR)
  12.   {
  13.     (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);
  14.     (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
  15.   }
  16. }
复制代码
F3实现的是
  1. static void  MSC_BOT_Abort(USBD_HandleTypeDef  *pdev)
  2. {
  3.   USBD_MSC_BOT_HandleTypeDef  *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;

  4.   if ((hmsc->cbw.bmFlags == 0U) &&
  5.       (hmsc->cbw.dDataLength != 0U) &&
  6.       (hmsc->bot_status == USBD_BOT_STATUS_NORMAL))
  7.   {
  8.     USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
  9.   }

  10.   USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);

  11.   if (hmsc->bot_status == USBD_BOT_STATUS_ERROR)
  12.   {
  13.        USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw,
  14.                            USBD_BOT_CBW_LENGTH);
  15.   }
  16. }
复制代码
还有其他的函数就不一一举例了,不明白为什么写的不一样?

收藏 评论2 发布时间:2022-9-23 16:46

举报

2个回答
xmshao 回答时间:2022-9-26 13:41:42
STM32F3系列与STM32F4系列的USB驱动代码存在差异是正常的,二者是两个不同的USB IP。


F3系列内置的USB只能做单纯的全速device,而F4系列是支持OTG的,即可以做DEVICE或MASTER,


也支持全速或高速。


硬件上也有诸多不同,相应的驱动不一样就不难理解了。


两个驱动库 也不能简单说哪个更全面来概括,应该说各个驱动跟各自硬件相匹配。
huahuahnu 回答时间:2022-9-30 17:02:50
xmshao 发表于 2022-9-26 13:41
STM32F3系列与STM32F4系列的USB驱动代码存在差异是正常的,二者是两个不同的USB IP。

刚开始接触USB,如果说的有误请指正,我的理解底层实现肯定是不一样的,但应用层的实现应该没什么差异才对,像MSC里usbd_msc_data.c里定义的数组值也不一样,另外F4系列有SCSI_Read12函数,F3系列没有
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版