|
STM32F UART + DMA на чтение, Как реализовать чтение через DMA для потока данных? |
|
|
|
 |
Ответов
|
Jul 14 2012, 11:56
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(krdmitry @ Jul 14 2012, 12:45)  Можно ли на STM32F сделать чтение данных из UART в программный буфер FIFO через DMA? Размер принимаемых данных - произвольный, от 1 байта, поток от модема. Киньте примером пожалуйста, если есть опыт подобной реализации. Можно: см. Circular Mode в мануале. Однако какой-то внешний процесс должен следить за количеством уже принятых байтов, чтобы выбирать их, и вести для этого собственный указатель выборки на область FIFO. Канал DMA содержит (циклический) счетчик записи. По соотношению указателя выборки и счетчика записи можно судить о мере заполнения FIFO. Для проталкивания процесса можно воспользоваться прерыванием от половинного заполнения буфера. На случай, если такое прерывание не сработает, т.к. пришло недостаточно данных, выборку можно еще иницировать неким периодическим процессом.
|
|
|
|
|
Jul 14 2012, 12:11
|
Частый гость
 
Группа: Участник
Сообщений: 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 байт. Как быть в этом случае? Куда они запишутся?
|
|
|
|
|
Jul 14 2012, 19:20
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|