STM32 USB CDC Rx 中断

Sch*_*r95 3 embedded stm32 stm32f4discovery stm32f4 nucleo

我已经在STM32-F446re(Nucleo)上实现了USB CDC (VCP)。我正在使用int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)in 循环来接收数据。但是很多数据也被发送过来,因此我想要基于接收中断。

谁能帮我了解如何设置 USB CDC Rx 中断?

Cli*_*ord 5

正如所评论的,CDC_Receive_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 ;
}
Run Code Online (Sandbox Code Playgroud)

那么最明显的事情YOUR_CODE_HERE就是将数据放入 FIFO 队列或环形缓冲区,然后在主线程上下文中使用。或者,如果您使用 RTOS,则将数据放入队列中以便在任务上下文中进行处理。

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