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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Сломал мозг! 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
ViKo
сообщение Dec 15 2017, 10:09
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 476
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Sergey Abaev @ Dec 15 2017, 12:46) *
Как быть? Может, что-то не хватает?

Не хватает воли плюнуть на HAL, изучить Reference Manual и написать простую программу самостоятельно, не выдергивая из "большого".
Go to the top of the page
 
+Quote Post
Sergey Abaev
сообщение Dec 15 2017, 10:12
Сообщение #3


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

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



Цитата(ViKo @ Dec 15 2017, 13:09) *
Не хватает воли плюнуть на HAL, изучить Reference Manual и написать простую программу самостоятельно, не выдергивая из "большого".


Ну такие ответы от умников я тоже ожидал. Проходите мимо!
Go to the top of the page
 
+Quote Post
x893
сообщение Dec 15 2017, 11:42
Сообщение #4


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

Группа: Свой
Сообщений: 1 228
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Нет понимания работы.
Надо смотреть, что происходит при вызовах HAL_...

Переставьте выше
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_0);
на прием каждого байта и убедитесь, что PE0 дергается при приеме каждого байта.
Ну а дальше нужно логически промоделировать работу процессора и прерываний.

HAL содержит больше бессмысленных операций, поэтому это один путь.
SPL содержит меньше ненужного кода, но нужно больше мозга для использования.
CMSIS минимальное кол-во кода, но мозга ещё больше надо + умение читать RM
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 15 2017, 17:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 659
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Sergey Abaev @ Dec 15 2017, 12:46) *
Суть в том, что прерывание "виснет" когда начинаю бомбить быстро байтами. Как будто захлебывается. Помогает только снятие питания или резет.

Поможет обработка переполнения приемника. Если произойдет переполнение приемника, а соответствующих флаг вы не сбросите,
то будете постоянно находится в прерывании приемника. Подробности в RM.
Go to the top of the page
 
+Quote Post
x893
сообщение Dec 15 2017, 18:04
Сообщение #6


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

Группа: Свой
Сообщений: 1 228
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Можно добавить HAL_UART_ErrorCallback и там отслеживать ошибки мастерства программирования.
Go to the top of the page
 
+Quote Post
sadat
сообщение Dec 15 2017, 18:27
Сообщение #7


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

Группа: Свой
Сообщений: 117
Регистрация: 6-07-05
Из: Белгород
Пользователь №: 6 575



Ну и кто за вас будет сбрасывать всякие ошибки приёма?
Полностью уверен в том, что устанавливается бит ошибки приёмника (а их там несколько) - вот всё и "тухнет".
Go to the top of the page
 
+Quote Post
x893
сообщение Dec 15 2017, 18:48
Сообщение #8


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

Группа: Свой
Сообщений: 1 228
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



HAL их сбрасывает за меня (и за остальных тоже).
Полностью можно быть уверенным после просмотра кода.
Go to the top of the page
 
+Quote Post
pvman
сообщение Dec 15 2017, 19:11
Сообщение #9


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

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



когда "виснет", смотреть состояние флагов usart.
в обработке прерывания проще убрать обработку через HAL, это будет значительно читабельнее и в сотни раз короче и быстрее.
в даташите на пальцах всё расписано, сделать несколько обязательных строчек и всё.

Сообщение отредактировал pvman - Dec 15 2017, 19:11
Go to the top of the page
 
+Quote Post
x893
сообщение Dec 15 2017, 19:16
Сообщение #10


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

Группа: Свой
Сообщений: 1 228
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Так написал же Sergey Abaev, что он не читает RM.
Пусть код индусский изучает.
Видимо и примеры ему тоже смотреть лень.
Сразу в бой с HAL_... - как Чапаев на белом коне.
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Dec 17 2017, 09:36
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 216
Регистрация: 24-06-10
Пользователь №: 58 127



Можно попробовать в прерывании, перед выходом, поставить что то типа сброса всех флагов и ошибок напрямую в регистрах уарта. Скорее всего, как уже было замечено, какой то флаг вам не дает выйти из прерывания ( вернее вы туда тут же влетаете ). Ну или анализируйте, на сколько корректно HAL всё это делает за вас sm.gif
Go to the top of the page
 
+Quote Post
leocat
сообщение Dec 17 2017, 19:31
Сообщение #12


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

Группа: Участник
Сообщений: 95
Регистрация: 12-10-16
Пользователь №: 93 727



Это с какой же частотой UART "бомбить" нужно, чтобы "заклинило". Не знаю, не знаю... У меня 1 мбит/сек на прерываниях ничего не теряет.
Ну и правильно написали: HAL - в топку. Это индусское изделие еще тот гемор.
Ну и если прерывание уже в обработке (для UART например), то повторно его не вызовете. Флаг сбрасывать нужно, ручками. Мало того, если по выходу из прерывания его (флаг) не сбросить ( USART_ClearITPendingBit( USART1, USART_IT_RXNE ); ), то повторно и не сработает.
( пример из SPL )

Сообщение отредактировал leocat - Dec 17 2017, 19:35
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 18 2017, 07:20
Сообщение #13


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

Группа: Свой
Сообщений: 1 218
Регистрация: 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
rakpavel
сообщение Dec 18 2017, 10:15
Сообщение #14





Группа: Новичок
Сообщений: 2
Регистрация: 26-11-12
Пользователь №: 74 566



да, флаг USART_FLAG_ORE -указывает на ошибку переполнения, как раз похоже на случай ТС.
Go to the top of the page
 
+Quote Post
Sergey Abaev
сообщение Dec 18 2017, 17:31
Сообщение #15


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

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



Народ!!!! спасибо всем, кто подсказал. Проблему понял и решил.

Наверно это одна из тупейших тем, но сорри. На то он и форум. Еще раз спасибо за помощь и советы!



Тема закрыта.

Цитата(x893 @ Dec 15 2017, 22:16) *
Так написал же Sergey Abaev, что он не читает RM.
Пусть код индусский изучает.
Видимо и примеры ему тоже смотреть лень.
Сразу в бой с HAL_... - как Чапаев на белом коне.



Это вы зря! Примеров перелопатил много! Просто не понятно, почему так просто можно "подвесить" МК.

Я уже разобрался конечно.

Цитата(adnega @ Dec 15 2017, 20:47) *
Поможет обработка переполнения приемника. Если произойдет переполнение приемника, а соответствующих флаг вы не сбросите,
то будете постоянно находится в прерывании приемника. Подробности в RM.



СПАСИБО!!! Посмотрю RM

Цитата(x893 @ Dec 15 2017, 21:04) *
Можно добавить HAL_UART_ErrorCallback и там отслеживать ошибки мастерства программирования.


Вот это не знал!!!! Что-то не подумал над этим, а действительно!

Спасибо!!

Цитата(sadat @ Dec 15 2017, 21:27) *
Ну и кто за вас будет сбрасывать всякие ошибки приёма?
Полностью уверен в том, что устанавливается бит ошибки приёмника (а их там несколько) - вот всё и "тухнет".



Виноват - я болван rolleyes.gif

Цитата(ViKo @ Dec 15 2017, 13:09) *
Не хватает воли плюнуть на HAL, изучить Reference Manual и написать простую программу самостоятельно, не выдергивая из "большого".


Частично конечно согласен, но форум и знающие люди быстрее направят, а иначе зачем форум. Это конечно не говорит, что я вылез из пещеры и сразу в бой. Но и книги + форум = лучше

Цитата(x893 @ Dec 15 2017, 21:48) *
HAL их сбрасывает за меня (и за остальных тоже).
Полностью можно быть уверенным после просмотра кода.


Да я делал проект через куб, и добавил только, что выше. Просто удивляет, почему так просто можно "подвесить" МК. Но уже все понял! Спасибо!

Цитата(pvman @ Dec 15 2017, 22:11) *
когда "виснет", смотреть состояние флагов usart.
в обработке прерывания проще убрать обработку через HAL, это будет значительно читабельнее и в сотни раз короче и быстрее.
в даташите на пальцах всё расписано, сделать несколько обязательных строчек и всё.


Век живи, век учись! Спасибо, учтем!

Цитата(vlad_new @ Dec 17 2017, 12:36) *
Можно попробовать в прерывании, перед выходом, поставить что то типа сброса всех флагов и ошибок напрямую в регистрах уарта. Скорее всего, как уже было замечено, какой то флаг вам не дает выйти из прерывания ( вернее вы туда тут же влетаете ). Ну или анализируйте, на сколько корректно HAL всё это делает за вас sm.gif



СПАСИБО!!!!!

Цитата(leocat @ Dec 17 2017, 22:31) *
Это с какой же частотой UART "бомбить" нужно, чтобы "заклинило". Не знаю, не знаю... У меня 1 мбит/сек на прерываниях ничего не теряет.
Ну и правильно написали: HAL - в топку. Это индусское изделие еще тот гемор.
Ну и если прерывание уже в обработке (для UART например), то повторно его не вызовете. Флаг сбрасывать нужно, ручками. Мало того, если по выходу из прерывания его (флаг) не сбросить ( USART_ClearITPendingBit( USART1, USART_IT_RXNE ); ), то повторно и не сработает.
( пример из SPL )


115200, где-то получалось около 720 байт в сек. Наверно это немного.

Но как я понял, принимает он без проблем, всё успевает. А вот назад, в сторону компа - затыкается. И видимо я не ждал окончания отправки. И как-то все висло!

Цитата(juvf @ Dec 18 2017, 10:20) *
Вставал на подобную граблю. Не знаю, может вам это поможет.... St сделали багу закладку, чтоб не всё так сладко было, и оформили её как фичу, имхо. Суть в том, что прерывание RXNEIE срабатывает не только когда RXNE==1, но и ИЛИ когда ORE==1. У меня было так, что один раз когда нибудь встанет флаг ORE, и я зависал навечно в прерывании RXNEIE. Вы в одном обработчике должны проверять оба флага и делать соответствующее ветвление, ну и соответственно сбрасывать флаг ORE.


Спасибо, проверю!!!

Цитата(rakpavel @ Dec 18 2017, 13:15) *
да, флаг USART_FLAG_ORE -указывает на ошибку переполнения, как раз похоже на случай ТС.



Спасибо! Спасибо!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2018 - 14:13
Рейтинг@Mail.ru


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