Проц STM32F411RE.
Сгенерил в кубе и собрал в кейле пример виртуального ком-порта (CDC класс). Все работает.
Когда пытаюсь добавить в код вывод отладки через UART, все разваливается.
Просто добавляю в начало обработчика OTG_USB_IRQHandler строку
UARTPrint("\r\n---USB_IRQHandler")
и после этого в терминале вижу бесконечно только эту стоку и само устройство перестает определяться.
Скорость UART 115200.
До этого всегда делал отладку по этому принципу и для silabs и для SAM7, никогда она не мешала.
В STM32 USB имеет какие-то критичные тайм-ауты?
---------- Продолжение ---------------------
Через отладчик выяснил, что USB контроллер завален прерываниями. Например код обработки
CODE
/* Handle Connection event Interrupt */
if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT))
{
HAL_PCD_ConnectCallback(hpcd);
__HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT);
}
Это прерывание сыплется непрерывно.
Дефайн __HAL_PCD_CLEAR_FLAG определен как
CODE
#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__))
Если упростить, получится
CODE
GINTSTS &= 0x40000000;
Но ведь для сброса флага прерывания в него надо записывать "1" ????
Т.е. делать так:
CODE
GINTSTS |= 0x40000000;
И так "сбрасываются" все биты прерываний в регистре GINTSTS.
Как вообще эти примеры оказываются работоспособными???
Сообщение отредактировал Chameleon - Feb 21 2017, 12:18