|
STM32 OTG USB проблема с отладкой |
|
|
|
Feb 21 2017, 07:35
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Feb 21 2017, 12:18
|

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

|
Цитата(Chameleon @ Feb 21 2017, 10:35)  UARTPrint("\r\n---USB_IRQHandler") Нельзя внутри обработчиков прерываний выполнять такие толстые и медленные функции. В данном случае эта функция будет выполняться как минимум 2мс, чем затормозит на это время все остальные прерывания, этого достаточно, чтобы USB отвалился. Из прерывания можно тока по-быстрому просемафорить о чем-то флагами или сервисом rtos, и уже в основном коде (задаче) это выполнять. Конечно, можно поиграться приоритетами прерываний и разрешить вытесняющие прерывания, но это в данном случае тупик.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 21 2017, 13:12
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Feb 21 2017, 18:18)  Нельзя внутри обработчиков прерываний выполнять такие толстые и медленные функции. В данном случае эта функция будет выполняться как минимум 2мс, А как Вы определили что находится у ТС внутри этого самого UARTPrint()? Да ещё и удалённо определили время её выполнения даже не зная что внутри! Поделитесь секретами мастерства!!! Думаю всем тут будет любопытно И вообще - странно как это она может выполняться целых 2мс на Cortex с тактовой в десятки МГц если внутри неё например просто копируется указанная строка в буфер символов??? Или даже просто не строка, а сам указатель. PS: Я подобные отладочные функции вставлял в ISR работающие на частотах в десятки кГц - и всё прекрасно работало. Да - конечно правда без куба
|
|
|
|
|
Feb 21 2017, 13:32
|

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

|
Цитата(jcxz @ Feb 21 2017, 16:12)  А как Вы определили что находится у ТС внутри этого самого UARTPrint()? Да ещё и удалённо определили время её выполнения даже не зная что внутри! Поделитесь секретами мастерства!!! Богатый жизненный опыт и умение пользоваться калькулятором  Цитата(Chameleon @ Feb 21 2017, 16:15)  Такое впечатление, что UART и USB какие-то ресурсы поделить не могут. Если подряд поставить два-три вызова этой функции, они все вызываются?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 21 2017, 13:40
|
Участник

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

|
QUOTE (Forger @ Feb 21 2017, 16:32)  Богатый жизненный опыт и умение пользоваться калькулятором  Если подряд поставить два-три вызова этой функции, они все вызываются? Вроде как нет... Такое впечатление, что обработчик вызывает сам себя. У кортекса есть вложенные прерывания? Надо их запрещать? Может вызваться новое прерывание, пока не завершилость предыдущее?
|
|
|
|
|
Feb 21 2017, 13:43
|

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

|
Цитата(Chameleon @ Feb 21 2017, 16:40)  У кортекса есть вложенные прерывания? Надо их запрещать? Может вызваться новое прерывание, пока не завершилость предыдущее? Если разрешено соотв. прерывание от USART, то в данном случае может произойти все что угодно. Покажите вашу инициализацию USART. И все же не помешает по-курить базовую матчасть по кортексам и его NVIC
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 21 2017, 14:18
|
Участник

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

|
QUOTE (Forger @ Feb 21 2017, 16:43)  Если разрешено соотв. прерывание от USART, то в данном случае может произойти все что угодно. Покажите вашу инициализацию USART. И все же не помешает по-курить базовую матчасть по кортексам и его NVIC  На sam4s код юсб от sam7 завелся с пол-оборота. Тот же кортекс. И такая же отладка была. Весь код инициализации прерываний CODE NVIC_ClearPendingIRQ((IRQn_Type) ID_UDP); NVIC_SetPriority((IRQn_Type) ID_UDP, 0); NVIC_EnableIRQ((IRQn_Type) ID_UDP); Что тут курить-то?
|
|
|
|
|
Feb 21 2017, 14:25
|

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

|
Цитата(Chameleon @ Feb 21 2017, 17:18)  На sam4s код юсб от sam7 завелся с пол-оборота. Тот же кортекс. И такая же отладка была. А тогда чего вы полезли на STM32, коли на sam4s все "заводится с пол-оборота"?  Цитата Весь код инициализации прерываний Код NVIC_ClearPendingIRQ((IRQn_Type) ID_UDP); NVIC_SetPriority((IRQn_Type) ID_UDP, 0); NVIC_EnableIRQ((IRQn_Type) ID_UDP); А что такое ID_UDP? И покажите наконец-то код инициализации USART. Цитата Что тут курить-то? В целях общего ознакомления, ибо без понятия базовых основ NVIC настроить правильно прерывания будет весьма затруднительно. Ну, и советую отучиться от дурной привычки - вызывать толстые функции в прерываниях, иначе однажды это сыграет злую шутку ...
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 21 2017, 14:49
|
Участник

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

|
А тогда чего вы полезли на STM32, коли на sam4s все "заводится с пол-оборота"?  Потому что 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] - для короткого!
|
|
|
|
|
Feb 21 2017, 14:58
|

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

|
Цитата(Chameleon @ Feb 21 2017, 17:49)  А STM32 как грязи на любом развале. В таком случае все же придется изучать матчасть и иногда копаться в даташитах ))) Цитата Посмотрите наконец-то post #5 на первой странице. Там нет кода инициализации USART. Вы вообще понимаете смысл слова "инициализация"? Короче, покажите код, где USART настраивается на роботу, где настраиваются его регистры и т.п. Цитата Я не собираюсь их там оставлять. После отладки кода все они удаляются. Отладочный код (DEBUG) должен работать практически одинаково с финальным (RELEASE). В крайнем случае он как минимум должен хотя бы работать, в обоих случаях  Я лишь предостерег от граблей, на которые сам наступал в свое время. Кстати, нет никакой нужды удалять отладочный код, для этого есть встроенный в любой компилятор препроцессор (#ifdef #endif и т. п.)
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|