STM32 USB CDC Rx 中断

3
我在STM32-F446re(Nucleo)上实现了USB CDC(VCP)。我正在使用int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)来循环接收数据。但是还有很多数据被发送过来,因此我希望可以基于接收中断进行数据接收。
请问有人可以帮助我了解如何设置USB CDC Rx中断吗?

它已经基于中断,并且这个函数是一个回调函数。只需消耗数据即可。 - undefined
2个回答

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 ;
}

YOUR_CODE_HERE处,最明显的做法是将数据放入FIFO队列或环形缓冲区,然后在主线程上下文中消耗。或者,如果您使用RTOS,则将数据放入队列以在任务上下文中处理。
需要关键的是,您应该尽快获取数据并返回,因为在您这样做之前,进一步的数据将被阻止,而且它是一个中断上下文,所以您不希望耽误太久——在我的看法中,ST代码已经有点过于沉重了。在早期(STM32Cube之前)的USB库中,我将整个堆栈移动到了一个RTOS任务中,因此ISR仅触发了由任务接收的事件。这是必要的,以防止时间关键任务被USB中断延迟。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接