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

 
 
> 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
Ответов
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
jcxz
сообщение Feb 21 2017, 13:12
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Forger
сообщение Feb 21 2017, 13:32
Сообщение #4


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

Группа: Свой
Сообщений: 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
Сообщение #5


Участник
*

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



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




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


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


Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 13:43
Сообщение #6


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

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



Цитата(Chameleon @ Feb 21 2017, 16:40) *
У кортекса есть вложенные прерывания? Надо их запрещать? Может вызваться новое прерывание, пока не завершилость предыдущее?

Если разрешено соотв. прерывание от USART, то в данном случае может произойти все что угодно.
Покажите вашу инициализацию USART.

И все же не помешает по-курить базовую матчасть по кортексам и его NVIC sm.gif


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


Участник
*

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



QUOTE (Forger @ Feb 21 2017, 16:43) *
Если разрешено соотв. прерывание от USART, то в данном случае может произойти все что угодно.
Покажите вашу инициализацию USART.

И все же не помешает по-курить базовую матчасть по кортексам и его NVIC sm.gif


На sam4s код юсб от sam7 завелся с пол-оборота. Тот же кортекс. И такая же отладка была.

Весь код инициализации прерываний

CODE
NVIC_ClearPendingIRQ((IRQn_Type) ID_UDP);
NVIC_SetPriority((IRQn_Type) ID_UDP, 0);
NVIC_EnableIRQ((IRQn_Type) ID_UDP);


Что тут курить-то?
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 14:25
Сообщение #8


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

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



Цитата(Chameleon @ Feb 21 2017, 17:18) *
На sam4s код юсб от sam7 завелся с пол-оборота. Тот же кортекс. И такая же отладка была.

А тогда чего вы полезли на STM32, коли на sam4s все "заводится с пол-оборота"? wink.gif

Цитата
Весь код инициализации прерываний
Код
NVIC_ClearPendingIRQ((IRQn_Type) ID_UDP);
NVIC_SetPriority((IRQn_Type) ID_UDP, 0);
NVIC_EnableIRQ((IRQn_Type) ID_UDP);

А что такое ID_UDP?

И покажите наконец-то код инициализации USART.

Цитата
Что тут курить-то?


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




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


Участник
*

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



А тогда чего вы полезли на STM32, коли на sam4s все "заводится с пол-оборота"? wink.gif

Потому что sam4s не толерантный к 5 вольтам. И труднопокупаемый. А STM32 как грязи на любом развале.

А что такое ID_UDP?


UDP = USB Device port

И покажите наконец-то код инициализации USART.

CODE
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}

/**
* @brief Initializes the UART mode according to the specified parameters in
* the UART_InitTypeDef and create the associated handle.
* @param huart: pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
{
/* Check the UART handle allocation */
if(huart == NULL)
{
return HAL_ERROR;
}

/* Check the parameters */
if(huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
{
/* The hardware flow control is available only for USART1, USART2, USART3 and USART6 */
assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
}
else
{
assert_param(IS_UART_INSTANCE(huart->Instance));
}
assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));

if(huart->gState == HAL_UART_STATE_RESET)
{
/* Allocate lock resource and initialize it */
huart->Lock = HAL_UNLOCKED;
/* Init the low level hardware */
HAL_UART_MspInit(huart);
}

huart->gState = HAL_UART_STATE_BUSY;

/* Disable the peripheral */
__HAL_UART_DISABLE(huart);

/* Set the UART Communication parameters */
UART_SetConfig(huart);

/* In asynchronous mode, the following bits must be kept cleared:
- LINEN and CLKEN bits in the USART_CR2 register,
- SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));

/* Enable the peripheral */
__HAL_UART_ENABLE(huart);

/* Initialize the UART state */
huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->gState= HAL_UART_STATE_READY;
huart->RxState= HAL_UART_STATE_READY;

return HAL_OK;
}

/**
* @brief Initializes the half-duplex mode according to the specified
* parameters in the UART_InitTypeDef and create the associated handle.
* @param huart: pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)
{
/* Check the UART handle allocation */
if(huart == NULL)
{
return HAL_ERROR;
}

/* Check the parameters */
assert_param(IS_UART_INSTANCE(huart->Instance));
assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));

if(huart->gState == HAL_UART_STATE_RESET)
{
/* Allocate lock resource and initialize it */
huart->Lock = HAL_UNLOCKED;
/* Init the low level hardware */
HAL_UART_MspInit(huart);
}

huart->gState = HAL_UART_STATE_BUSY;

/* Disable the peripheral */
__HAL_UART_DISABLE(huart);

/* Set the UART Communication parameters */
UART_SetConfig(huart);

/* In half-duplex mode, the following bits must be kept cleared:
- LINEN and CLKEN bits in the USART_CR2 register,
- SCEN and IREN bits in the USART_CR3 register.*/
CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
CLEAR_BIT(huart->Instance->CR3, (USART_CR3_IREN | USART_CR3_SCEN));

/* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */
SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL);

/* Enable the peripheral */
__HAL_UART_ENABLE(huart);

/* Initialize the UART state*/
huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->gState= HAL_UART_STATE_READY;
huart->RxState= HAL_UART_STATE_READY;

return HAL_OK;
}


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


Я не собираюсь их там оставлять. После отладки кода все они удаляются.

Сообщение отредактировал IgorKossak - Feb 22 2017, 19:22
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 14:58
Сообщение #10


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

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



Цитата(Chameleon @ Feb 21 2017, 17:49) *
А STM32 как грязи на любом развале.

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


Цитата
Посмотрите наконец-то post #5 на первой странице.

Там нет кода инициализации USART. Вы вообще понимаете смысл слова "инициализация"?
Короче, покажите код, где USART настраивается на роботу, где настраиваются его регистры и т.п.


Цитата
Я не собираюсь их там оставлять. После отладки кода все они удаляются.

Отладочный код (DEBUG) должен работать практически одинаково с финальным (RELEASE). В крайнем случае он как минимум должен хотя бы работать, в обоих случаях wink.gif
Я лишь предостерег от граблей, на которые сам наступал в свое время.
Кстати, нет никакой нужды удалять отладочный код, для этого есть встроенный в любой компилятор препроцессор (#ifdef #endif и т. п.)


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

Сообщений в этой теме
- Chameleon   STM32 OTG USB проблема с отладкой   Feb 21 2017, 07:35
|- - 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
|- - 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   В таком случае все же придется изучать матчасть и ...   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   Цитата(Chameleon @ Feb 21 2017, 10:35) Де...   Feb 22 2017, 08:43
|- - Forger   Цитата(esaulenka @ Feb 22 2017, 11:43) Ко...   Feb 22 2017, 09:11
|- - Chameleon   QUOTE (Forger @ Feb 22 2017, 12:11) Вижу ...   Feb 22 2017, 09:20
||- - Forger   Цитата(Chameleon @ Feb 22 2017, 12:20) Сп...   Feb 22 2017, 09:38
||- - Chameleon   QUOTE (Forger @ Feb 22 2017, 12:38) А что...   Feb 22 2017, 09:52
||- - Forger   Цитата(Chameleon @ Feb 22 2017, 12:52) Вы...   Feb 22 2017, 10:42
|- - 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 Текстовая версия Сейчас: 15th August 2025 - 18:22
Рейтинг@Mail.ru


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