STM32
直播中

贾埃罗

8年用户 1802经验值
私信 关注
[问答]

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

对比了两个系列里MiddlewaresSTSTM32_USB_Device_LibraryClass路径下实现的代码差异,哪个系列写的更全面?像MSC的USBD_MSC_Setup函数

USB_REQ_CLEAR_FEATURE请求里
F4实现的比较简单

  •    case USB_REQ_CLEAR_FEATURE:
  •       if (pdev->dev_state == USBD_STATE_CONFIGURED)
  •       {
  •         if (req->wValue == USB_FEATURE_EP_HALT)
  •         {
  •           /* Flush the FIFO */
  •           (void)USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex);

  •           /* Handle BOT error */
  •           MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
  •         }
  •       }
  •       break;

F3实现的比较复杂

  •        case USB_REQ_CLEAR_FEATURE:

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

  •           /* Reactivate the EP */
  •           USBD_LL_CloseEP(pdev, (uint8_t)req->wIndex);
  •           if ((((uint8_t)req->wIndex)   0x80U) == 0x80U)
  •           {
  •             pdev->ep_in[(uint8_t)req->wIndex   0xFU].is_used = 0U;
  •             if (pdev->dev_speed == USBD_SPEED_HIGH)
  •             {
  •               /* Open EP IN */
  •               USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK,
  •                              MSC_MAX_HS_PACKET);
  •             }
  •             else
  •             {
  •               /* Open EP IN */
  •               USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK,
  •                              MSC_MAX_FS_PACKET);
  •             }
  •             pdev->ep_in[MSC_EPIN_ADDR   0xFU].is_used = 1U;
  •           }
  •           else
  •           {
  •             pdev->ep_out[(uint8_t)req->wIndex   0xFU].is_used = 0U;
  •             if (pdev->dev_speed == USBD_SPEED_HIGH)
  •             {
  •               /* Open EP OUT */
  •               USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK,
  •                              MSC_MAX_HS_PACKET);
  •             }
  •             else
  •             {
  •               /* Open EP OUT */
  •               USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK,
  •                              MSC_MAX_FS_PACKET);
  •             }
  •             pdev->ep_out[MSC_EPOUT_ADDR   0xFU].is_used = 1U;
  •           }

  •           /* Handle BOT error */
  •           MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
  •           break;

另外还有MSC_BOT_Abort函数
F4实现的是:

  • static void  MSC_BOT_Abort(USBD_HandleTypeDef *pdev)
  • {
  •   USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;

  •   if ((hmsc->cbw.bmFlags == 0U)
  •       (hmsc->cbw.dDataLength != 0U)
  •       (hmsc->bot_status == USBD_BOT_STATUS_NORMAL))
  •   {
  •     (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
  •   }

  •   (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);

  •   if (hmsc->bot_status == USBD_BOT_STATUS_ERROR)
  •   {
  •     (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);
  •     (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
  •   }
  • }

F3实现的是

  • static void  MSC_BOT_Abort(USBD_HandleTypeDef  *pdev)
  • {
  •   USBD_MSC_BOT_HandleTypeDef  *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;

  •   if ((hmsc->cbw.bmFlags == 0U)
  •       (hmsc->cbw.dDataLength != 0U)
  •       (hmsc->bot_status == USBD_BOT_STATUS_NORMAL))
  •   {
  •     USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
  •   }

  •   USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);

  •   if (hmsc->bot_status == USBD_BOT_STATUS_ERROR)
  •   {
  •        USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *) hmsc->cbw,
  •                            USBD_BOT_CBW_LENGTH);
  •   }
  • }

还有其他的函数就不一一举例了,不明白为什么写的不一样?


回帖(1)

刘丽丽

2024-3-25 15:58:55
STM32F3系列与STM32F4系列的USB驱动代码存在差异是正常的,二者是两个不同的USB IP。

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

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

两个驱动库也不能简单说哪个更全面来概括,应该说各个驱动跟各自硬件相匹配。 
举报

更多回帖

发帖
×
20
完善资料,
赚取积分