stm32f4 usart приём данных в прерывании и DMA

Кто любит RISC в жизни, заходим, не стесняемся.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

stm32f4 usart приём данных в прерывании и DMA

Сообщение ivan dimir »

У меня вопрос к спецам.Почему в некоторых исходниках пишут флаги ошибок.А некоторые не пишут.И как правильно эти флаги выставлять и сбрасывать?
Реклама
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение tonyk »

Флаги ошибок выставляет аппаратура. Как и где обрабатывать зависит от того, что ты передаёшь-принимаешь. Например, в Модбас пакет содержит контрольную сумму, поэтому мне без разницы, по какой причине исказился пакет, шум в линии или DMA не смог переслать байт. Я просто сбрасываю все ошибки, отбрасываю пакет с ошибкой и жду следующий.
А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача.
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение ivan dimir »

Вы имеете виду.Что программно не выставляются эти флаги?Как при приёме так и при передаче пакетов?

Добавлено after 1 minute 41 second:
А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете?
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение tonyk »

Вы имеете виду.Что программно не выставляются эти флаги?Как при приёме так и при передаче пакетов?
Ты даташит читал?
А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете?
Считаю в мастере, сколько запросов к узлу отправил и сколько получил на них ответов с ошибками. Причём, ошибку при неответе узла фиксирую только тогда, когда из 3 запросов хотя бы на один был ответ. Тогда сразу добавляю к счётчику ошибок количество неответов. А то выключат оборудование, оно перестанет отвечать и чё, каждый неответ отмечать как ошибку обмена?
В слэйвах считаю количество принятых пакетов в свой адрес и количество битых пакетов.
Реклама
Эиком - электронные компоненты и радиодетали
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение ivan dimir »

А пример?Можешь показать.

Добавлено after 50 seconds:
RM?
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Dimon456 »

ivan dimir писал(а):А пример?Можешь показать.
На своем компе нажмите Пуск->Все программы->Стандартные->Командная строка или по поиску найдите "Командная строка".
Откройте ее.
Нажмите клавишу Enter. В ответ вам приходит какой-то вразумительный ответ.

Пойдет пример?

Анализ ответа.
Я не знаю как в DMA это сделать, а в прерывании делается примерно так:
Каждый ответ, назовем его пакет, пакет данных, либо с какого-то символа начинается, либо каким-то символом заканчивается.
Вот, к примеру, образец:
Спойлер$GNGGA,,,,,,0,00,99.99,,,,,,*56
$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
$GPGSV,1,1,02,08,,,36,27,,,40*77
$GLGSV,1,1,00*65
$GNGLL,,,,,,V,N*7A
$GNRMC,070422.53,V,,,,,,,,,,N*66
$GNVTG,,,,,,,,,N*2E
$GNGGA,070422.53,,,,,0,00,99.99,,,,,,*7D
$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
в данном примере каждый пакет начинается с символа $.
В прерывании анализируем каждый символ, ждем начала строки, к примеру так
Спойлер

Код: Выделить всё

if(data=='$'){ByteCount=0;ComaPoint=0xff;MsgTxt=(char*)&MsgType; return;} //ждем начала строки
Продолжаем принимать байты пакета и анализировать.
Далее идет анализ заголовка.
Первый символ отбрасываем G, он не нужен, для анализа нужны следующие 4 символа, пример
Спойлер

Код: Выделить всё

ByteCount++;
if(ByteCount<=1)        return;                                                         //
if(ByteCount<6&&ByteCount>1)            //берем 4 символа заголовка
        {
        *MsgTxt=data;   //и делаем из него число                                        
        MsgTxt++;
        return;
        }  
Когда заголовок будет собран, отправляем его на ... что там надо с ним сделать
Спойлер

Код: Выделить всё

switch(MsgType)
        {       
        case    0x434D524E:                             //GNRMC 
                  //  тут что-то делаем
                return;
Допусти анализируем дальнейший пакет этого заголовка
Спойлер

Код: Выделить всё

   
        case    0x434D524E:                             //GNRMC 
                if(data==',') {ComaPoint++;     CharPoint=0;RMC[ComaPoint][0]=0;return;}
                if(data=='*') {MsgType=0;return;}
                if(RMC[ComaPoint])RMC[ComaPoint][CharPoint++]=data;
                RMC[ComaPoint][CharPoint]=0;
                return;
Анализ будет продолжаться до тех пор пока либо запас счетчика не закончится либо не придет следующий символ $
Спойлер

Код: Выделить всё

if(data=='$'){ByteCount=0;ComaPoint=0xff;MsgTxt=(char*)&MsgType; return;} //ждем начала строки
if(ByteCount==0xff) return;
ByteCount++;
Устроит пример?

Каждый подходит к этому по своему, в зависимости от поставленной задачи.
Реклама
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение tonyk »

Dimon456 писал(а):Пойдет пример?
Где в этом примере показана работа ПДП? Речь в посте про ошибке при обмене с использованием ПДП.

У меня ПДП обслуживает Модбас. Если нужен текстовый ввод-вывод, то это другая пьянка. И да, полноценно использовать DMA получится только в МК с полноценным UART, а не огрызком как в F103. Если у тебя обработка информации от UART является основной деятельностью программы и занимает много времени, то смотри в сторону МК с полноценным UART. Для понимания того, о чём я сказал, сравни возможности UART в F103 и, например, в F091 и F745.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Dimon456 »

tonyk, про какие ошибки вы торочите? Это не I2C, что бы можно было анализировать ошибки конфликта шины.
То что он UART настроил на 19200, а узел отправляет на 57600 - разве это ошибка?

В конце каждого пакета узел может отправлять вам какую нибудь контрольную сумму, и если на стороне приема контрольная сумма не совпала, вы можете считать это за ошибку. В большинстве случаев используются выводы rx tx.
А то что провод на половину припаян, да еще и болтается в воздухе, то есть контакт то нету контакта, какие тут ошибки будут?

Без озвучивания ТЗ вы даже не знаете что ТС нужно.

Ему был нужен пример, я дал пример. У ТС во всем ошибки и да же тут.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение tonyk »

tonyk, про какие ошибки вы торочите? Это не I2C, что бы можно было анализировать ошибки конфликта шины.
Про те ошибки, что указаны для UART. Их там с десяток. Плюс ошибки DMA. Перечень есть в RM.
Анализировать ошибки полезно, потому что они характеризуют качество связи, что очень нелишне в процессе наладки и поиска неисправностей в процессе эксплуатации.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение ivan dimir »

Всё так аморфно.Пример приёма строки по прерыванию USART?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Dimon456 »

tonyk, как все предсказуемо
ivan dimir писал(а):Пример приёма строки по прерыванию USART?
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение tonyk »

[uquote="ivan dimir",url="/forum/viewtopic.php?p=4088976#p4088976"]Всё так аморфно.Пример приёма строки по прерыванию USART?[/uquote]
Тебя во всех поисковиках забанили? Ваще народ обленился.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Eddy_Em »

В сниппетах от ST под F0 есть примеры работы USART с DMA, оттуда легко портировать на любую серию при помощи минимума чтения RM.
Но, видимо, ТС — не читатель.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение ivan dimir »

[uquote="tonyk",url="/forum/viewtopic.php?p=4089101#p4089101"][uquote="ivan dimir",url="/forum/viewtopic.php?p=4088976#p4088976"]Всё так аморфно.Пример приёма строки по прерыванию USART?[/uquote]
Тебя во всех поисковиках забанили? Ваще народ обленился.[/uquote]
Неправда Только в Паяльнике.Скажите а зачем форумы?

Добавлено after 22 minutes 24 seconds:
А вообще я понял так пока сам не сконструируешь(не настроишь) не поймёшь.По прощче.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Dimon456 »

usart+DMA целесообразно применять там где передаются килобайтные пакеты, между которыми есть интервал что бы можно было применить прерывание IDLE.

А что тебе конкретно нужно, х... тебя знает.

Для начало ТЗ озвучь, что бы тебе начали помогать.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение ivan dimir »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4089337#p4089337"]usart+DMA целесообразно применять там где передаются килобайтные пакеты, между которыми есть интервал что бы можно было применить прерывание IDLE.

А что тебе конкретно нужно, х... тебя знает.

Для начало ТЗ озвучь, что бы тебе начали помогать.[/uquote]
Что за такое прерывание usart IDLE.? И можно ли одновременно настраивать прерывание по usart и дма? чтобы передать по ДМА?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Dimon456 »

ТЗ озвучь.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Eddy_Em »

В общем случае по DMA только передачу удобно делать, т.к. прием - неизвестно какой длины. А чтобы и прием организовать по DMA, как уже сказали, нужно прерывание IDLE использовать, т.е. уже какой-то уродский модбас получается с обязательными паузами в конце пакета данных.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Dimon456 »

ivan dimir, ну как успехи в освоении?
Вот тебе паказуха
СпойлерUSART DMA-tx IRQ-rx
И вот шпротеус, поиграться
uart_test.zip
(17.99 КБ) 143 скачивания
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32f4 usart приём данных в прерывании и DMA

Сообщение Eddy_Em »

Под F103 с DMA только на прием и я могу пример показать.
А под F0 интересней: там есть прерывание по символу, так что, можно и на прием DMA использовать без необходимости вводить паузы между пакетами: просто по '\n' будет вызываться прерывание, которое и выставит флаг готовности принятой строки, заодно поменяв приемный буфер на второй (при двойной буферизации, а при желании и куче оперативки можно хоть 100 буферов выделить).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Ответить

Вернуться в «ARM»