【发布时间】:2017-09-05 11:52:46
【问题描述】:
我已经使用 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)是做什么的?以及如何编辑它们以实现我的目标。
【问题讨论】:
-
我不是 STM32 专家,但根据我的经验,我相信您应该使用的功能位于
usbd_cdc_if.c。在该文件中,您将找到函数CDC_Receive_FS和CDC_Transmit_FS。我相信这些是在大多数情况下将您的自定义代码添加到 USB 堆栈之上的要点。你看到那些功能了吗? -
@user2027202827:您提到的这两个功能是向您展示如何实现它们的示例。它们可用于提取和发送数据。我上面提到的函数是用于操作完成时的中断回调。
-
您介意我问使用这些特定功能的动机是什么,而不是 CubeMX 为您生成的界面?
-
@user2027202827,CubeMX 只生成初始化。您可以在 usbd_cdc_if 中找到的这些功能只是您可以使用它们的一些示例,但建议您改进它们。而且我的应用程序对时间要求很高,因此我应该使用中断而不是拉取寄存器或变量来找出操作的结束。
-
感谢您回答我的问题 :) 抱歉,我对您的帮助不大。我假设您已经阅读了 USB 堆栈的设备库手册?