繁体   English   中英

STM32 USB CDC操作

[英]STM32 USB CDC Operation

我使用STMCubeMX创建了一个项目,该项目包括配置为虚拟com端口的usbd驱动程序。 我有它的工作,可以通过CDC_Receive_FS回调接收数据。 我的问题是如何调用此回调。 是在中断级别完成的,还是有其他机制。 特别是,如果我要将数据从回调缓冲区复制到将由我的主代码读取的队列中,是否需要一些并发保护(例如,禁用中断)?

谢谢。

它是从ISR调用的。 (中断服务程序)

最有可能从以下位置调用它:

OTG_HS_IRQHandler.  

(中间有多个功能级别)。

这是断点内我的堆栈的副本。

CDC_Receive_HS() at usbd_cdc_if.c:456 0x801c758 
USBD_CDC_DataOut() at usbd_cdc.c:699 0x8031592  
USBD_LL_DataOutStage() at usbd_core.c:331 0x80318aa 
HAL_PCD_DataOutStageCallback() at usbd_conf.c:249 0x801e486 
HAL_PCD_IRQHandler() at stm32f7xx_hal_pcd.c:359 0x802d264   
OTG_HS_IRQHandler() at stm32f7xx_it.c:288 0x801ab74 

您很可能不需要禁用其他中断,只需将数据复制到另一个缓冲区即可。 我相信它使用的缓冲区仅应由usb接收使用。 将数据复制到单独的缓冲区。 在此中断之外使用新缓冲区时,将需要并发保护。

如果您使用的是FreeRTOS,建议您将“ xQueue”类型用作缓冲区。 这是线程安全的。 您可以在中断内部使用xQueueSendToBackFromISR,并在中断外部使用xQueueSendToBack。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM