Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка USART в прерывании
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
toweroff
Боярины, вот ведь какая затыка вышла

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

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

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

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

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



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

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

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

Прерывание
1. RXNE установлен?
1.1 кладем принятый байт во входной буфер
2. TXE установлен?
2.1 Есть в буфере? Отлично, отправляем.
2.2 Буфер пуст? TXEIE=0, запретили прерывание
uriy
А надо ли вам вообще эти прерыания? Что насчет DMA?
На прием DMA в circular mode и проверять буффер либо по таймеру либо когда делать нечего либо по IDLE.
toweroff
Ну, все как всегда - "Дело было не в бобине, раздолбай сидел в кабине")

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);


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

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

Осциллом увидеть сейчас не могу, но хоть в какую сторону посмотреть, что проверить?
uriy
Биты четности и стоп биты одинаково настроены на приемнике и передатчике?
Купите вот эту штуку вместо осцила https://www.aliexpress.com/item/New-USB-SAL...f2-622949730f91
toweroff
Цитата(uriy @ Feb 1 2017, 07:48) *
Биты четности и стоп биты одинаково настроены на приемнике и передатчике?

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

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

Видел такую. Но нацелился на другой вартант, там внутренней памяти больше и триггерные события можно задавать поинтереснее
zltigo
Цитата(toweroff @ Feb 1 2017, 08:23) *
Конечно, флаг PE молчит

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

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

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

Framing error на приемнике как раз и сигнализирует, что во время стоп-битового интервала начался новый фрейм. Это может быть следствие как разных настроек количества стоп-битов, так и разных скоростей. Поэтому, когда на передаче задано 2 стоп-бита, а на приеме один - работать будет, а вот наоборот не всегда.
uriy
Цитата
Поэтому, когда на передаче задано 2 стоп-бита, а на приеме один - работать будет, а вот наоборот не всегда.
Почти согласен, но по-моему в обратную сторону никогда работать не будет. Для STM оказывается можно даже задавать половинную длительность стоп бита.
gerber
Цитата(uriy @ Feb 1 2017, 14:59) *
Почти согласен, но по-моему в обратную сторону никогда работать не будет.

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

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

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.