Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 Bulk+Interrupt
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Atlantis-
Добрый день!
Использую проект Virtual COM port сгенерированный в CubeMX для STM32F429. Немного преобразовал проект, у меня работает один Bulk-out endpoint и один Interrupt-in. Проблема в том, что если я периодически передаю сообщения по Interrupt, используя стандартную функцию
Код
CDC_Transmit_HS(uint8_t* Buf, uint16_t Len)
и одновременно принимаю данные по Bulk
Код
CDC_Receive_HS (uint8_t* Buf, uint32_t *Len)
, то иногда зависает посылка по Bulk.
Видимо проблема в том, что иногда я в основном цикле вызываю CDC_Transmit_HS и в это время в прерывании вызывается CDC_Receive_HS. Я засунул вызов CDC_Transmit_HS в прерывание USB SOF (по сути разделил эти две функции по времени) и зависания Bulk прекратились. Хотелось бы прояснить, почему так происходит?
SasaVitebsk
Ну, скорее всего, идёт одновременное обращение к одному и тому же аппаратному регистру USB.
То есть в голове или задаче у вас читается регистр, и в это время поступает прерывание где этот регистр модифицируется. Далее идёт возврат в основную прогу (или задачу) которые начинают работу с неверным (изменённым) значением регистра.
Чтобы этого не происходило, необходимо работать с регистрами в одной задаче либо делать "захват ресурсов". Короче вы должны обеспечить монопольное использование ресурсов. Без коллизий.
Типичным примером является флэш память. Например необходимо писать туда сообщения из разных задач. Понятно, что до момента завершения текущей операции, она не должна быть прервана.
Осмыслите это и поймёте.
Atlantis-
Видимо так и есть https://community.st.com/thread/39921-usb-c...ils-on-transmit
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.