|
|
  |
STM32 OTG USB проблема с отладкой |
|
|
|
Feb 21 2017, 13:43
|

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

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

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

|
QUOTE (Forger @ Feb 21 2017, 16:43)  Если разрешено соотв. прерывание от USART, то в данном случае может произойти все что угодно. Покажите вашу инициализацию USART. И все же не помешает по-курить базовую матчасть по кортексам и его NVIC  USART кубом настроен, прерывания выключены, я там ничего не трогал.
|
|
|
|
|
Feb 21 2017, 14:10
|
Частый гость
 
Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107

|
Цитата(Chameleon @ Feb 21 2017, 15:52)  USART кубом настроен, прерывания выключены, я там ничего не трогал. А включить USART не забыли?
|
|
|
|
|
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 и т. п.)
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 21 2017, 15:08
|
Участник

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

|
В таком случае все же придется изучать матчасть и иногда копаться в даташитах ))) Там нет кода инициализации USART. Вы вообще понимаете смысл слова "инициализация"? Короче, покажите код, где USART настраивается на роботу, где настраиваются его регистры и т.п.Исправил. Отладочный код (DEBUG) должен работать практически одинаково с финальным (RELEASE). В крайнем случае он как минимум должен хотя бы работать, в обоих случаях  Я лишь предостерег от граблей, на которые сам наступал в свое время. Кстати, нет никакой нужды удалять отладочный код, для этого есть встроенный в любой компилятор препроцессор (#ifdef #endif и т. п.)Препроцессор - зло. Он не нужен.
|
|
|
|
|
Feb 21 2017, 15:13
|

Профессионал
    
Группа: Свой
Сообщений: 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)  Препроцессор - зло. Он не нужен. Это кто ж такой умный сказал вам такую абсолютную глупость?  #define - это тоже препроцессор, неужели ваша религия не позволяет им тоже пользоваться?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 21 2017, 15:21
|
Участник

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

|
QUOTE (Forger @ Feb 21 2017, 18:13)  Коли вы используете HAL в инициализации USART, то советую и в других функциях по работе с USART использовать HAL. Рекомендую посмотреть в сторону HAL_UART_Transmit Кстати, вызов этой вашей толстой функции происходит только в одном месте или раскидан по всему проекту? Если это так, то срочно переписывайте вашу функцию-самодеятельность под HAL полностью (подробности см. в реализации HAL_UART_Transmit). Это кто ж такой умный сказал вам такую абсолютную глупость?  Я в первую очередь пробовал через HAL_UART_Transmit, нет разницы. Вызовы только в обработчике USB_OTG_Handler. Но я пробовал оставлять только единственный вызов в начале обработчика. Тоже не работает. Препроцессор зло, это аксиома. Не требует доказательств.
|
|
|
|
|
Feb 21 2017, 15:31
|

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

|
Цитата(Chameleon @ Feb 21 2017, 18:21)  Я в первую очередь пробовал через HAL_UART_Transmit, нет разницы. В основном коде ВНЕ прерываний эта функция работает? В бесконечном цикле. В любом случае подобные функции не должны работать таким образом, как у вас. Правильно так: кидать байты строки в некую программную очередь и разрешать передачу, заранее настроив прерывания от USART. Можно даже извратиться на DMA, но это уже детали, не относящиеся к делу... Цитата Препроцессор зло, это аксиома. Не требует доказательств. Весьма сочувствую вашему "вероисповеданию" ... Тонны "магических цифр" по коду - это самый страшный кошмар любого программиста. Поэтому мне всегда грустно видеть, как некоторые "программисты" этот кошмар сознательно воплощают в своей реальности, отказываясь даже от безобидных #define .... Короче, сначала в пустом проекте отладьте нормально работу этой вашей "отладочной" функции и уже потом суйте ее куда планировали. В противном случае все это - бесконечный пинг-понг ...
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 21 2017, 15:46
|
Участник

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

|
В основном коде ВНЕ прерываний эта функция работает? В бесконечном цикле. Да. В любом случае подобные функции не должны работать таким образом, как у вас. Правильно так: кидать байты строки в некую программную очередь и разрешать передачу, заранее настроив прерывания от USART. Так и делаю сейчас. Можно даже извратиться на DMA, но это уже детали, не относящиеся к делу... Весьма сочувствую вашему "вероисповеданию" ... Тонны "магических цифр" по коду - это самый страшный кошмар любого программиста. Поэтому мне всегда грустно видеть, как некоторые "программисты" этот кошмар сознательно воплощают в своей реальности, отказываясь даже от безобидных #define .... #define - > #define -> #define .. еще раз десять вложенных #define и в конце a = 5; Это конечно лучше. Про малоуловимые глюки в макросах и смысла нет говорить. А уж условная компиляция так помогает понять логику работы...
|
|
|
|
|
Feb 21 2017, 15:49
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Feb 21 2017, 21:13)  Кстати, вызов этой вашей толстой функции происходит только в одном месте или раскидан по всему проекту? Если это так, то срочно переписывайте вашу функцию-самодеятельность под HAL полностью (подробности см. в реализации HAL_UART_Transmit). Если человек вызывает такие функции (как в 5-м посте) из ISR ничтоже сумняшеся, то и в остальном коде он мог наделать очевидных глупостей. Например вызывать этот UARTPrint() из ISR и из фоновой задачи без блокировок. Переписывание этого под гал или чего-то другое ничего не даст. Если нет понимания как всё в сумме оно работает..... ЗЫ: теме место - в "помощи начинающему".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|