| Форум РадиоКот https://radiokot.ru/forum/ |
|
| stm32f4 usart приём данных в прерывании и DMA https://radiokot.ru/forum/viewtopic.php?f=59&t=178401 |
Страница 1 из 2 |
| Автор: | ivan dimir [ Чт авг 26, 2021 21:34:40 ] |
| Заголовок сообщения: | stm32f4 usart приём данных в прерывании и DMA |
У меня вопрос к спецам.Почему в некоторых исходниках пишут флаги ошибок.А некоторые не пишут.И как правильно эти флаги выставлять и сбрасывать? |
|
| Автор: | tonyk [ Пт авг 27, 2021 05:59:09 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Флаги ошибок выставляет аппаратура. Как и где обрабатывать зависит от того, что ты передаёшь-принимаешь. Например, в Модбас пакет содержит контрольную сумму, поэтому мне без разницы, по какой причине исказился пакет, шум в линии или DMA не смог переслать байт. Я просто сбрасываю все ошибки, отбрасываю пакет с ошибкой и жду следующий. А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. |
|
| Автор: | ivan dimir [ Пт авг 27, 2021 07:21:44 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Вы имеете виду.Что программно не выставляются эти флаги?Как при приёме так и при передаче пакетов? Добавлено after 1 minute 41 second: А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете? |
|
| Автор: | tonyk [ Пт авг 27, 2021 09:04:16 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Цитата: Вы имеете виду.Что программно не выставляются эти флаги?Как при приёме так и при передаче пакетов? Ты даташит читал? Цитата: А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете? Считаю в мастере, сколько запросов к узлу отправил и сколько получил на них ответов с ошибками. Причём, ошибку при неответе узла фиксирую только тогда, когда из 3 запросов хотя бы на один был ответ. Тогда сразу добавляю к счётчику ошибок количество неответов. А то выключат оборудование, оно перестанет отвечать и чё, каждый неответ отмечать как ошибку обмена? В слэйвах считаю количество принятых пакетов в свой адрес и количество битых пакетов. |
|
| Автор: | ivan dimir [ Пт авг 27, 2021 22:21:46 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
А пример?Можешь показать. Добавлено after 50 seconds: RM? |
|
| Автор: | Dimon456 [ Вс авг 29, 2021 07:37:11 ] |
| Заголовок сообщения: | 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++; Каждый подходит к этому по своему, в зависимости от поставленной задачи. |
|
| Автор: | tonyk [ Вс авг 29, 2021 10:16:22 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Dimon456 писал(а): Пойдет пример? Где в этом примере показана работа ПДП? Речь в посте про ошибке при обмене с использованием ПДП. У меня ПДП обслуживает Модбас. Если нужен текстовый ввод-вывод, то это другая пьянка. И да, полноценно использовать DMA получится только в МК с полноценным UART, а не огрызком как в F103. Если у тебя обработка информации от UART является основной деятельностью программы и занимает много времени, то смотри в сторону МК с полноценным UART. Для понимания того, о чём я сказал, сравни возможности UART в F103 и, например, в F091 и F745. |
|
| Автор: | Dimon456 [ Вс авг 29, 2021 10:42:04 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
tonyk, про какие ошибки вы торочите? Это не I2C, что бы можно было анализировать ошибки конфликта шины. То что он UART настроил на 19200, а узел отправляет на 57600 - разве это ошибка? В конце каждого пакета узел может отправлять вам какую нибудь контрольную сумму, и если на стороне приема контрольная сумма не совпала, вы можете считать это за ошибку. В большинстве случаев используются выводы rx tx. А то что провод на половину припаян, да еще и болтается в воздухе, то есть контакт то нету контакта, какие тут ошибки будут? Без озвучивания ТЗ вы даже не знаете что ТС нужно. Ему был нужен пример, я дал пример. У ТС во всем ошибки и да же тут. |
|
| Автор: | tonyk [ Вс авг 29, 2021 14:32:18 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Цитата: tonyk, про какие ошибки вы торочите? Это не I2C, что бы можно было анализировать ошибки конфликта шины. Про те ошибки, что указаны для UART. Их там с десяток. Плюс ошибки DMA. Перечень есть в RM. Анализировать ошибки полезно, потому что они характеризуют качество связи, что очень нелишне в процессе наладки и поиска неисправностей в процессе эксплуатации. |
|
| Автор: | ivan dimir [ Чт сен 09, 2021 22:40:46 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Всё так аморфно.Пример приёма строки по прерыванию USART? |
|
| Автор: | Dimon456 [ Пт сен 10, 2021 08:33:42 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
tonyk, как все предсказуемо ivan dimir писал(а): Пример приёма строки по прерыванию USART?
|
|
| Автор: | tonyk [ Пт сен 10, 2021 11:00:18 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Всё так аморфно.Пример приёма строки по прерыванию USART? Тебя во всех поисковиках забанили? Ваще народ обленился. |
|
| Автор: | Eddy_Em [ Пт сен 10, 2021 11:08:01 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
В сниппетах от ST под F0 есть примеры работы USART с DMA, оттуда легко портировать на любую серию при помощи минимума чтения RM. Но, видимо, ТС — не читатель. |
|
| Автор: | ivan dimir [ Пт сен 10, 2021 19:39:29 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Всё так аморфно.Пример приёма строки по прерыванию USART? Тебя во всех поисковиках забанили? Ваще народ обленился. Неправда Только в Паяльнике.Скажите а зачем форумы? Добавлено after 22 minutes 24 seconds: А вообще я понял так пока сам не сконструируешь(не настроишь) не поймёшь.По прощче. |
|
| Автор: | Dimon456 [ Пт сен 10, 2021 19:53:22 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
usart+DMA целесообразно применять там где передаются килобайтные пакеты, между которыми есть интервал что бы можно было применить прерывание IDLE. А что тебе конкретно нужно, х... тебя знает. Для начало ТЗ озвучь, что бы тебе начали помогать. |
|
| Автор: | ivan dimir [ Пт сен 10, 2021 20:31:58 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
usart+DMA целесообразно применять там где передаются килобайтные пакеты, между которыми есть интервал что бы можно было применить прерывание IDLE. А что тебе конкретно нужно, х... тебя знает. Для начало ТЗ озвучь, что бы тебе начали помогать. Что за такое прерывание usart IDLE.? И можно ли одновременно настраивать прерывание по usart и дма? чтобы передать по ДМА? |
|
| Автор: | Dimon456 [ Сб сен 11, 2021 07:22:43 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
ТЗ озвучь. |
|
| Автор: | Eddy_Em [ Сб сен 11, 2021 13:25:45 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
В общем случае по DMA только передачу удобно делать, т.к. прием - неизвестно какой длины. А чтобы и прием организовать по DMA, как уже сказали, нужно прерывание IDLE использовать, т.е. уже какой-то уродский модбас получается с обязательными паузами в конце пакета данных. |
|
| Автор: | Dimon456 [ Вс сен 12, 2021 20:34:05 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
ivan dimir, ну как успехи в освоении? Вот тебе паказуха СпойлерUSART DMA-tx IRQ-rxВложение:
|
|
| Автор: | Eddy_Em [ Вс сен 12, 2021 22:07:29 ] |
| Заголовок сообщения: | Re: stm32f4 usart приём данных в прерывании и DMA |
Под F103 с DMA только на прием и я могу пример показать. А под F0 интересней: там есть прерывание по символу, так что, можно и на прием DMA использовать без необходимости вводить паузы между пакетами: просто по '\n' будет вызываться прерывание, которое и выставит флаг готовности принятой строки, заодно поменяв приемный буфер на второй (при двойной буферизации, а при желании и куче оперативки можно хоть 100 буферов выделить). |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


