STM32使用回调来从USB CDC VCP中检索数据

时间:2017-04-10 12:26:28

标签: arm usb stm32 hal

我已经使用CubeMX和HAL为USB CDC VCP生成了一个项目,现在我试图弄清楚如何实现这两个弱函数:

void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)

这些功能将在HAL_PCD_IRQHandler中调用。我想要做的是在其中放置一些代码,这样我就可以从主机中检索收到的数据,并找出交易结束。

我已经看到CubeMX在usbd_conf.c中重新实现了这些弱函数,如下所示:

    /**
  * @brief  Data Out stage callback.
  * @param  hpcd: PCD handle
  * @param  epnum: Endpoint Number
  * @retval None
  */
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
{
  USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff);
}

/**
  * @brief  Data In stage callback..
  * @param  hpcd: PCD handle
  * @param  epnum: Endpoint Number
  * @retval None
  */
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
{
  USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
}

我想知道这两个函数(USBD_LL_DataOutStage和USBD_LL_DataInStage)做了什么?以及如何编辑它们以实现我的目标。

1 个答案:

答案 0 :(得分:0)

我在STM32Cube_FW_L4_V1.10.0中遇到了相同的问题,在查看了此问题之后,其他一些讨论决定解决此问题,方法是用替代实现替换CDC DataIn处理程序,该实现向CDC_TransmitReady_CB()添加调用以唤醒传输任务:

// Modified CDC DataIn handler to invoke a callback (CDC_TransmitReady_CB) on TX ready
uint8_t altDataInHandler(USBD_HandleTypeDef *pdev, uint8_t epnum) {
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;
  if (hcdc == NULL) return USBD_FAIL;
  hcdc->TxState = 0;
  CDC_TransmitReady_CB();
  return USBD_OK;
}

void hackCdcClass() {
  USBD_CDC.DataIn = altDataInHandler;
} 

丑陋,但它就像一种魅力。