реклама на сайте
подробности

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> STM32 OTG USB проблема с отладкой
Chameleon
сообщение Feb 21 2017, 07:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



Проц 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
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 12:18
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Chameleon @ Feb 21 2017, 10:35) *
UARTPrint("\r\n---USB_IRQHandler")


Нельзя внутри обработчиков прерываний выполнять такие толстые и медленные функции.
В данном случае эта функция будет выполняться как минимум 2мс, чем затормозит на это время все остальные прерывания, этого достаточно, чтобы USB отвалился.
Из прерывания можно тока по-быстрому просемафорить о чем-то флагами или сервисом rtos, и уже в основном коде (задаче) это выполнять.
Конечно, можно поиграться приоритетами прерываний и разрешить вытесняющие прерывания, но это в данном случае тупик.




--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 21 2017, 12:28
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 21 2017, 15:18) *
Нельзя внутри обработчиков прерываний выполнять такие толстые и медленные функции.
В данном случае эта функция будет выполняться как минимум 2мс, чем затормозит на это время все остальные прерывания, этого достаточно, чтобы USB отвалился.
Из прерывания можно тока по-быстрому просемафорить о чем-то флагами или сервисом rtos, и уже в основном коде (задаче) это выполнять.
Конечно, можно поиграться приоритетами прерываний и разрешить вытесняющие прерывания, но это в данном случае тупик.


А вы ожидали чего-то иного c USB? wink.gif


Всю жизнь отлаживал так инициализацию USB. Даже на скорости 9600. Вроде в стандарт уже заложен допуск таких задержек для отладки.

Прерывание "Подключение" должно сыпаться непрерывно? Или все таки произойти один раз?
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 12:30
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Chameleon @ Feb 21 2017, 15:28) *
Прерывание "Подключение" должно сыпаться непрерывно? Или все таки произойти один раз?

Если нарушить логику подключения тормозами в других прерываниях, то иного ожидать не приходится ))

А как выглядит внутри этот самый UARTPrint?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 21 2017, 12:37
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 21 2017, 15:30) *
Если нарушить логику подключения тормозами в других прерываниях, то иного ожидать не приходится ))

А как выглядит внутри этот самый UARTPrint?


Прерывания включены только для USB.

CODE
void UARTPrint(char *s)
{
    for(;;)
    {
        while((USART1->SR & USART_SR_TXE) == 0);
        USART1->DR = *s++;
        if (*s == 0) break;
    }
}
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 12:45
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Chameleon @ Feb 21 2017, 15:37) *
Прерывания включены только для USB.

Это не меняет дела:

Цитата
Код
while((USART1->SR & USART_SR_TXE) == 0);
USART1->DR = *s++;
if (*s == 0) break;

Все ясно, на скорости 9600 эта функция будет выполняться еще дольше ... (в 12 раз дольше, чем на 115200)
Тупо висим в прерывании, пока не отправится вся строка - как у вас с такой "отладкой" вообще что-то работает?!

Если проект без вашей "отладки" нормально работает, то переделывайте отладку на нормальную или откажитесь вовсе от такого метода отладки.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 21 2017, 12:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Forger @ Feb 21 2017, 15:45) *
Все ясно, на скорости 9600 эта функция будет выполняться еще дольше ... (в 12 раз дольше, чем на 115200)
Тупо висим в прерывании, пока не отправится вся строка - как у вас с такой "отладкой" вообще что-то работает?!

Должно работать. Причина не в "тормозах" отладочной печати.

Надо разбираться, почему прерывание от USB постоянно активно.
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 21 2017, 12:55
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 21 2017, 15:45) *
Это не меняет дела:


Все ясно, на скорости 9600 эта функция будет выполняться еще дольше ... (в 12 раз дольше, чем на 115200)
Тупо висим в прерывании, пока не отправится вся строка - как у вас с такой "отладкой" вообще что-то работает?!

Если проект без вашей "отладки" нормально работает, то переделывайте отладку на нормальную или откажитесь вовсе от такого метода отладки.


Отладка на 115200. 9600 я для примера написал. Время на обработку пакета по стандарту допускается до 50мс без передачи данных и до 500 мс с передачей данных. 50 мс это 500 символов на скорости 115200. Страница текста.

Я всегда использовал такую отладку для юсб. Для Silabs, SAM7, NXP. Не было никаких проблем. Один STM32 долбанутый какой-то.
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 13:06
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Chameleon @ Feb 21 2017, 15:55) *
Я всегда использовал такую отладку для юсб. Для Silabs, SAM7, NXP. Не было никаких проблем. Один STM32 долбанутый какой-то.

А без вашей "отладки" этот же пример работает нормально?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 21 2017, 13:12
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ Feb 21 2017, 18:18) *
Нельзя внутри обработчиков прерываний выполнять такие толстые и медленные функции.
В данном случае эта функция будет выполняться как минимум 2мс,

А как Вы определили что находится у ТС внутри этого самого UARTPrint()?
Да ещё и удалённо определили время её выполнения даже не зная что внутри! Поделитесь секретами мастерства!!! Думаю всем тут будет любопытно biggrin.gif
И вообще - странно как это она может выполняться целых 2мс на Cortex с тактовой в десятки МГц если внутри неё например просто копируется указанная строка в буфер символов???
Или даже просто не строка, а сам указатель.

PS: Я подобные отладочные функции вставлял в ISR работающие на частотах в десятки кГц - и всё прекрасно работало. Да - конечно правда без куба wink.gif
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 21 2017, 13:15
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 21 2017, 16:06) *
А без вашей "отладки" этот же пример работает нормально?


Без отладки - да, нормально.

Добавляю в начало обработчика прерывания код, просто задержка от балды.

CODE
{
   volatile uint32_t x;
   for (x = 0; x < 2000000; x++);
}


Устройство определяется через 5 секунд после подключения, но ОПРЕДЕЛЯЕТСЯ.

Заменяю эту задержку на

CODE
    UARTPrint("\r\n-IRQ");

Все, ничего не работает.
Такое впечатление, что UART и USB какие-то ресурсы поделить не могут.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 21 2017, 13:18
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Chameleon @ Feb 21 2017, 19:15) *
UARTPrint("\r\n-IRQ");

Вы телепатов ищете? Приведите код этой самой UARTPrint().
А то тут только один телепат пока нашёлся....
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 21 2017, 13:21
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (jcxz @ Feb 21 2017, 16:18) *
Вы телепатов ищете? Приведите код этой самой UARTPrint().
А то тут только один телепат пока нашёлся....


См. Post #5 выше.
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 13:32
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ Feb 21 2017, 16:12) *
А как Вы определили что находится у ТС внутри этого самого UARTPrint()?
Да ещё и удалённо определили время её выполнения даже не зная что внутри! Поделитесь секретами мастерства!!!

Богатый жизненный опыт и умение пользоваться калькулятором wink.gif



Цитата(Chameleon @ Feb 21 2017, 16:15) *
Такое впечатление, что UART и USB какие-то ресурсы поделить не могут.

Если подряд поставить два-три вызова этой функции, они все вызываются?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 21 2017, 13:40
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 21 2017, 16:32) *
Богатый жизненный опыт и умение пользоваться калькулятором wink.gif




Если подряд поставить два-три вызова этой функции, они все вызываются?


Вроде как нет... Такое впечатление, что обработчик вызывает сам себя.
У кортекса есть вложенные прерывания? Надо их запрещать? Может вызваться новое прерывание, пока не завершилость предыдущее?


Go to the top of the page
 
+Quote Post

6 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th August 2025 - 09:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016