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