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

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


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

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


Участник
*

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



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

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


USART кубом настроен, прерывания выключены, я там ничего не трогал.
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 13:54
Сообщение #18


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

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



Цитата(Chameleon @ Feb 21 2017, 16:52) *
USART кубом настроен, прерывания выключены, я там ничего не трогал.

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


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


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



Цитата(Chameleon @ Feb 21 2017, 15:52) *
USART кубом настроен, прерывания выключены, я там ничего не трогал.

А включить USART не забыли?
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 21 2017, 14:18
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #21


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

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


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #23


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

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


Участник
*

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




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



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


Исправил.

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



Препроцессор - зло. Он не нужен.
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 15:13
Сообщение #25


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

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



Цитата(Chameleon @ Feb 21 2017, 17:49) *
Код
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }


Коли вы используете HAL в инициализации USART, то советую и в других функциях по работе с USART использовать HAL.
Рекомендую посмотреть в сторону HAL_UART_Transmit

Кстати, вызов этой вашей толстой функции происходит только в одном месте или раскидан по всему проекту?
Если это так, то срочно переписывайте вашу функцию-самодеятельность под HAL полностью (подробности см. в реализации HAL_UART_Transmit).



Цитата(Chameleon @ Feb 21 2017, 18:08) *
Препроцессор - зло. Он не нужен.


Это кто ж такой умный сказал вам такую абсолютную глупость? cranky.gif
#define - это тоже препроцессор, неужели ваша религия не позволяет им тоже пользоваться? sm.gif


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


Участник
*

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



QUOTE (Forger @ Feb 21 2017, 18:13) *
Коли вы используете HAL в инициализации USART, то советую и в других функциях по работе с USART использовать HAL.
Рекомендую посмотреть в сторону HAL_UART_Transmit

Кстати, вызов этой вашей толстой функции происходит только в одном месте или раскидан по всему проекту?
Если это так, то срочно переписывайте вашу функцию-самодеятельность под HAL полностью (подробности см. в реализации HAL_UART_Transmit).

Это кто ж такой умный сказал вам такую абсолютную глупость? cranky.gif


Я в первую очередь пробовал через HAL_UART_Transmit, нет разницы. Вызовы только в обработчике USB_OTG_Handler. Но я пробовал оставлять только единственный вызов в начале обработчика. Тоже не работает.

Препроцессор зло, это аксиома. Не требует доказательств.
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 15:31
Сообщение #27


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

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



Цитата(Chameleon @ Feb 21 2017, 18:21) *
Я в первую очередь пробовал через HAL_UART_Transmit, нет разницы.

В основном коде ВНЕ прерываний эта функция работает? В бесконечном цикле.

В любом случае подобные функции не должны работать таким образом, как у вас.
Правильно так: кидать байты строки в некую программную очередь и разрешать передачу, заранее настроив прерывания от USART.
Можно даже извратиться на DMA, но это уже детали, не относящиеся к делу...

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

Короче, сначала в пустом проекте отладьте нормально работу этой вашей "отладочной" функции и уже потом суйте ее куда планировали.
В противном случае все это - бесконечный пинг-понг ...


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


Гуру
******

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



Цитата(Chameleon @ Feb 21 2017, 19:21) *
См. Post #5 выше.

Ну естественно так делать нельзя. Вызов не должен быть блокирующим.
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 21 2017, 15:46
Сообщение #29


Участник
*

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



В основном коде ВНЕ прерываний эта функция работает? В бесконечном цикле.

Да.

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

Так и делаю сейчас.

Можно даже извратиться на DMA, но это уже детали, не относящиеся к делу...

Весьма сочувствую вашему "вероисповеданию" ... crying.gif
Тонны "магических цифр" по коду - это самый страшный кошмар любого программиста.
Поэтому мне всегда грустно видеть, как некоторые "программисты" этот кошмар сознательно воплощают в своей реальности, отказываясь даже от безобидных #define ....

#define - > #define -> #define .. еще раз десять вложенных #define и в конце a = 5;
Это конечно лучше.
Про малоуловимые глюки в макросах и смысла нет говорить.
А уж условная компиляция так помогает понять логику работы...



Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 21 2017, 15:49
Сообщение #30


Гуру
******

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



Цитата(Forger @ Feb 21 2017, 21:13) *
Кстати, вызов этой вашей толстой функции происходит только в одном месте или раскидан по всему проекту?
Если это так, то срочно переписывайте вашу функцию-самодеятельность под HAL полностью (подробности см. в реализации HAL_UART_Transmit).

Если человек вызывает такие функции (как в 5-м посте) из ISR ничтоже сумняшеся, то и в остальном коде он мог наделать очевидных глупостей.
Например вызывать этот UARTPrint() из ISR и из фоновой задачи без блокировок.
Переписывание этого под гал или чего-то другое ничего не даст. Если нет понимания как всё в сумме оно работает.....

ЗЫ: теме место - в "помощи начинающему".
Go to the top of the page
 
+Quote Post

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

 


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


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