реклама на сайте
подробности

 
 
> STM32F UART + DMA на чтение, Как реализовать чтение через DMA для потока данных?
krdmitry
сообщение Jul 14 2012, 10:45
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 160
Регистрация: 24-11-05
Из: СПб
Пользователь №: 11 354



Всем привет.

Можно ли на STM32F сделать чтение данных из UART в программный буфер FIFO через DMA? Размер принимаемых данных - произвольный, от 1 байта, поток от модема. Киньте примером пожалуйста, если есть опыт подобной реализации.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Jul 14 2012, 11:56
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(krdmitry @ Jul 14 2012, 12:45) *
Можно ли на STM32F сделать чтение данных из UART в программный буфер FIFO через DMA? Размер принимаемых данных - произвольный, от 1 байта, поток от модема. Киньте примером пожалуйста, если есть опыт подобной реализации.

Можно: см. Circular Mode в мануале. Однако какой-то внешний процесс должен следить за количеством уже принятых байтов, чтобы выбирать их, и вести для этого собственный указатель выборки на область FIFO. Канал DMA содержит (циклический) счетчик записи. По соотношению указателя выборки и счетчика записи можно судить о мере заполнения FIFO. Для проталкивания процесса можно воспользоваться прерыванием от половинного заполнения буфера. На случай, если такое прерывание не сработает, т.к. пришло недостаточно данных, выборку можно еще иницировать неким периодическим процессом.
Go to the top of the page
 
+Quote Post
krdmitry
сообщение Jul 14 2012, 12:11
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 160
Регистрация: 24-11-05
Из: СПб
Пользователь №: 11 354



Цитата(KnightIgor @ Jul 14 2012, 15:56) *
Можно: см. Circular Mode в мануале. Однако какой-то внешний процесс должен следить за количеством уже принятых байтов, чтобы выбирать их, и вести для этого собственный указатель выборки на область FIFO. Канал DMA содержит (циклический) счетчик записи. По соотношению указателя выборки и счетчика записи можно судить о мере заполнения FIFO. Для проталкивания процесса можно воспользоваться прерыванием от половинного заполнения буфера. На случай, если такое прерывание не сработает, т.к. пришло недостаточно данных, выборку можно еще иницировать неким периодическим процессом.


Игорь, в теории так оно и есть. На практике несколько сложнее. Есть RTOS, собственно от ее наличия "ноги и растут". Изначально и планировал сделать, как вы описали, а проверять пришедшие одинокие байты можно в тике от внешнего/системного таймера - если заполнение меньше половины. Хотелось бы увидеть практическую реализацию, т.к. возможно есть подводные камни.

Кстати, по поводу circular mode тоже есть вопрос.
1. Предположим, у нас есть FIFO на 16 байт. При инициализации мы установили размер передаваемых данных = 16 и старт приема на 0-й элемент буфера.
2. Внешний девайс вывалил 9 байт. DMA их принял и выставил прерывание.
3. Основная задача вычитала 4 байта и "задумалась". В это время внешний девайс присылает еще 10 байт. Как быть в этом случае? Куда они запишутся?
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jul 14 2012, 19:20
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(krdmitry @ Jul 14 2012, 14:11) *
Игорь, в теории так оно и есть. На практике несколько сложнее. Есть RTOS, собственно от ее наличия "ноги и растут". Изначально и планировал сделать, как вы описали, а проверять пришедшие одинокие байты можно в тике от внешнего/системного таймера - если заполнение меньше половины. Хотелось бы увидеть практическую реализацию, т.к. возможно есть подводные камни.

Про RTOS - снизошло откровение! Ну, практической готовой реализации у меня нет, т.к. не приходилось что-то решать именно в таком виде. У меня есть прием от UART по принципу FIFO, но в нем всё работает исключительно по прерыванию. Я, честно говоря, не вижу острой необходимости "заморачивать" DMA на буфер длиной 16 байт. Вообще, DMA был бы интересен, если прием велся бы быстрыми большими порциями (хорошее слово bursts), между которыми лежала бы определенная пауза. В этом случае действительно DMA разгрузил бы процессор.
Цитата
Кстати, по поводу circular mode тоже есть вопрос.
1. Предположим, у нас есть FIFO на 16 байт. При инициализации мы установили размер передаваемых данных = 16 и старт приема на 0-й элемент буфера.
2. Внешний девайс вывалил 9 байт. DMA их принял и выставил прерывание.
3. Основная задача вычитала 4 байта и "задумалась". В это время внешний девайс присылает еще 10 байт. Как быть в этом случае? Куда они запишутся?

DMA пишет в буфер FIFO по кольцу.
В примере DMA принял в общей сложности 19 байт. 4 байта успели "выбраться" целыми и невредимыми, а на бывших их местах с индексами [0], [1] и [2] будут сидеть байты с 17-го по 19-й, при этом байты с 5-го по 16-й будут по индексам с [4] по [15], а FIFO будет иметь место еще для одного байта по индексу [3], и т.д. По-моему, так! (с) Винни Пух.

Сообщение отредактировал KnightIgor - Jul 15 2012, 09:23
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- krdmitry   STM32F UART + DMA на чтение   Jul 14 2012, 10:45
|- - e-serg   Цитата(krdmitry @ Jul 14 2012, 21:11) 3. ...   Jul 14 2012, 14:45
|- - krdmitry   Цитата(KnightIgor @ Jul 14 2012, 23:20) П...   Jul 16 2012, 07:18
|- - KnightIgor   Цитата(krdmitry @ Jul 16 2012, 09:18) Да,...   Jul 16 2012, 08:02
|- - SSerge   Цитата(KnightIgor @ Jul 16 2012, 15:02) П...   Jul 16 2012, 20:20
|- - KnightIgor   Цитата(SSerge @ Jul 16 2012, 22:20) Как-т...   Jul 17 2012, 07:18
|- - demiurg_spb   Цитата(KnightIgor @ Jul 17 2012, 11:18) Е...   Jul 17 2012, 08:06
- - kan35   Здесь прерывания на заполнение половины буфера и б...   Jul 15 2012, 15:35
- - diwil   Цитата(krdmitry @ Jul 14 2012, 14:45) Все...   Jul 16 2012, 07:30
|- - krdmitry   Цитата(diwil @ Jul 16 2012, 11:30) Есть. ...   Jul 16 2012, 07:53
- - kan35   krdmitry, поясните, а то из референс мануала не вп...   Jul 16 2012, 08:45
|- - krdmitry   Цитата(kan35 @ Jul 16 2012, 12:45) krdmit...   Jul 16 2012, 09:08
- - diwil   - IDLE прерывание это когда контроллер фиксирует п...   Jul 16 2012, 09:07
- - kan35   ой, да, diwill krdmitry, спасибо за ответ Я вот то...   Jul 16 2012, 09:57
- - kan35   Я сделал драйвер для USART, который работает через...   Sep 28 2012, 06:04
- - Rash   А есть ли возможность аппаратно увидеть что началс...   Jan 9 2013, 14:51
|- - jcxz   Цитата(Rash @ Jan 9 2013, 20:51) А есть л...   Feb 7 2013, 07:44
|- - demiurg_spb   Цитата(jcxz @ Feb 7 2013, 11:44) Всё прек...   Feb 7 2013, 08:12
|- - _Артём_   Цитата(jcxz @ Feb 7 2013, 09:44) копирую ...   Feb 7 2013, 11:29
||- - jcxz   Цитата(_Артём_ @ Feb 7 2013, 17:29) Почем...   Feb 7 2013, 13:40
|- - kan35   Цитата(jcxz @ Feb 7 2013, 11:44) Если вер...   Feb 8 2013, 12:10
|- - AHTOXA   А может быть, потери в таком случае и не случится?...   Feb 8 2013, 16:04
|- - jcxz   Цитата(kan35 @ Feb 8 2013, 18:10) Сброс D...   Feb 9 2013, 09:33
|- - AHTOXA   Цитата(jcxz @ Feb 9 2013, 15:33) Потеря м...   Feb 9 2013, 14:33
|- - jcxz   Цитата(AHTOXA @ Feb 9 2013, 20:33) Ну так...   Feb 9 2013, 17:16
|- - AHTOXA   Цитата(jcxz @ Feb 9 2013, 23:16) Я также ...   Feb 9 2013, 19:44
|- - jcxz   У меня - нет. Ещё на первое своё сообщение я получ...   Feb 10 2013, 08:42
- - Rash   Отвечу сам на свой вопрос. Экспериментально провер...   Jan 23 2013, 14:01
- - kan35   Если я правильно понимаю в чем проблема - то можно...   Jan 27 2013, 12:25
- - Rash   Задача такая: хотелось бы контролировать что начал...   Jan 27 2013, 14:55
|- - demiurg_spb   В этой идее есть недостаток. Счётчик ДМА может ещё...   Jan 28 2013, 05:20
|- - kan35   Цитата(demiurg_spb @ Jan 28 2013, 09:20) ...   Feb 3 2013, 07:06
|- - demiurg_spb   А зачем вообще что-то ресетить? Ведь у дма есть ци...   Feb 3 2013, 07:39
- - kan35   Он итак в циркулярном режиме. Вы просто проверяете...   Feb 4 2013, 16:17
|- - demiurg_spb   Понятно. У вас под ОС видимо заточка, а у меня под...   Feb 5 2013, 05:42
|- - kan35   Цитата(demiurg_spb @ Feb 5 2013, 09:42) П...   Feb 6 2013, 16:24
- - Rash   Цитата(jcxz @ Feb 7 2013, 11:44) От колли...   Feb 7 2013, 08:15
- - kan35   Уважаемый jcxz, Назвал буфер ДМА стеком, ну и что ...   Feb 9 2013, 11:52
- - kan35   Да, я FIFO назвал стеком, предайте анафеме меня. Ч...   Feb 9 2013, 17:49
|- - jcxz   Я ещё в самом первом своём посте в эту тему написа...   Feb 9 2013, 19:14
- - uriy   Не могу никак запустить UART1 DMA на прием. По пре...   Apr 5 2015, 15:17
- - PeterBr   пример кода работы DMA->USART DMA-USART   Apr 14 2016, 13:36
- - golf2109   вот ссылки dma-to-usart uart-dma-out dma-uart-i...   Apr 15 2016, 00:27
- - d_el   Ловля конца пакета на IDLE. Видно задержку в 1,5 ...   Aug 3 2016, 21:38
- - Obam   Цитата(d_el @ Aug 4 2016, 01:38) Ловля ко...   Aug 4 2016, 07:29


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01604 секунд с 7
ELECTRONIX ©2004-2016