我已经使用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)做了什么?以及如何编辑它们以实现我的目标。
答案 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;
}
丑陋,但它就像一种魅力。