-
- Для передачи точно DMA удобнее. Для приёма - зависит от протокола и
нагрузки. Я чисто на прерываниях прием делал, два прерывания - одно
UART, прием/передача/ошибки, другое - таймер - временные параметры
протокола. Обеспечиваю предварительное занятие линии RS-485, так,
чтобы передача первого старта шла уже после некоторого времени в
активном состоянии драйвера - чтобы сбросить межкадровые помехи,
если были на "пустой" линии. Nikolay_Po(188 знак., 28.04.2024 17:53)
- Спасибо, Коль, за объяснение, всегда приятно тебя читать. Да, DMA
это достаточно несложно, автора видать отпугивает непонятность
реализации. А реализовать его проще всего "поженив" с программным
циркулярным буфером. Тогда "пишущий" в буфер указатель (или лучше
index) будет программный. "Заворачивается" он банальным AND, т.е.
&= . А читающий указатель (или index) выполняется на DMA с тем
нюансом что надо будет обслужить "заворот". - RxTx(28.04.2024 18:05)
- Вот, например: SciFi(3191 знак., 28.04.2024 18:38)
- Хорошо написано. На передачу, я, когда не было риска изменений
данных на стороне источника, контроллеру ПДП, вообще передавал
ссылку на данные. Не оформляя отдельного буфера передачи, но
формируя очередь запросов с указателями на данные и размер. Для
передачи кадра данных известного размера, ПДП подходит идеально. - Nikolay_Po(28.04.2024 22:04)
- Так-то всё красиво, да. Но зачем плодить указатели на структуры, я
не понял. Все уарты и все каналы dma (которые есть в конкретном
процессоре) определены там же, где USART_TypeDef и
DMA_Channel_TypeDef. Если он не определён, не сработает
инициализация, а если определён - зачем делать свой? Я всю
сознательную жизнь просто дефайнил, типа #define PRINT_UART USART1
и т.д. - Idler(28.04.2024 21:17)
- Я видел раньше и когда писал, думал "Нет тут SciFi". Да, очень
чистенький код. Идеально я бы сказал. - RxTx(28.04.2024 18:48)
- Да, DMA вариант мне все больше нравится. Тем более вывод у меня
будет через printf строками. Как раз задача для DMA. Можно даже с
Doube Buffer Mode попробовать поиграть. Немножко странно конечно у
меня будет - прием по IRQ а отправка в DMA :) - Mty1(28.04.2024 18:37)
- Как по мне, УАРТ не то место, где ДМА необходим. Понимаю, если надо
принимать плотный поток от АЦП, или отправлять что-то много и
быстро. Но УАРТ, по нынешним временам, не тот случай. ДМА может
сократить кол-во срабатываний прерываний, тем сократив среднюю
нагрузку по производительности, но производительности обычно и так
навалом. Другое дело длительность прерывания. mr-x(323 знак., 29.04.2024 12:26)
- Почему "странно", это вполне нормально, если входной поток нужно на
ходу разгребать. Ну, например, выделить из него команду, адрес и
дальнейший поток писать куда надо. А передача - "fire & forget",
пусть принимающий думает... - Idler(28.04.2024 21:25)
- В старых STM32 UART примитивный и в отличии даже от древних dsPIC30
начала 2000х не имеет FIFO буфера. Что приводит к тому что
прерывания будут дубасить на каждый байт. Тогда даже медленный по
нынышним временам 115200 это 115200/10 ( к 8 битам байта еще 1
стартовый и 1 стоповый бит) = 11 520 = 11,5 килогерц. И это только
один канал. - RxTx(28.04.2024 18:47)