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

 
 
> Сломал мозг! STM32F107VCT6, прерывание, USART2
Sergey Abaev
сообщение Dec 15 2017, 09:46
Сообщение #1


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

Группа: Участник
Сообщений: 91
Регистрация: 4-01-10
Из: Москва
Пользователь №: 54 631



Есть программка для выявления проблемы.

Простое usart эхо, принимает байты - срабатывает прерывание и отправляет hello назад.

Сам код может быть странный, но суть не в этом. Выдернули из большого.

Суть в том, что прерывание "виснет" когда начинаю бомбить быстро байтами. Как будто захлебывается. Помогает только снятие питания или резет.

и срабатывает строка "if(HAL_UART_Receive_IT(&huart1, &rcv, 1)!=HAL_OK)"

Как быть? В чем проблема?

Сразу для ответов "гугли", "читай RM" и прочих ... проходим мимо!

Я хочу получить ответ, о тех, кто действительно умный и знает, как решить проблему, кто уже сталкивался с этим.

Код
....
UART_HandleTypeDef huart1;
....
char rcv;
volatile int rcvd;
....
....
int main(void)
{
...
  MX_USART1_UART_Init();
...
  while (1)
  {
        if(rcvd)
        {
            HAL_GPIO_WritePin(Led_GPIO_Port, Led_Pin, GPIO_PIN_SET);
            rcvd = 0;
            HAL_UART_Transmit(&huart1, "Hello!\r\n", 8, 0xFFFF);
            HAL_GPIO_WritePin(Led_GPIO_Port, Led_Pin, GPIO_PIN_RESET);
        }
  }
}

....
....
....
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &huart1)
    {
        if(rcv == '\n') rcvd = 1;

        if(HAL_UART_Receive_IT(&huart1, &rcv, 1)!=HAL_OK)
        {
            HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_0);
        }
    }
}
...
...
...


Сообщение отредактировал Sergey Abaev - Dec 15 2017, 12:53
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
juvf
сообщение Dec 18 2017, 07:20
Сообщение #2


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Sergey Abaev @ Dec 15 2017, 14:46) *
Суть в том, что прерывание "виснет" когда начинаю бомбить быстро байтами. Как будто захлебывается. Помогает только снятие питания или резет.
Вставал на подобную граблю. Не знаю, может вам это поможет.... St сделали багу закладку, чтоб не всё так сладко было, и оформили её как фичу, имхо. Суть в том, что прерывание RXNEIE срабатывает не только когда RXNE==1, но и ИЛИ когда ORE==1. У меня было так, что один раз когда нибудь встанет флаг ORE, и я зависал навечно в прерывании RXNEIE. Вы в одном обработчике должны проверять оба флага и делать соответствующее ветвление, ну и соответственно сбрасывать флаг ORE.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sergey Abaev   Сломал мозг! STM32F107VCT6, прерывание, USART2   Dec 15 2017, 09:46
- - ViKo   Цитата(Sergey Abaev @ Dec 15 2017, 12:46)...   Dec 15 2017, 10:09
|- - Sergey Abaev   Цитата(ViKo @ Dec 15 2017, 13:09) Не хват...   Dec 15 2017, 10:12
- - x893   Нет понимания работы. Надо смотреть, что происходи...   Dec 15 2017, 11:42
- - adnega   Цитата(Sergey Abaev @ Dec 15 2017, 12:46)...   Dec 15 2017, 17:47
- - x893   Можно добавить HAL_UART_ErrorCallback и там отслеж...   Dec 15 2017, 18:04
- - sadat   Ну и кто за вас будет сбрасывать всякие ошибки при...   Dec 15 2017, 18:27
- - x893   HAL их сбрасывает за меня (и за остальных тоже). П...   Dec 15 2017, 18:48
- - pvman   когда "виснет", смотреть состояние флаго...   Dec 15 2017, 19:11
- - x893   Так написал же Sergey Abaev, что он не читает RM. ...   Dec 15 2017, 19:16
- - vlad_new   Можно попробовать в прерывании, перед выходом, пос...   Dec 17 2017, 09:36
|- - leocat   Это с какой же частотой UART "бомбить" н...   Dec 17 2017, 19:31
- - rakpavel   да, флаг USART_FLAG_ORE -указывает на ошибку пере...   Dec 18 2017, 10:15
- - Sergey Abaev   Народ!!!! спасибо всем, кто подска...   Dec 18 2017, 17:31
- - ViKo   Так в чем ошибка была?   Dec 18 2017, 18:41


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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 05:08
Рейтинг@Mail.ru


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