stm32f4 usart приём данных в прерывании и DMA
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
stm32f4 usart приём данных в прерывании и DMA
У меня вопрос к спецам.Почему в некоторых исходниках пишут флаги ошибок.А некоторые не пишут.И как правильно эти флаги выставлять и сбрасывать?
- Реклама
Re: stm32f4 usart приём данных в прерывании и DMA
Флаги ошибок выставляет аппаратура. Как и где обрабатывать зависит от того, что ты передаёшь-принимаешь. Например, в Модбас пакет содержит контрольную сумму, поэтому мне без разницы, по какой причине исказился пакет, шум в линии или DMA не смог переслать байт. Я просто сбрасываю все ошибки, отбрасываю пакет с ошибкой и жду следующий.
А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача.
А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 usart приём данных в прерывании и DMA
Вы имеете виду.Что программно не выставляются эти флаги?Как при приёме так и при передаче пакетов?
Добавлено after 1 minute 41 second:
А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете?
Добавлено after 1 minute 41 second:
А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете?
Re: stm32f4 usart приём данных в прерывании и DMA
Ты даташит читал?Вы имеете виду.Что программно не выставляются эти флаги?Как при приёме так и при передаче пакетов?
Считаю в мастере, сколько запросов к узлу отправил и сколько получил на них ответов с ошибками. Причём, ошибку при неответе узла фиксирую только тогда, когда из 3 запросов хотя бы на один был ответ. Тогда сразу добавляю к счётчику ошибок количество неответов. А то выключат оборудование, оно перестанет отвечать и чё, каждый неответ отмечать как ошибку обмена?А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете?
В слэйвах считаю количество принятых пакетов в свой адрес и количество битых пакетов.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 usart приём данных в прерывании и DMA
А пример?Можешь показать.
Добавлено after 50 seconds:
RM?
Добавлено after 50 seconds:
RM?
- Реклама
Re: stm32f4 usart приём данных в прерывании и DMA
На своем компе нажмите Пуск->Все программы->Стандартные->Командная строка или по поиску найдите "Командная строка".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++;Каждый подходит к этому по своему, в зависимости от поставленной задачи.
Re: stm32f4 usart приём данных в прерывании и DMA
Где в этом примере показана работа ПДП? Речь в посте про ошибке при обмене с использованием ПДП.Dimon456 писал(а):Пойдет пример?
У меня ПДП обслуживает Модбас. Если нужен текстовый ввод-вывод, то это другая пьянка. И да, полноценно использовать DMA получится только в МК с полноценным UART, а не огрызком как в F103. Если у тебя обработка информации от UART является основной деятельностью программы и занимает много времени, то смотри в сторону МК с полноценным UART. Для понимания того, о чём я сказал, сравни возможности UART в F103 и, например, в F091 и F745.
Re: stm32f4 usart приём данных в прерывании и DMA
tonyk, про какие ошибки вы торочите? Это не I2C, что бы можно было анализировать ошибки конфликта шины.
То что он UART настроил на 19200, а узел отправляет на 57600 - разве это ошибка?
В конце каждого пакета узел может отправлять вам какую нибудь контрольную сумму, и если на стороне приема контрольная сумма не совпала, вы можете считать это за ошибку. В большинстве случаев используются выводы rx tx.
А то что провод на половину припаян, да еще и болтается в воздухе, то есть контакт то нету контакта, какие тут ошибки будут?
Без озвучивания ТЗ вы даже не знаете что ТС нужно.
Ему был нужен пример, я дал пример. У ТС во всем ошибки и да же тут.
То что он UART настроил на 19200, а узел отправляет на 57600 - разве это ошибка?
В конце каждого пакета узел может отправлять вам какую нибудь контрольную сумму, и если на стороне приема контрольная сумма не совпала, вы можете считать это за ошибку. В большинстве случаев используются выводы rx tx.
А то что провод на половину припаян, да еще и болтается в воздухе, то есть контакт то нету контакта, какие тут ошибки будут?
Без озвучивания ТЗ вы даже не знаете что ТС нужно.
Ему был нужен пример, я дал пример. У ТС во всем ошибки и да же тут.
Re: stm32f4 usart приём данных в прерывании и DMA
Про те ошибки, что указаны для UART. Их там с десяток. Плюс ошибки DMA. Перечень есть в RM.tonyk, про какие ошибки вы торочите? Это не I2C, что бы можно было анализировать ошибки конфликта шины.
Анализировать ошибки полезно, потому что они характеризуют качество связи, что очень нелишне в процессе наладки и поиска неисправностей в процессе эксплуатации.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 usart приём данных в прерывании и DMA
Всё так аморфно.Пример приёма строки по прерыванию USART?
Re: stm32f4 usart приём данных в прерывании и DMA
tonyk, как все предсказуемо
ivan dimir писал(а):Пример приёма строки по прерыванию USART?
Re: stm32f4 usart приём данных в прерывании и DMA
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4088976#p4088976"]Всё так аморфно.Пример приёма строки по прерыванию USART?[/uquote]
Тебя во всех поисковиках забанили? Ваще народ обленился.
Тебя во всех поисковиках забанили? Ваще народ обленился.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32f4 usart приём данных в прерывании и DMA
В сниппетах от ST под F0 есть примеры работы USART с DMA, оттуда легко портировать на любую серию при помощи минимума чтения RM.
Но, видимо, ТС — не читатель.
Но, видимо, ТС — не читатель.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 usart приём данных в прерывании и DMA
[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:
А вообще я понял так пока сам не сконструируешь(не настроишь) не поймёшь.По прощче.
Тебя во всех поисковиках забанили? Ваще народ обленился.[/uquote]
Неправда Только в Паяльнике.Скажите а зачем форумы?
Добавлено after 22 minutes 24 seconds:
А вообще я понял так пока сам не сконструируешь(не настроишь) не поймёшь.По прощче.
Re: stm32f4 usart приём данных в прерывании и DMA
usart+DMA целесообразно применять там где передаются килобайтные пакеты, между которыми есть интервал что бы можно было применить прерывание IDLE.
А что тебе конкретно нужно, х... тебя знает.
Для начало ТЗ озвучь, что бы тебе начали помогать.
А что тебе конкретно нужно, х... тебя знает.
Для начало ТЗ озвучь, что бы тебе начали помогать.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 usart приём данных в прерывании и DMA
[uquote="Dimon456",url="/forum/viewtopic.php?p=4089337#p4089337"]usart+DMA целесообразно применять там где передаются килобайтные пакеты, между которыми есть интервал что бы можно было применить прерывание IDLE.
А что тебе конкретно нужно, х... тебя знает.
Для начало ТЗ озвучь, что бы тебе начали помогать.[/uquote]
Что за такое прерывание usart IDLE.? И можно ли одновременно настраивать прерывание по usart и дма? чтобы передать по ДМА?
А что тебе конкретно нужно, х... тебя знает.
Для начало ТЗ озвучь, что бы тебе начали помогать.[/uquote]
Что за такое прерывание usart IDLE.? И можно ли одновременно настраивать прерывание по usart и дма? чтобы передать по ДМА?
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32f4 usart приём данных в прерывании и DMA
В общем случае по DMA только передачу удобно делать, т.к. прием - неизвестно какой длины. А чтобы и прием организовать по DMA, как уже сказали, нужно прерывание IDLE использовать, т.е. уже какой-то уродский модбас получается с обязательными паузами в конце пакета данных.
Re: stm32f4 usart приём данных в прерывании и DMA
ivan dimir, ну как успехи в освоении?
Вот тебе паказуха
И вот шпротеус, поиграться
Вот тебе паказуха
Спойлер
USART DMA-tx IRQ-rx- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32f4 usart приём данных в прерывании и DMA
Под F103 с DMA только на прием и я могу пример показать.
А под F0 интересней: там есть прерывание по символу, так что, можно и на прием DMA использовать без необходимости вводить паузы между пакетами: просто по '\n' будет вызываться прерывание, которое и выставит флаг готовности принятой строки, заодно поменяв приемный буфер на второй (при двойной буферизации, а при желании и куче оперативки можно хоть 100 буферов выделить).
А под F0 интересней: там есть прерывание по символу, так что, можно и на прием DMA использовать без необходимости вводить паузы между пакетами: просто по '\n' будет вызываться прерывание, которое и выставит флаг готовности принятой строки, заодно поменяв приемный буфер на второй (при двойной буферизации, а при желании и куче оперативки можно хоть 100 буферов выделить).


