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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> 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
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
e-serg
сообщение Jul 14 2012, 14:45
Сообщение #4


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

Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180



Цитата(krdmitry @ Jul 14 2012, 21:11) *
3. Основная задача вычитала 4 байта и "задумалась". В это время внешний девайс присылает еще 10 байт. Как быть в этом случае? Куда они запишутся?


DMA ничего не знает про программное FIFO, это автомат, раскладывает байты как приказали, вызывает прерывания, если настроили.
По USART обратить на флаг IDLE

На практике, у STM32F10x DMA работают вполне адекватно, описание в даташите "несколько странное".
в одном из устройств интенсивно использую 5 каналов DMA, причем транзакции по некоторым запускаются синхронно, все нормально.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jul 14 2012, 19:20
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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
kan35
сообщение Jul 15 2012, 15:35
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Здесь прерывания на заполнение половины буфера и буфера целиком очень пригодянтся. Таким образом, по таймеру надо вынимать данные из буферов и скалдывать в очередь, при этом блокировать прерывания от ДМА. А при прерываниях по половинкам буферов невычитанные остатки в экстренном порядке выкидывать в очередь.
При этом для таких задач как пассивная обработка NMEA GPS вычитка по таймеру чаще всего вообще не будет нужна.
Я, например обрабатываю GPS приемник по прерыванию и там в секунду около 500 байт вываливается, проц работает на 24МГц и соответственно только на вход и выход из прерывания тратится 500мкс + отправка в очередь - как минимум несколько (может быть десятков даже) мсек в сек тратится на эту хрень...
Что то я вдохновился на написание такого драйвера для своих задач.
Go to the top of the page
 
+Quote Post
krdmitry
сообщение Jul 16 2012, 07:18
Сообщение #7


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

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



Цитата(KnightIgor @ Jul 14 2012, 23:20) *
Про RTOS - снизошло откровение! Ну, практической готовой реализации у меня нет, т.к. не приходилось что-то решать именно в таком виде. У меня есть прием от UART по принципу FIFO, но в нем всё работает исключительно по прерыванию. Я, честно говоря, не вижу острой необходимости "заморачивать" DMA на буфер длиной 16 байт. Вообще, DMA был бы интересен, если прием велся бы быстрыми большими порциями (хорошее слово bursts), между которыми лежала бы определенная пауза. В этом случае действительно DMA разгрузил бы процессор.

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


Да, сейчас сделано так же: UART через прерывание. Работают одновременно 3 UART-а.
Столкнулся с хитростью в ОС:
1. Изначально при чтении из FIFO каждого уарта запрещалось прерывание именно для него. Проблема могла возникнуть в случае, если в момент блокировки FIFO (соответственно и запрета прерывания от UART) возникало переключение контекста, и данные терялись.
2. Сделал вход в критическую секцию при чтении FIFO - проблема до конца не решилась, т.к. запрет переключения контекста в моей ОС сделан как запрет всех прерываний. В результате иногда поток данных с одного UARTа может привести к потере пары байт с другого.

Вопрос: как обычно реализуется работа с UART через прерывания в ОС?

Кстати, у STM нашлась аппнота по теме: http://www.st.com/internet/com/TECHNICAL_R.../CD00256689.pdf



Цитата(kan35 @ Jul 15 2012, 19:35) *
Здесь прерывания на заполнение половины буфера и буфера целиком очень пригодянтся. Таким образом, по таймеру надо вынимать данные из буферов и скалдывать в очередь, при этом блокировать прерывания от ДМА. А при прерываниях по половинкам буферов невычитанные остатки в экстренном порядке выкидывать в очередь.
При этом для таких задач как пассивная обработка NMEA GPS вычитка по таймеру чаще всего вообще не будет нужна.
Я, например обрабатываю GPS приемник по прерыванию и там в секунду около 500 байт вываливается, проц работает на 24МГц и соответственно только на вход и выход из прерывания тратится 500мкс + отправка в очередь - как минимум несколько (может быть десятков даже) мсек в сек тратится на эту хрень...
Что то я вдохновился на написание такого драйвера для своих задач.


Отличная идея sm.gif
Поделитесь реализацией драйвера с обществом?
Go to the top of the page
 
+Quote Post
diwil
сообщение Jul 16 2012, 07:30
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(krdmitry @ Jul 14 2012, 14:45) *
Всем привет.

Можно ли на STM32F сделать чтение данных из UART в программный буфер FIFO через DMA? Размер принимаемых данных - произвольный, от 1 байта, поток от модема. Киньте примером пожалуйста, если есть опыт подобной реализации.


Есть. Я здесь кидал рабочий пример. (или во freertos ветке).
Смысл простой:
1. ДМА настраивается в режиме кольца
2. Прерывания ДМА - заоплнение буфера и половина буфера.
3. Прерывание УАРТА одно - line IDLE.

Собствено любое прерывание из этих должно разблокировать операцию чтения данных. Данные читаются до тех пор, пока не прочитаны все.

Есть недостаточек - если какие-то данные не прочитались, то они могут быть перезаписаны новыми.
Go to the top of the page
 
+Quote Post
krdmitry
сообщение Jul 16 2012, 07:53
Сообщение #9


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

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



Цитата(diwil @ Jul 16 2012, 11:30) *
Есть. Я здесь кидал рабочий пример. (или во freertos ветке).
Смысл простой:
1. ДМА настраивается в режиме кольца
2. Прерывания ДМА - заоплнение буфера и половина буфера.
3. Прерывание УАРТА одно - line IDLE.

Собствено любое прерывание из этих должно разблокировать операцию чтения данных. Данные читаются до тех пор, пока не прочитаны все.

Есть недостаточек - если какие-то данные не прочитались, то они могут быть перезаписаны новыми.


Спасибо.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jul 16 2012, 08:02
Сообщение #10


Знающий
****

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



Цитата(krdmitry @ Jul 16 2012, 09:18) *
Да, сейчас сделано так же: UART через прерывание. Работают одновременно 3 UART-а.
...
Вопрос: как обычно реализуется работа с UART через прерывания в ОС?

Поделюсь одним "болтом" на хитрую "гайку" организации FIFO и работы по прерыванию применительно к приему: во время выборки из FIFO запрещать прерывания... не надо!
Предлагаю (проверенный) алгоритм:

1. Заводится бинарный флаг критической секции.
2. В обработчике прерывания по приему проверяется:
2.1. есть ли место в FIFO положить туда принятый байт. Важно - байт еще НЕ считан с регистра DR!
2.2. не взведен ли флаг критической секции.

Только если эти оба условия выполняются - место есть, флаг не взведен, происходит считывание DR, запись его в FIFO и коррекция счетчика и указателя записи.
Если хотя бы ОДНО из условий выполнилось - нет места или флаг-таки взведён, происходит ЗАПРЕТ своего прерывания и выход из него.

3. Основной процесс выборки с определенной периодичностью проверяет, нет ли в FIFO чем поживиться.
Если да, то:
3.1. установить флаг критической секции.
3.2. выбрать FIFO (или часть его), скорректировать счетчик и указатель выборки.
3.3. сбросить флаг критической секции.
3.4. (Пере)разрешить прерывание от источника (всегда).

Что получается:
- если прерывание возникло вне критической секции, то счетчик и указатель будут модифицированы монопольно в прерывании (если место в FIFO было).
- если прерывание возникло уже внутри критической секции, то прерывание лишь запретит себя само и вернет управление, а процесс выборки будет изменять счетчик и указатель монопольно; как только критическая секция будет пройдена, прерывание будет (пере)разрешено (я пишу "пере-", имея ввиду, что установка уже установленного разрешения прерывания ничего не меняет), и если DR еще не был считан, то тут же возникнет прерывание - см. 2).

Можно спросить, а что будет, если пока прерывание было запрещено, пришел еще один байт? Будет ж...па предыдущему байту. Но весь расклад будет говорить лишь о том, что система не достаточно производительна, либо неудачно распределены приоритеты прерываний.

Для случая RTOS также нужно обрамить выборку критической секцией средствами RTOS, то есть:
- начать RTOS-секцию
- установить флаг
- сделать дело
- сбросить флаг
- закрыть RTOS-секцию

Сообщение отредактировал KnightIgor - Jul 16 2012, 08:16
Go to the top of the page
 
+Quote Post
kan35
сообщение Jul 16 2012, 08:45
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



krdmitry, поясните, а то из референс мануала не вполне ясно:
IDLE прерывание это когда контроллер фиксирует паузы между байтами?
Go to the top of the page
 
+Quote Post
diwil
сообщение Jul 16 2012, 09:07
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



- IDLE прерывание это когда контроллер фиксирует паузы между байтами?

да, более, кажется, 1.5 байта
Go to the top of the page
 
+Quote Post
krdmitry
сообщение Jul 16 2012, 09:08
Сообщение #13


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

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



Цитата(kan35 @ Jul 16 2012, 12:45) *
krdmitry, поясните, а то из референс мануала не вполне ясно:
IDLE прерывание это когда контроллер фиксирует паузы между байтами?


Похоже, что так. Вопрос, видимо, адресован diwill? В референс-мануале не нашел конкретного ответа, сколько битовых интервалов нужно для генерации прерывания IDLE. Видимо, это что-то из области LIN или smartcard протоколов, но подойдет и под нашу задачу.
Go to the top of the page
 
+Quote Post
kan35
сообщение Jul 16 2012, 09:57
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



ой, да, diwill
krdmitry, спасибо за ответ
Я вот тоже в референсе по-быстрому не нашел ответа.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jul 16 2012, 20:20
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(KnightIgor @ Jul 16 2012, 15:02) *
Поделюсь одним "болтом" на хитрую "гайку" организации FIFO и работы по прерыванию применительно к приему: во время выборки из FIFO запрещать прерывания... не надо!

Как-то сложновато...
Если отказаться от счётчика (а зачем он нужен?) и оперировать только указателями на "голову" и "хвост" буфера, то и флаг не понадобиться, и прерывания можно не трогать, один раз только разрешить при инициализации и всё.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jul 17 2012, 07:18
Сообщение #16


Знающий
****

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



Цитата(SSerge @ Jul 16 2012, 22:20) *
Как-то сложновато...
Если отказаться от счётчика (а зачем он нужен?) и оперировать только указателями на "голову" и "хвост" буфера, то и флаг не понадобиться, и прерывания можно не трогать, один раз только разрешить при инициализации и всё.

Если оба указателя равны друг другу, буфер пуст или полон?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 17 2012, 08:06
Сообщение #17


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(KnightIgor @ Jul 17 2012, 11:18) *
Если оба указателя равны друг другу, буфер пуст или полон?
Принять на веру что пуст.
Просто размер фифо нужно с запасом выбрать и выгребать его достаточно регулярно.
По сути те же самые ограничения на производительность что и у вас, но у вас всё гавкнется гораздо раньше...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
kan35
сообщение Sep 28 2012, 06:04
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Я сделал драйвер для USART, который работает через DMA, может быть пригодится кому нибудь. Извлекал его потом из реального проекта, так что мог что то упустить, но надеюсь не упустил.
Длайвер работает через USART1, адаприровать под другие порты, думаю не составит труда.
Основной прием данных производится в буфер через DMA канал. По заполнению половинок буфера данные извлекаются и передаются в обработчик. В случае применения RTOS данные передаются в предусмотренный для данных queue (или в другой терминологии - в "message box"). Буфер может быть достаточно большого размера - 128 и более байт и в случае, если передача остановилась где то посередине и DMA прерывание не возникает, то через несколько пустых временных окон приема символов возникает прерывание "IDLE line" от USART, в данном прерывании вытаскивается хвост данных и DMA канал сбрасывается в стартовое состояние.
Дан проект-пример. Основные файлы - main.c и STM32F10x_it.c. В main.c производится вся настрока периферии. В во втором прерывании все необходимые обработчики, а именно - от DMA и от USART.
Ссылка
Go to the top of the page
 
+Quote Post
Rash
сообщение Jan 9 2013, 14:51
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



А есть ли возможность аппаратно увидеть что начался приём данных?, что бы не начать новую передачу в случае RS-485 и не подгонять тайм ауты посылок. А то принимать всю посылку по IDLE удобно, но не знаешь есть она или нет в данный момент. Проверка флага RXNE в регистре USARTx_SR не помогла, этот флаг иногда ловится на несколько приходящих посылок, причём сбрасывался он сам, наверное DMA когда забирает байт данных очищает его.
Мк ST32F407.
Go to the top of the page
 
+Quote Post
Rash
сообщение Jan 23 2013, 14:01
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Отвечу сам на свой вопрос. Экспериментально проверил, если использовать режим IDLE и при этом DMA забирает всю посылку, то и флаг RXNE очищается когда его забрало DMA и прерывание по приёму USART_IT_RXNE никогда не произойдёт. Вижу только 2 выхода что бы определить старт приёма: Принять 1-ый байт и подключить потом DMA для приёма оставшейся посылки, 2-ой использовать ещё один бит порта как внешнее прерывание (поймать старт бит и отключить потом внешнее прерывания, до приёма полной посылки).
Go to the top of the page
 
+Quote Post
kan35
сообщение Jan 27 2013, 12:25
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Если я правильно понимаю в чем проблема - то можно контроллировать счетчик передачи DMA. Если он не равен одному из 2 указателей, то передача в процессе.
Go to the top of the page
 
+Quote Post
Rash
сообщение Jan 27 2013, 14:55
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Задача такая: хотелось бы контролировать что начался приём. Как я понял вы предлагаете периодически опрашивать счётчик байтов DMA, и если он не равен 0, то значит идёт прём данных. Как то не подумал о таком, попробую при случае, спасибо за идею.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 28 2013, 05:20
Сообщение #23


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



В этой идее есть недостаток. Счётчик ДМА может ещё не измениться а приём байта быть в процессе.
Байты же не мгновенно принимаются, а по-битно...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
kan35
сообщение Feb 3 2013, 07:06
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(demiurg_spb @ Jan 28 2013, 09:20) *
В этой идее есть недостаток. Счётчик ДМА может ещё не измениться а приём байта быть в процессе.
Байты же не мгновенно принимаются, а по-битно...

Вероятность потери байта предельно низка, так как сначала достаются все байты из массива ДМА, затем еще раз проверяется счетчик ДМА и если он не изменился за время вытаскивания данных, то ДМА ресетится. Процедура сброса ДМА занимает доли микросекунды. В принципе, можно на время сброса ДМА переключать прием на прерывание, а затем назад. Но как показывает практика, и без этого все хорошо. По крайней мере через GPRS модем на 115200 (при скорости HCLK всего лишь 4МГц) удается принимать массивы несколько сот кБ без потерь (больше просто не пробовал). При этом контроллер под управлением freertos обслуживает около 10 задач и еще эпизодически работают 4 канала того же ДМА.

Сообщение отредактировал kan35 - Feb 3 2013, 07:08
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 3 2013, 07:39
Сообщение #25


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



А зачем вообще что-то ресетить? Ведь у дма есть циркулярный режим...

Код
//=============================================================================
int uart_getc(uart_t* const uart)
{
    dma_t* const dma = &uart->dma.rx;

    if (dma->size - dma->sfr->CNDTR != dma->idx)
    {
        int x = dma->buf[dma->idx];

        if (++dma->idx >= dma->size)
        {
            dma->idx = 0;
        }

        return (x);
    }

    return (-1);
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
kan35
сообщение Feb 4 2013, 16:17
Сообщение #26


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Он итак в циркулярном режиме.
Вы просто проверяете наличие данных в ДМА памяти, но не это цель. А цель сделать все максимально аппаратно. То есть без участия процессора.
В моем варианте при зполнении половинок буфера ДМА (или как вариант разных буферов в процессорах F2 и F4) возникают прерывания, в которых данные забираются. При паузе в передаче - данные так же успешно забираются из прерывания IDLE line. Никаких поллингов!
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 5 2013, 05:42
Сообщение #27


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Понятно. У вас под ОС видимо заточка, а у меня под луп.
Цитата(kan35 @ Feb 4 2013, 20:17) *
Вы просто проверяете наличие данных в ДМА памяти
Да. Я ДМА как фифо использую.
Кстати, на передачу у вас тоже ДМА задействовано?
У меня нет. Красивого решения не придумалось...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
kan35
сообщение Feb 6 2013, 16:24
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(demiurg_spb @ Feb 5 2013, 09:42) *
Понятно. У вас под ОС видимо заточка, а у меня под луп.Да. Я ДМА как фифо использую.
Кстати, на передачу у вас тоже ДМА задействовано?
У меня нет. Красивого решения не придумалось...

Да, под ОСь.
На передачу не сделал, но надо бы, руки не дошли пока. Для Оси передача получится просто красиво: задача уснет до окончания выполнения передачи. Для лупа не так просто будет, придумывать надо что то...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2013, 07:44
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Rash @ Jan 9 2013, 20:51) *
А есть ли возможность аппаратно увидеть что начался приём данных?, что бы не начать новую передачу в случае RS-485 и не подгонять тайм ауты посылок
От коллизий в RS485 вы так не защититесь. Это поможет сделать только протокол обмена.
Когда вы проверяете идёт-ли у вас приём данных, в этот момент байт может только ещё начать приниматься, или на удалённой стороне аппаратура передатчика может только переключить выход в TX с последующей паузой для устаканивания канала в режиме передачи.

Цитата(kan35 @ Feb 3 2013, 13:06) *
Вероятность потери байта предельно низка, так как сначала достаются все байты из массива ДМА, затем еще раз проверяется счетчик ДМА и если он не изменился за время вытаскивания данных, то ДМА ресетится. Процедура сброса ДМА занимает доли микросекунды.
Если вероятность потери !=0, то на помойку такое ПО. Которое может работать с некоторой вероятностью в зависимости от фазы луны.
А если между проверкой и сбросом DMA как раз и придёт байт? И что значит "ресет DMA"? Это именно сброс канала или запрет его работы? Есть-ли у DMA каналов в STM32 FIFO? Знаю что у многих других контроллеров - есть, что будет приводить к потерям байт (при сбросе DMA) или появлению лишних байт (при его запрете) - сам лично сталкивался с такой проблемой.

Должен быть алгоритм, позволяющий работать с 100% вероятностью. Иначе - зачем нужен STM32 если есть другие процессоры (например LPC или от TI) где есть нормальное FIFO на UARTах работающее со 100% вероятностью и не нужны пляски с бубном с DMA?
Пишу не с целью разжигания религиозной войны STM vs LPC, а с целью понять плюсы и минусы STM32, как замены хорошо знакомым ядрам от NXP. Мои задачи подразумевают интенсивное использование UART-ов (несколько одновременно, до 5и) под ОС. Я пытаюсь понять во что это выльется при переходе с LPC на STM32?
Очень настораживает сложность работы с UART на STM32 через DMA. Работа с частотами прерываний от одного UART порядка 11кГц/11кГц (TX/RX) на 115200 и суммарной эквивалентной частотой от 5-ти UART на 115200 порядка 110кГц очень напрягает, особенно под ОС.
Прочитал сообщения этой ветки и возникли у меня большие сомнения в целесообразности использования STM32 вообще при работе с UART...

В частности вопрос: если работать на приём так:
Получаю IDLE-прерывание, в его обработчике запрещаю канал DMA, копирую данные из буфера DMA в программное FIFO, настраиваю канал DMA заново на приём в буфер DMA, разрешаю DMA, выхожу из ISR. Могут-ли в таком алгоритме быть потери байт или другие проблемы?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 7 2013, 08:12
Сообщение #30


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(jcxz @ Feb 7 2013, 11:44) *
Всё прекрасно работает на stm32. Не паникуйте!:)
Кстати, у stm32f0 много вкусностей в модуле uart появилось относительно stm32f1. Так-что не надо всех под одну гребёнку....
Вы всё равно не составите адекватного мнения, пока не попробуете лично. ИМХО.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Rash
сообщение Feb 7 2013, 08:15
Сообщение #31


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Цитата(jcxz @ Feb 7 2013, 11:44) *
От коллизий в RS485 вы так не защититесь. Это поможет сделать только протокол обмена.
Когда вы проверяете идёт-ли у вас приём данных, в этот момент байт может только ещё начать приниматься, или на удалённой стороне аппаратура передатчика может только переключить выход в TX с последующей паузой для устаканивания канала в режиме передачи.

В протоколе тоже есть свои байты для проверке. Но я писал про ситуацию, определение 1-го байта, а потом уже не важно, поэтому будет он первый или второй мне не важно, т.к. таймаут будет выбран с запасом. Та к ещё не попробывал сравнение со счётчиком, времени не было

Цитата(jcxz @ Feb 7 2013, 11:44) *
В частности вопрос: если работать на приём так:
Получаю IDLE-прерывание, в его обработчике запрещаю канал DMA, копирую данные из буфера DMA в программное FIFO, настраиваю канал DMA заново на приём в буфер DMA, разрешаю DMA, выхожу из ISR. Могут-ли в таком алгоритме быть потери байт или другие проблемы?


Именно так и делаю, потерь пока не было, но пока девайсы работаю не больше суток, т.к. по своей специфике они выключаются и включаются пользователем.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 7 2013, 11:29
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(jcxz @ Feb 7 2013, 09:44) *
копирую данные из буфера DMA в программное FIFO, настраиваю канал DMA заново на приём в буфер DMA

Почему нельзя настроить ДМА на запись данных в программное FIFO? Зачем это копирование?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2013, 13:40
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(_Артём_ @ Feb 7 2013, 17:29) *
Почему нельзя настроить ДМА на запись данных в программное FIFO? Зачем это копирование?
Это для общего случая. В частном случае, если структура программного FIFO позволяет, конечно возможно.
Go to the top of the page
 
+Quote Post
kan35
сообщение Feb 8 2013, 12:10
Сообщение #34


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(jcxz @ Feb 7 2013, 11:44) *
Если вероятность потери !=0, то на помойку такое ПО. Которое может работать с некоторой вероятностью в зависимости от фазы луны.
А если между проверкой и сбросом DMA как раз и придёт байт? И что значит "ресет DMA"? Это именно сброс канала или запрет его работы? Есть-ли у DMA каналов в STM32 FIFO? Знаю что у многих других контроллеров - есть, что будет приводить к потерям байт (при сбросе DMA) или появлению лишних байт (при его запрете) - сам лично сталкивался с такой проблемой.

Сброс DMA занимает доли микросекунды. Стек на ДМА в F2/F4 отключаемый (в данном случае он не используется).
Для того, чтоб вероятность потери свести к 0 на время сброса DMA нужно переключать прием на прерывание по RX. Однако, для GSM модема с его логикой это не обязательно, пропусков не наблюдается, для GPS тем более проблемы нет. Мы же работаем с реальными устройствами и знаем как они фунциклируют. Говоря о вероятности ошибки, я допускаю, что существует такой девайс которые не сможет работать через этот драйвер.
Эта идея не просто замена стека, а возможность дать процессору время для сна. В основном это актуально про использовании ОС. просто аппаратный стек эту задачу вообще никак не решает.

Сообщение отредактировал kan35 - Feb 8 2013, 12:14
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 8 2013, 16:04
Сообщение #35


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А может быть, потери в таком случае и не случится? Просто в момент включении DMA будет взведён флажок RXNE, и принятый байт из UARTx->DR благополучно отправится в буфер DMA.
Наверное это можно достаточно просто проверить - принять байт, не вычитывая его, и затем включить DMA.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 9 2013, 09:33
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kan35 @ Feb 8 2013, 18:10) *
Сброс DMA занимает доли микросекунды.
Т.е. - если скажем сброс занимает 0.1мкс и через UART за сутки у вас проходит скажем 10МБ данных (вполне реальная ситуация - через интерфейс обычного счётчика электроэнергии может проходить и больше), то вероятность потери раз в сутки близка к 100%?
А если скажем у вас работает система сбора данных из ста таких устройств? Будет сто сбоев в сутки? twak.gif
Но даже если траффик меньше, значит сбои будут происходить реже, что ещё хуже, так как найти причину таких сбоев будет крайне сложно. Лучше было сразу уволить программиста с такими кривыми руками wink.gif

Цитата(kan35 @ Feb 8 2013, 18:10) *
Стек на ДМА в F2/F4 отключаемый (в данном случае он не используется).
Стек в DMA??? wacko.gif Это новость! Всегда считал что в канале DMA может быть FIFO, но никак не LIFO...

Цитата(kan35 @ Feb 8 2013, 18:10) *
Для того, чтоб вероятность потери свести к 0 на время сброса DMA нужно переключать прием на прерывание по RX. Однако, для GSM модема с его логикой это не обязательно, пропусков не наблюдается, для GPS тем более проблемы нет. Мы же работаем с реальными устройствами и знаем как они фунциклируют. Говоря о вероятности ошибки, я допускаю, что существует такой девайс которые не сможет работать через этот драйвер.
Выйдет новая прошивка для вашего GSM-модема, или захотите заложить другой модем, потому что старого уже не купить, и в новой прошивке модем станет немножко по другому слать данные в UART (скажем - с небольшими паузами) и где будет ваше ПО? sm.gif

Цитата(kan35 @ Feb 8 2013, 18:10) *
Эта идея не просто замена стека, а возможность дать процессору время для сна. В основном это актуально про использовании ОС. просто аппаратный стек эту задачу вообще никак не решает.
По-моему Вы путаете стек с FIFO - это вообще-то совершенно разные вещи. И как раз стандартное FIFO в UART очень хорошо решает эту проблему, снижая частоту RX-прерываний до 14раз.

Цитата(AHTOXA @ Feb 8 2013, 22:04) *
А может быть, потери в таком случае и не случится? Просто в момент включении DMA будет взведён флажок RXNE, и принятый байт из UARTx->DR благополучно отправится в буфер DMA.
Наверное это можно достаточно просто проверить - принять байт, не вычитывая его, и затем включить DMA.
Потеря может быть не в момент включения, а в момент сброса DMA. Если, как пишет автор, проверить наличие данных в DMA, потом его сбросить, то если байт пришёл между проверкой и сбросом и не успел записаться в память, то он потеряется. Здесь никогда нельзя делать сброс DMA, можно делать только его запрет с последующим разрешением в новый буфер. И если уж работаем через DMA, то только так - тогда никаких обращений к регистру DR UART программно. Всегда нужно помнить: если у канала DMA есть FIFO, то после запрета канала, там могут остаться данные считанные с периферии но не записанные в память.
Go to the top of the page
 
+Quote Post
kan35
сообщение Feb 9 2013, 11:52
Сообщение #37


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Уважаемый jcxz,
Назвал буфер ДМА стеком, ну и что - все поняли кроме вас. Если вы такой хороший программист - напишите драйвер и выложите на суд общественности, а не придирайтесь в словам лишь бы выглядеть умнее.
14 уровневый буфер на USART на сколько я понимаю не снизит частоту возникновений прерываний в 14 раз. А почему должен?
Если как вы предлагаете переключать на новый буфер, то могут произойти потери при переключении буферов, тем более переключить буферы нельзя если не выключить ДМА (по крайней ере так в STM32).

Есть еще вариант, как можно отработать прерывание IDLE от USART:
- Считать все байты в дугой буфер
- Проверить не нападало ли новых данных и если нападало - выйти без действий
- Если данные не нападало - просто отключить триггер ДМА, сбросить ДМА, проверить RXNE и вытащить из него байт если он там образовался
- Включить триггер ДМА
В данном случае у нас времени на операцию сброса ДМА ~100мкс, на частоте 115200, что практически гарантирует защиту от сбоя.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 9 2013, 14:33
Сообщение #38


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(jcxz @ Feb 9 2013, 15:33) *
Потеря может быть не в момент включения, а в момент сброса DMA. Если, как пишет автор, проверить наличие данных в DMA, потом его сбросить, то если байт пришёл между проверкой и сбросом и не успел записаться в память, то он потеряется. Здесь никогда нельзя делать сброс DMA, можно делать только его запрет с последующим разрешением в новый буфер.

Ну так, собственно, сброс - это и есть запрет с последующим разрешением. Не думаете же вы, что кто-то в здравом уме будет делать reset периферийного устройства посреди его работы? От запрета данные не теряются, просто замораживается работа. Запрещаем работу DMA (сбросом бита EN), забираем данные, перенастраиваем указатели, включаем DMA. Если за это время придёт байт в UART, то он не потеряется, а будет принят в новый буфер сразу после включения DMA.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 9 2013, 17:16
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AHTOXA @ Feb 9 2013, 20:33) *
Ну так, собственно, сброс - это и есть запрет с последующим разрешением. Не думаете же вы, что кто-то в здравом уме будет делать reset периферийного устройства посреди его работы?
Я также думал что никто в здравом уме не будет называть запрет (останов) чего-либо сбросом, а стек - FIFO-буфером laughing.gif
Цитата(AHTOXA @ Feb 9 2013, 20:33) *
От запрета данные не теряются, просто замораживается работа. Запрещаем работу DMA (сбросом бита EN), забираем данные, перенастраиваем указатели, включаем DMA. Если за это время придёт байт в UART, то он не потеряется, а будет принят в новый буфер сразу после включения DMA.
Именно о таком алгоритме я и говорил. И при этом не должно быть никаких посторонних доступов к приёмному буферу UART помимо DMA, даже когда DMA запрещён.

Цитата(kan35 @ Feb 9 2013, 17:52) *
14 уровневый буфер на USART на сколько я понимаю не снизит частоту возникновений прерываний в 14 раз. А почему должен?
Знаете как работает обыкновенный FIFO UART на других CPU? Он генерит прерывание при достижения метки заполнения буфера (максимум==14байт) или при паузе в приёмном потоке более чем сколько-то бит.

Цитата(kan35 @ Feb 9 2013, 17:52) *
Если как вы предлагаете переключать на новый буфер, то могут произойти потери при переключении буферов, тем более переключить буферы нельзя если не выключить ДМА (по крайней ере так в STM32).
А я что писал?

Цитата(kan35 @ Feb 9 2013, 17:52) *
Есть еще вариант, как можно отработать прерывание IDLE от USART:
- Считать все байты в дугой буфер
- Проверить не нападало ли новых данных и если нападало - выйти без действий
- Если данные не нападало - просто отключить триггер ДМА, сбросить ДМА, проверить RXNE и вытащить из него байт если он там образовался
- Включить триггер ДМА
В данном случае у нас времени на операцию сброса ДМА ~100мкс, на частоте 115200, что практически гарантирует защиту от сбоя.
В Вашем алгоритме я вижу много дыр, но по-моему объяснять бесполезно..... smile3046.gif
Go to the top of the page
 
+Quote Post
kan35
сообщение Feb 9 2013, 17:49
Сообщение #40


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Да, я FIFO назвал стеком, предайте анафеме меня. Что за глупые придирки к словам?
Вы видите много дыр, у вас полна голова знаний - так вы возьмите, прочтите названия темы и скажите как надо сделать а еще лучше - выложите код, как просит автор, а уж мы покритикуем:
Цитата(krdmitry)
Можно ли на STM32F сделать чтение данных из UART в программный буфер FIFO через DMA? Размер принимаемых данных - произвольный, от 1 байта, поток от модема. Киньте примером пожалуйста, если есть опыт подобной реализации.

Да только я думаю ничего мы от Вас не дождемся, кроме упоминаний в каждом посте, что стек это не FIFO, а FIFO это не стек.

Сообщение отредактировал kan35 - Feb 9 2013, 17:50
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 9 2013, 19:14
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Я ещё в самом первом своём посте в эту тему написал, что не работаю на STM32. И там же предложил алгоритм работы в случае IDLE-прерывания.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 9 2013, 19:44
Сообщение #42


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(jcxz @ Feb 9 2013, 23:16) *
Я также думал что никто в здравом уме не будет называть запрет (останов) чего-либо сбросом, а стек - FIFO-буфером laughing.gif

Хватит уже придираться к словам. По алгоритму вопросы остались?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 10 2013, 08:42
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



У меня - нет.
Ещё на первое своё сообщение я получил ответы которые меня удовлетворили.
...относительно sm.gif
Go to the top of the page
 
+Quote Post
uriy
сообщение Apr 5 2015, 15:17
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Не могу никак запустить UART1 DMA на прием.
По прерываниям прием работает, передача по DMA работает.
Где ошибся не могу найти

CODE
uint8_t mybuf[256];
void WiFi_Uart_DMA_Rx_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;

/* USART1 RX DMA1 Channe5 */
DMA_DeInit(DMA1_Channel5);
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR);//0x40013804;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)mybuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = sizeof(mybuf);
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_MemoryInc = ENABLE;
DMA_InitStructure.DMA_PeripheralInc = DISABLE;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);

DMA_ITConfig(DMA1_Channel5, DMA_IT_HT | DMA_IT_TC | DMA_IT_TE, DISABLE);

USART_DMACmd(USART1, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);

DMA_Cmd(DMA1_Channel5, ENABLE);
}

void WiFi_UartInit(uint32_t baudrate)
//void InitUart1(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

Uart1BufInit();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // PA.09 USART1.TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA.10 USART1.RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// /* Configure the NVIC Preemption Priority Bits */
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
//
// /* Enable the USARTy Interrupt */
// NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);

USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

// /* Enable USARTy Receive and Transmit interrupts */
// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_Cmd(USART1, ENABLE);

WiFi_Uart_DMA_Rx_Config();
}
Go to the top of the page
 
+Quote Post
PeterBr
сообщение Apr 14 2016, 13:36
Сообщение #45





Группа: Новичок
Сообщений: 4
Регистрация: 8-04-16
Пользователь №: 91 195



пример кода работы DMA->USART DMA-USART
Go to the top of the page
 
+Quote Post
golf2109
сообщение Apr 15 2016, 00:27
Сообщение #46


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 15-04-10
Из: Kiev
Пользователь №: 56 654



вот ссылки

dma-to-usart

uart-dma-out

dma-uart-in-out
Go to the top of the page
 
+Quote Post
d_el
сообщение Aug 3 2016, 21:38
Сообщение #47





Группа: Новичок
Сообщений: 1
Регистрация: 3-08-16
Пользователь №: 92 832





Ловля конца пакета на IDLE. Видно задержку в 1,5 байта.
Источник сигнала - этот же юарт TX.
Go to the top of the page
 
+Quote Post
Obam
сообщение Aug 4 2016, 07:29
Сообщение #48


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(d_el @ Aug 4 2016, 01:38) *
Ловля конца пакета на IDLE. Видно задержку в 1,5 байта.
Источник сигнала - этот же юарт TX.


Ну чё? Всё как по талмуду… Были бы likes - лайкнул бы (:


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

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

 


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


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