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

 
 
> 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
 
Start new topic
Ответов
esaulenka
сообщение Feb 22 2017, 08:43
Сообщение #2


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Chameleon @ Feb 21 2017, 10:35) *
Дефайн __HAL_PCD_CLEAR_FLAG определен как
Код
GINTSTS &= 0x40000000;

Но ведь для сброса флага прерывания в него надо записывать "1" ????
Т.е. делать так:
Код
GINTSTS |= 0x40000000;


Вообще говоря, этот код работает.
В это место вы попадаете с установленным 30-м битом; он ещё раз умножается на 30-й бит и записывается обратно.
Вариант
Код
GINTSTS |= 0x40000000;

неправильный, он лишние флажки поскидывает.
Простой и понятный вариант
Код
GINTSTS = 0x40000000;

но для индусов это слишком просто.

По делу не помогу. Я это нагромождение дефайнов и абстракций не осилил. Заметно лучше, чем SPL, но для прикручивания своего протокола понадобилось бы переписать половину этой "библиотеки". Плюнул, взял libopencm3 - там тоже переписывать надо, но хотя бы структура прозрачная.

Цитата(Forger @ Feb 22 2017, 11:27) *
Мля, я не про эту несчастную кривую функцию, которая не предназначенная для использования в прерываниях в принципе!


У меня вопрос. Где граница, при превышении которой этот самый-лучший-в-мире стек упадёт нафиг? Убираем несчастную кривую функцию, добавляем два высокоприоритетных прерывания. Будет работать? Увеличиваем частоту прерываний на порядок. Будет работать?

Стандартом заложено, что интерфейс может "подтормаживать". А библиотекописатели это не проверяли, у них в случае торможений всё вообще раком встаёт. Это проблема библиотеки, разве не так?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 22 2017, 09:11
Сообщение #3


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

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



Цитата(esaulenka @ Feb 22 2017, 11:43) *
Код
GINTSTS = 0x40000000;

но для индусов это слишком просто.
Так было сделано в одной из старых версий HAL, а щас стоит "&=". Видать, есть на то причины ...
Полагаю, что дело в разных особенностях работы разных битов в одном и том же регистре. В нюансы не вникал, но других причин не вижу.


Цитата
По делу не помогу. Я это нагромождение дефайнов и абстракций не осилил.

Не надо читать и вникать в эту кучу кода, достаточно лишь один раз скомпилировать в одну либу и подключить к проекту вместе с H-файлами.
Не забыть про ключик компиляции, при котором каждая функция кладется в свою ELF-секцию, так в финальную прошивку попадут только те функции, которые используются, а не целиком соотв. С-файл.

Цитата
У меня вопрос. Где граница, при превышении которой этот самый-лучший-в-мире стек упадёт нафиг? Убираем несчастную кривую функцию, добавляем два высокоприоритетных прерывания. Будет работать? Увеличиваем частоту прерываний на порядок. Будет работать?

Речь тут не про HAL/CUBE и т. п, а про совсем другое - про банальное нарушение базового правила кода под МК: заходить в прерывания можно только для того, чтобы "отметиться" и что-то просемафорить наружу в основной код.
А число-дробилки и циклы ожидания выносятся наружу в основной код. Иначе жди беды!




Цитата(uriy @ Feb 22 2017, 11:59) *
Вероятно надо использовать HAL_UART_Transmit_IT или HAL_UART_Transmit_DMA для передачи по прерываниям или по DMA.
HAL_UART_Transmit передает по поллингу, эта функция блокирующая на все время передачи.

Дык, с самого начала этой темы тока об этом и говорю, но что-то очень туго это доходит 1111493779.gif


Цитата(Chameleon @ Feb 22 2017, 11:33) *
Падает на up().

Вижу простое решение: отладить это чудо-код на ПУСТОМ проекте, добиться от него стабильной работы в разных ситуациях (банально тесты), и уже только после этого куда-то сувать.

Но я лично воспользовался бы уже готовым решением, которое не требует наличия UART и т.п.
Для этого достаточно уже существующего SWD или JTAG: https://electronix.ru/forum/index.php?s=&am...t&p=1482569
Таких тормозов нет и в помине. Работает как раз с полпинка, но обладает в сотни раз бОльшим функционалом. Бесплатно, исходники открыты.

Но коли нравиться изобретать велосипед, то конечно же продолжайте в том же духе:
Код
void UARTPrint(char *s)
{
    for(;;)
    {
        while((USART1->SR & USART_SR_TXE) == 0);
        USART1->DR = *s++;
        if (*s == 0) break;
    }
}


rolleyes.gif


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


Участник
*

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



QUOTE (Forger @ Feb 22 2017, 12:11) *
Вижу простое решение: отладить это чудо-код на ПУСТОМ проекте, добиться от него стабильной работы в разных ситуациях (банально тесты), и уже только после этого куда-то сувать.


Спасибо, КЭП.

Вы что, не понимаете, что это и есть ПУСТОЙ ПРОЕКТ. Только USB и UART. Что я и пытаюсь добиться стабильной работы в разных ситуациях? Да, да, передача строки по поллингу и есть СИТУАЦИЯ. И они должны работать вместе в любых комбинациях?

QUOTE (Forger @ Feb 22 2017, 12:11) *
Но я лично воспользовался бы уже готовым решением, которое не требует наличия UART и т.п.
Для этого достаточно уже существующего SWD или JTAG: https://electronix.ru/forum/index.php?s=&am...t&p=1482569
Таких тормозов нет и в помине. Работает как раз с полпинка, но обладает в сотни раз бОльшим функционалом. Бесплатно, исходники открыты.

Но коли нравиться изобретать велосипед, то продолжайте в том же духе:
CODE
void UARTPrint(char *s)
{
    for(;;)
    {
        while((USART1->SR & USART_SR_TXE) == 0);
        USART1->DR = *s++;
        if (*s == 0) break;
    }
}


rolleyes.gif


Отличный совет - не получается? Как нибудь придумай обход. Прилепи костыль. Авось по другому прокатит.

Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 22 2017, 09:38
Сообщение #5


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

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



Цитата(Chameleon @ Feb 22 2017, 12:20) *
Спасибо, КЭП.

Вы что, не понимаете, что это и есть ПУСТОЙ ПРОЕКТ. Только USB и UART.

А что делает тут USB?
Короче, ПУСТОЙ НОВЫЙ проект только для того, чтобы отладить ваши несчастные костыльные функции.
Добейтесь тут от них нормальной работы в ПУСТОМ проекте. Поиграйтесь с размером стека (например).
В конце концов, сделайте нормальный функционал БЕЗ поллинга!

Цитата
Что я и пытаюсь добиться стабильной работы в разных ситуациях? Да, да, передача строки по поллингу и есть СИТУАЦИЯ. И они должны работать вместе в любых комбинациях?

Я не пойму, чего вы хотите добиться? Чтобы проект был сделан сразу нормально и без костылей или, просто, хотите что-то доказать себе или кому-то?

Цитата
Отличный совет - не получается? Как нибудь придумай обход. Прилепи костыль. Авось по другому прокатит.

Костыль - это как раз ваша самодеятельная чудо-функция, использующая поллинг в прерывании.
Я же говорю про готовое решение, которое отлажено за вас и отлично работает как раз с полпинка, благодаря наличию документации и тому, что это написано профессионалами, а не любителями-изобретателями.
Если не хотите или не можете освоить готовые решения, так пользуйтесь и далее своими чудо-функциями, которая как вы говорите, "с полпинка работает на sam4s" и т. п.

Короче, далее бейтесь о стену уже без моей помощи - все, чем я мог помочь, тут уже прозвучало и неоднократно и не только от меня. Удачи wink.gif


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


Участник
*

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



QUOTE (Forger @ Feb 22 2017, 12:38) *
А что делает тут USB?
Короче, ПУСТОЙ НОВЫЙ проект только для того, чтобы отладить ваши несчастные костыльные функции.
Добейтесь тут от них нормальной работы в ПУСТОМ проекте. Поиграйтесь с размером стека (например).
В конце концов, сделайте нормальный функционал БЕЗ поллинга!


Я не пойму, чего вы хотите добиться? Чтобы проект был сделан сразу нормально и без костылей или, просто, хотите что-то доказать себе или кому-то?


Костыль - это как раз ваша самодеятельная чудо-функция, использующая поллинг в прерывании.
Я же говорю про готовое решение, которое отлажено за вас и отлично работает как раз с полпинка, благодаря наличию документации и тому, что это написано профессионалами, а не любителями-изобретателями.
Если не хотите или не можете освоить готовые решения, так пользуйтесь и далее своими чудо-функциями, которая как вы говорите, "с полпинка работает на sam4s" и т. п.

Короче, далее бейтесь о стену уже без моей помощи - все, чем я мог помочь, тут уже прозвучало и неоднократно и не только от меня. Удачи wink.gif


Вы вообще читаете, что я пишу? Какая от вас может быть помощь, если вы помните только то что было написано на первой странице поста?
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 22 2017, 10:42
Сообщение #7


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

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



Цитата(Chameleon @ Feb 22 2017, 12:52) *
Вы вообще читаете, что я пишу?

Мне лишь одного этого хватило:
Цитата(Chameleon @ Feb 21 2017, 18:08) *
Препроцессор - зло. Он не нужен.

Это позволяет лишний раз убедиться, что:
Цитата(Chameleon @ Feb 22 2017, 07:53) *
Чем дальше в лес, тем толще партизаны.


.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Chameleon   STM32 OTG USB проблема с отладкой   Feb 21 2017, 07:35
- - Forger   Цитата(Chameleon @ Feb 21 2017, 10:35) UA...   Feb 21 2017, 12:18
|- - Chameleon   QUOTE (Forger @ Feb 21 2017, 15:18) Нельз...   Feb 21 2017, 12:28
||- - Forger   Цитата(Chameleon @ Feb 21 2017, 15:28) Пр...   Feb 21 2017, 12:30
||- - Chameleon   QUOTE (Forger @ Feb 21 2017, 15:30) Если ...   Feb 21 2017, 12:37
||- - Forger   Цитата(Chameleon @ Feb 21 2017, 15:37) Пр...   Feb 21 2017, 12:45
||- - aaarrr   Цитата(Forger @ Feb 21 2017, 15:45) Все я...   Feb 21 2017, 12:54
||- - Chameleon   QUOTE (Forger @ Feb 21 2017, 15:45) Это н...   Feb 21 2017, 12:55
||- - Forger   Цитата(Chameleon @ Feb 21 2017, 15:55) Я ...   Feb 21 2017, 13:06
||- - Chameleon   QUOTE (Forger @ Feb 21 2017, 16:06) А без...   Feb 21 2017, 13:15
||- - jcxz   Цитата(Chameleon @ Feb 21 2017, 19:15) UA...   Feb 21 2017, 13:18
||- - Chameleon   QUOTE (jcxz @ Feb 21 2017, 16:18) Вы теле...   Feb 21 2017, 13:21
||- - jcxz   Цитата(Chameleon @ Feb 21 2017, 19:21) См...   Feb 21 2017, 15:42
|- - jcxz   Цитата(Forger @ Feb 21 2017, 18:18) Нельз...   Feb 21 2017, 13:12
|- - Forger   Цитата(jcxz @ Feb 21 2017, 16:12) А как В...   Feb 21 2017, 13:32
|- - Chameleon   QUOTE (Forger @ Feb 21 2017, 16:32) Богат...   Feb 21 2017, 13:40
|- - Forger   Цитата(Chameleon @ Feb 21 2017, 16:40) У ...   Feb 21 2017, 13:43
|- - Chameleon   QUOTE (Forger @ Feb 21 2017, 16:43) Если ...   Feb 21 2017, 13:52
||- - Forger   Цитата(Chameleon @ Feb 21 2017, 16:52) US...   Feb 21 2017, 13:54
||- - A.Lex   Цитата(Chameleon @ Feb 21 2017, 15:52) US...   Feb 21 2017, 14:10
|- - Chameleon   QUOTE (Forger @ Feb 21 2017, 16:43) Если ...   Feb 21 2017, 14:18
|- - Forger   Цитата(Chameleon @ Feb 21 2017, 17:18) На...   Feb 21 2017, 14:25
|- - Chameleon   А тогда чего вы полезли на STM32, коли на sam4s вс...   Feb 21 2017, 14:49
|- - Forger   Цитата(Chameleon @ Feb 21 2017, 17:49) А ...   Feb 21 2017, 14:58
||- - Chameleon   В таком случае все же придется изучать матчасть и ...   Feb 21 2017, 15:08
|- - Forger   Цитата(Chameleon @ Feb 21 2017, 17:49) Ко...   Feb 21 2017, 15:13
|- - Chameleon   QUOTE (Forger @ Feb 21 2017, 18:13) Коли ...   Feb 21 2017, 15:21
||- - Forger   Цитата(Chameleon @ Feb 21 2017, 18:21) Я ...   Feb 21 2017, 15:31
||- - Chameleon   В основном коде ВНЕ прерываний эта функция работае...   Feb 21 2017, 15:46
||- - Forger   Цитата(Chameleon @ Feb 21 2017, 18:46) Пр...   Feb 21 2017, 16:32
||- - Chameleon   Чем дальше в лес, тем толще партизаны. Сделал отл...   Feb 22 2017, 04:53
||- - Forger   Цитата(Forger @ Feb 21 2017, 18:31) Прави...   Feb 22 2017, 05:50
|||- - Chameleon   QUOTE (Forger @ Feb 22 2017, 08:50) Покаж...   Feb 22 2017, 06:14
|||- - Forger   Я имел ввиду другое, гораздо более грамотное решен...   Feb 22 2017, 06:49
|||- - Chameleon   QUOTE (Forger @ Feb 22 2017, 09:49) Я име...   Feb 22 2017, 08:18
|||- - Forger   Цитата(Chameleon @ Feb 22 2017, 11:18) Па...   Feb 22 2017, 08:27
|||- - Chameleon   QUOTE (Forger @ Feb 22 2017, 11:27) Мля, ...   Feb 22 2017, 08:33
||- - jcxz   Цитата(Chameleon @ Feb 22 2017, 10:53) Че...   Feb 22 2017, 10:53
||- - Forger   Цитата(jcxz @ Feb 22 2017, 13:53) И тогда...   Feb 22 2017, 10:57
|- - jcxz   Цитата(Forger @ Feb 21 2017, 21:13) Кстат...   Feb 21 2017, 15:49
|- - Chameleon   QUOTE (jcxz @ Feb 21 2017, 18:49) Если че...   Feb 21 2017, 16:25
|- - esaulenka   Цитата(Forger @ Feb 22 2017, 12:11) Не на...   Feb 22 2017, 11:07
|- - Forger   Цитата(esaulenka @ Feb 22 2017, 14:07) По...   Feb 22 2017, 11:23
- - uriy   Вероятно надо использовать HAL_UART_Transmit_IT ил...   Feb 22 2017, 08:59
- - AHTOXA   Цитата(Forger @ Feb 22 2017, 14:38) Короч...   Feb 22 2017, 13:02
|- - Forger   Цитата(AHTOXA @ Feb 22 2017, 16:02) Помощ...   Feb 22 2017, 13:23
|- - AHTOXA   Цитата(Forger @ Feb 22 2017, 18:23) Внима...   Feb 22 2017, 14:44
|- - Forger   Цитата(AHTOXA @ Feb 22 2017, 17:44) То ес...   Feb 22 2017, 15:02
||- - AHTOXA   Цитата(Chameleon @ Feb 22 2017, 20:06) Ре...   Feb 22 2017, 15:49
||- - Forger   Цитата(AHTOXA @ Feb 22 2017, 18:49) Разни...   Feb 22 2017, 16:04
||- - Chameleon   QUOTE А какой проц-то? В F405/407/415/417 - ART не...   Feb 22 2017, 16:25
||- - Forger   Цитата(Chameleon @ Feb 22 2017, 19:25) На...   Feb 22 2017, 16:35
|- - Chameleon   Ревизия проца A. Две штуки. Взял вторую плату, кит...   Feb 22 2017, 15:06
|- - Forger   Цитата(Chameleon @ Feb 22 2017, 18:06) Сд...   Feb 22 2017, 15:15
- - Thorn   Руководство по поиску причины HardFault   Feb 22 2017, 15:37
- - AHTOXA   Цитата(Chameleon @ Feb 22 2017, 21:25) UA...   Feb 22 2017, 16:40
|- - Forger   Цитата(AHTOXA @ Feb 22 2017, 19:40) Всё д...   Feb 22 2017, 16:44
|- - AHTOXA   Цитата(Forger @ Feb 22 2017, 21:44) Внутр...   Feb 22 2017, 17:49
|- - Forger   Цитата(AHTOXA @ Feb 22 2017, 20:49) Стек ...   Feb 22 2017, 17:59
|- - Chameleon   QUOTE (Forger @ Feb 22 2017, 20:59) Именн...   Feb 23 2017, 06:49
|- - Forger   Цитата(Chameleon @ Feb 23 2017, 09:49) В...   Feb 23 2017, 07:31
- - Chameleon   Все, нашел. Куб в коде выставляет в USBD_LL_Init(...   Feb 23 2017, 10:36
|- - Forger   Цитата(Chameleon @ Feb 23 2017, 13:36) И ...   Feb 23 2017, 10:47
|- - Chameleon   Внутри MX_USB_DEVICE_Init() и есть настройка hpcd...   Feb 23 2017, 11:03
|- - Forger   Цитата(Chameleon @ Feb 23 2017, 14:03) Вн...   Feb 23 2017, 13:29
|- - Timmy   Цитата(Forger @ Feb 23 2017, 16:29) Впроч...   Feb 28 2017, 04:08
|- - Obam   Цитата(Timmy @ Feb 28 2017, 08:08) Чтобы ...   Feb 28 2017, 08:25
- - Obam   Гы-гы-гы, повеселили! 5 страниц увлекательного...   Feb 23 2017, 11:16
- - rudy_b   Ага, у меня уже даже привычка появилась. Сначала г...   Feb 27 2017, 10:06


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

 


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


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