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

 
 
 
Reply to this topicStart new topic
> Обработка USART в прерывании, когда их много
toweroff
сообщение Jan 28 2017, 20:14
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Боярины, вот ведь какая затыка вышла

Со всякими STM вроде как работало, но огульный (почти) копипаст ввел в ступор.
Несколько UART на одном прерывании (с 3 по 8)
сколько видел примеров - оно вот так (явно для одного):

Функция передачи
1. Смотрим на шайтан-флаг, если нормально: пишем в регистр, устанавливаем флаг прерывания. Если нет - кладем в буфер(если есть, куда положить). Шайтан-флаг в "мы запендюрили". Вернуни ок/плох

Прерывание
1. Есть в буфере? Отлично, отправляем.
2. Буфер пуст? Шайтан-флаг взлетел. Запретили прерывание

у меня каждый USART со своими буферами описан, унифицированно
но вот хрень - у какого-то USART закончилась очередь передачи - так он из той же уни-функции и запретит прерывание остальным

пните ногой у кого есть, сегодня совсем день тяжелый... победить быстро нужно



Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 28 2017, 20:51
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(toweroff @ Jan 29 2017, 01:14) *
но вот хрень - у какого-то USART закончилась очередь передачи - так он из той же уни-функции и запретит прерывание остальным

Запрещать надо не общее прерывание, а прерывание по TXE данного UART-а. Думаю, что такой флаг обязан быть, если несколько UART-ов на одном прерывании.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 29 2017, 08:06
Сообщение #3


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Ваш шайтан-флаг фактически есть инверсия TXEIE.

Функция передачи
1. кладем в буфер, TXEIE = 1 (разрешаем прерывания от TXE)

Прерывание
1. RXNE установлен?
1.1 кладем принятый байт во входной буфер
2. TXE установлен?
2.1 Есть в буфере? Отлично, отправляем.
2.2 Буфер пуст? TXEIE=0, запретили прерывание


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
uriy
сообщение Jan 29 2017, 16:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



А надо ли вам вообще эти прерыания? Что насчет DMA?
На прием DMA в circular mode и проверять буффер либо по таймеру либо когда делать нечего либо по IDLE.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 30 2017, 07:27
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Ну, все как всегда - "Дело было не в бобине, раздолбай сидел в кабине")

AHTOXA, у меня и выключался/включался TXEIE, тут порядок. Что-то я зациклился на этом общем прерывании, но флаги-то эти разные для каждого USART
SSerge, а ведь и правда. Переделал, спасибо. Кусок, похоже, тянулся от LPC, там такой фокус не получался, насколько я помню
uriy, спасибо за наводку. Почитаю DMA

а дело было в том, что функция передачи, если буфер полон, сидела и ждала сигнала от прерывания, что в буфере есть место
Код
    if (COM_BUF_FULL_OUT(*COM))
    {
        osSignalWait(TASK_USART_TRSMT_FLAG, osWaitForever);
    }

так просто банально задачу-то, которая должна схватить флаг, я не указывал sm.gif

Код
    if (COM_BUF_FULL_OUT(*COM))
    {
        COM->taskT = osThreadGetId();
        osSignalWait(TASK_USART_TRSMT_FLAG, osWaitForever);
    }

ну и в прерывании, соответственно
Код
    if (COM->taskT != 0) osSignalSet(COM->taskT, TASK_USART_TRSMT_FLAG);


и все зашевелилось
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 31 2017, 18:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Не буду новую тему плодить, спрошу здесь

Постоянно (процентов 90-95%) при приеме ловлю флаг FE (ISR, Bit 1 FE: Framing error)
UART->BRR = APB/baudrate
Тестовые условия -USB-232, который постоянно мне шлет короткие посылки по 5 байт на 9600 8E1
ST3232 с 0.1мкФ емкостями

Осциллом увидеть сейчас не могу, но хоть в какую сторону посмотреть, что проверить?
Go to the top of the page
 
+Quote Post
uriy
сообщение Feb 1 2017, 04:48
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Биты четности и стоп биты одинаково настроены на приемнике и передатчике?
Купите вот эту штуку вместо осцила https://www.aliexpress.com/item/New-USB-SAL...f2-622949730f91
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 1 2017, 06:23
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(uriy @ Feb 1 2017, 07:48) *
Биты четности и стоп биты одинаково настроены на приемнике и передатчике?

Конечно, флаг PE молчит

Цитата(uriy @ Feb 1 2017, 07:48) *
Купите вот эту штуку вместо осцила https://www.aliexpress.com/item/New-USB-SAL...f2-622949730f91

Видел такую. Но нацелился на другой вартант, там внутренней памяти больше и триггерные события можно задавать поинтереснее
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 1 2017, 07:16
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(toweroff @ Feb 1 2017, 08:23) *
Конечно, флаг PE молчит

При нарушении фрейма до четности дело не доходит. Так что:
1) Проверяете установки четности и разрядости.
2) два стопбита на передающей стороне установите для поверки.

Цитата(uriy @ Feb 1 2017, 06:48) *
Биты четности и стоп биты одинаково настроены на приемнике и передатчике?

Стопбиты относятся только к передатчику, так что говорить об одинаковости настроек не приходится вообще.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
gerber
сообщение Feb 1 2017, 07:42
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(zltigo @ Feb 1 2017, 10:16) *
Стопбиты относятся только к передатчику, так что говорить об одинаковости настроек не приходится вообще.

Framing error на приемнике как раз и сигнализирует, что во время стоп-битового интервала начался новый фрейм. Это может быть следствие как разных настроек количества стоп-битов, так и разных скоростей. Поэтому, когда на передаче задано 2 стоп-бита, а на приеме один - работать будет, а вот наоборот не всегда.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
uriy
сообщение Feb 1 2017, 11:59
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Цитата
Поэтому, когда на передаче задано 2 стоп-бита, а на приеме один - работать будет, а вот наоборот не всегда.
Почти согласен, но по-моему в обратную сторону никогда работать не будет. Для STM оказывается можно даже задавать половинную длительность стоп бита.
Go to the top of the page
 
+Quote Post
gerber
сообщение Feb 1 2017, 12:07
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(uriy @ Feb 1 2017, 14:59) *
Почти согласен, но по-моему в обратную сторону никогда работать не будет.

Отчего же, если пауза между фреймами более 1 битового интервала, то работать будет - приемник воспримет эту паузу как продолжение стоп-бита, только и всего.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 1 2017, 12:28
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



В общем воткнул в аппаратный COMport - никаких ошибок. Китайский шнур выбросил в помойку
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 1 2017, 14:14
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(gerber @ Feb 1 2017, 14:07) *
Отчего же, если пауза между фреймами более 1 битового интервала, то работать будет - приемник воспримет эту паузу как продолжение стоп-бита, только и всего.

Именно так. "Стоп" это гарантированная минимальная пауза между посылками для компенсации разбега скоростей. Максимальная абсолютно любая, хоть 100 лет по времени.
Так что если UART работает с одним стопом, то будет работать и с полутора и с двумя и с 200000000 в любых комбинациях.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 07:04
Рейтинг@Mail.ru


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