Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm STM32使用回调从USB CDC VCP检索数据_Arm_Usb_Stm32_Hal - Fatal编程技术网

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

Arm STM32使用回调从USB CDC VCP检索数据,arm,usb,stm32,hal,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和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_dataoutage和USBD_LL_DataInStage)是做什么的?我在STM32Cube_FW_L4_V1.10.0中遇到了同样的问题,在看了这一点和其他一些讨论之后,我决定通过使用另一个实现替换CDC DataIn处理程序来解决这个问题,该实现添加了对CDC_Transmitedy_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;
} 

丑陋,但它很有魅力。

我不是STM32专家,但根据我的经验,我相信您应该使用的功能位于
usbd\u cdc\u if.c
中。在该文件中,可以找到函数
CDC\u Receive\u FS
CDC\u Transmit\u FS
。我相信在大多数情况下,这些都是在USB堆栈上添加自定义代码的要点。你看到那些函数了吗?@user2027202827:你提到的这两个函数就是示例,向你展示了如何实现它们。它们可以用来拉取和发送数据。我提到的功能是在操作完成时用于中断中的回调。您介意我问一下,使用这些特定函数而不是CubeMX为您生成的接口的动机是什么吗?@user2027202827,CubeMX只生成初始化。您可以在usbd_cdc_中找到这些函数,如果它们只是一些示例,您可以使用它们,但建议您改进它们。而且我的应用程序是时间关键型的,因此我应该使用中断而不是提取寄存器或变量来找出操作的结束。好的,谢谢你回答我的问题:)对不起,我对你的帮助不大。我假设您已经阅读了USB堆栈的设备库手册?