Embedded STM32 USB CDC接收中断

Embedded STM32 USB CDC接收中断,embedded,stm32,stm32f4discovery,stm32f4,nucleo,Embedded,Stm32,Stm32f4discovery,Stm32f4,Nucleo,我已经在STM32-F446re(核子)上实现了USB CDC(VCP)。我在循环中使用int8\u t CDC\u Receive\u FS(uint8\u t*Buf,uint32\u t*Len)来接收数据。但是很多数据也被发送过来,因此我希望基于接收中断 有人能帮我理解如何设置USB CDC Rx中断吗?如评论所述,CDC\u Receive\u FS是USB堆栈中断处理程序调用的回调,它已经在中断上下文中运行。您不应该在循环中调用它-它由堆栈调用,您需要实现函数来处理数据 实现可能如下

我已经在STM32-F446re(核子)上实现了USB CDC(VCP)。我在循环中使用
int8\u t CDC\u Receive\u FS(uint8\u t*Buf,uint32\u t*Len)
来接收数据。但是很多数据也被发送过来,因此我希望基于接收中断


有人能帮我理解如何设置USB CDC Rx中断吗?

如评论所述,
CDC\u Receive\u FS
是USB堆栈中断处理程序调用的回调,它已经在中断上下文中运行。您不应该在循环中调用它-它由堆栈调用,您需要实现函数来处理数据

实现可能如下所示:

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
    // Process Len bytes from Buf
    YOUR_CODE_HERE

    // Set the RX buffer
    USBD_CDC_SetRxBuffer(hUsbDevice_0, &Buf[0]);
    
    // Ready to receive the next packet
    USBD_CDC_ReceivePacket(hUsbDevice_0);

    return USBD_OK ;
}
然后在
您的\u code\u这里要做的最明显的事情是将数据放入FIFO队列或环形缓冲区,然后在主线程上下文中使用。或者,如果您正在使用RTOS,请将数据放入队列中,以便在任务上下文中进行处理


关键的是,您应该抓取数据并尽快返回,因为在您这样做之前,进一步的数据将被阻止,而且这是一个中断上下文,因此您不想闲逛-对于ISR IMO来说,ST代码已经有点重了。在他们早期(STM32Cube之前)的USB库中,我将整个堆栈移动到了一个RTOS任务中,因此,ISR只是触发了任务接收到的事件。这对于防止时间关键型任务因USB中断而延迟是必要的。

如果未调用USBD\u CDC\u ReceivePacket且端点fifo已满,控制器将自动向主机发送NAK。不幸的是,STM HAL锁定传输直到发生这种情况。因此,您可以将指针和长度保存在某个变量中,从CDC_Receive_FS返回,并在硬件/fifo/队列准备就绪时调用USBD_CDC_ReceivePacket,但在调用USBD_CDC_ReceivePacket之前,Tx是锁定的。

它已经是基于中断的,此函数是一个回调函数。只需使用数据即可。