STM32 USB CDC Работа - PullRequest
       77

STM32 USB CDC Работа

0 голосов
/ 08 мая 2018

Я создал проект с использованием STMCubeMX, который включает драйвер usbd, настроенный как виртуальный com-порт. У меня это работает и могу получать данные через обратный вызов CDC_Receive_FS. Мой вопрос, как называется этот обратный вызов. Это делается на уровне прерывания, или есть какой-то другой механизм. В частности, если я хочу скопировать данные из буфера обратного вызова в очередь, которая будет считываться моим основным кодом, нужна ли мне некоторая защита для параллелизма (например, отключение прерываний)?

Спасибо.

1 Ответ

0 голосов
/ 08 мая 2018

Вызывается из 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 вне прерываний.

...