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

 
 
> Хочу писать в 16 линеек WS2812B на макс. скорости., Хочу весь буфер без участия процессора с минимумом накладных.
-=TRO=-
сообщение Dec 13 2017, 17:25
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 24-10-07
Из: zp.ua
Пользователь №: 31 690



Сразу предупреждаю, в STM32 я полный новичек, пока знакомлюсь.
Все чего пока добился, это моргать в кейле светодиодом на двухдолларовой плате с stm32f103c8t6.
До этого частенько писал для авр на бейсике и ассемблере, так что освоение stm32 вопрос времени.

Вопрос мой будет не столько про код, а про возможность выполнения нужного мне алгоритма переферией автономно.
Не буду скрывать, хочу без участия процессора выдавать поток данных сразу в 16 длинных линеек светодиодов WS2812B.
Для выдачи одного бита нужно на отдельном выводе сначала ~ на треть периода выставить 1, потом на треть данные, и на треть 0.
В принципе при помощи DMA данная задача реализуема, но вот этот ноль в начале и еденица в конце утроят размер буфера (и добавят неудобства работы с ним).

Поэтому возник вопрос, а можно ли как то внутренними или наружными выходами таймеров переводить (или заполнить) весь 16 битный порт GPIO в высокий и низкий уровни?
Вероятно можно было бы задействовать второй DMA для цикличной выдачи двух констант (с нулями и еденицами) в тот же порт, но думаю целый ДМА для этого жирновато.
Возможно не зная завязок и возможностей переферии я узковато мыслю, и есть более красивые решения, был бы рад услышать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Dec 13 2017, 18:05
Сообщение #2


Гуру
******

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



Цитата(-=TRO=- @ Dec 13 2017, 19:25) *
Возможно не зная завязок и возможностей переферии я узковато мыслю, и есть более красивые решения, был бы рад услышать.

Можно взять другой МК, имеющий внешнюю 16-разрядную шину и выдавать на неё при помощи DMA требуемый поток.
А если в этом МК ещё и стоит хороший контроллер DMA, умеющий передачи "свЯзным списком", то его вообще можно запрограммировать так, чтобы он брал скажем два первых 16-битных слова с фиксированного адреса, а третье слово - из вашего кольцевого буфера.

Либо взять LPC43xx и на его SGPIO-интерфейсе (с DMA) реализовать требуемую диаграмму работы.

Цитата(DeNi @ Dec 13 2017, 19:54) *
Да и с 3 каналами DMA нормальное решение от одного таймера, первый настроить только на выдачу 1, второй по буферу, третий - 0. В STM32 таймер не может управлять целым портом.

Автор не озвучил частоту выдачи. И требуемую максимальную фазовую погрешность. На высоких частотах (от МГц) такое будет работать неустойчиво.

Ещё вариант - использовать Infineon XMC4700 или XMC4800. Он имеет до 3 USIC-ов. Каждый USIC - это два последовательных порта. Которые можно запрограммировать в режим quad-SPI и получить 3*2*4 последовательных битовых потока имеющих DMA-поддержку и FIFO-буфера глубиной до 32 слов. Размер слова запрограммировать кратным 3 (например 30 бит). Данные в слове кодировать так, чтобы шли: 0, 1, 1-й информационный бит, 0, 1, 2-й информационный бит, .... . Такое решение будет работать даже на нескольких десятках МГц без проблем с очень точным выдерживанием временных интервалов.

Вобщем - на более-менее высоких частотах битового потока нормально будут работать только решения на каком-либо последовательном интерфейсе (с буферизацией).
Например - несколько параллельных quad-SPI или SGPIO.
Никакие решения на таймер+DMA+GPIO стабильно не будут работать пока процессор лазит по той же шине, где работают эти пересылки DMA->GPIO. Они будут сбивать времянку.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- -=TRO=-   Хочу писать в 16 линеек WS2812B на макс. скорости.   Dec 13 2017, 17:25
- - DeNi   Да и с 3 каналами DMA нормальное решение от одного...   Dec 13 2017, 17:54
|- - -=TRO=-   Цитата(DeNi @ Dec 13 2017, 21:54) Да и с ...   Dec 13 2017, 19:32
|- - Огурцов   Цитата(-=TRO=- @ Dec 13 2017, 20...   Dec 14 2017, 01:50
|- - DeNi   Цитата(jcxz @ Dec 13 2017, 21:05) Можно в...   Dec 13 2017, 18:32
|- - jcxz   Цитата(DeNi @ Dec 13 2017, 20:32) И чем в...   Dec 13 2017, 19:38
|- - -=TRO=-   Цитата(jcxz @ Dec 13 2017, 23:38) Не знаю...   Dec 13 2017, 19:47
|- - jcxz   Цитата(-=TRO=- @ Dec 13 2017, 21...   Dec 13 2017, 20:08
|- - AlexandrY   Цитата(-=TRO=- @ Dec 13 2017, 21...   Dec 13 2017, 21:07
- - Огурцов   Цитата(-=TRO=- @ Dec 13 2017, 18...   Dec 13 2017, 19:15
- - Plain   А откуда задохлик STM32 будет брать такие объёмы в...   Dec 13 2017, 19:55
- - -=TRO=-   Plain, по началу с компа, потом с карточки. К том...   Dec 13 2017, 20:03
- - Plain   Отсюда и решение — все данные форматировать на сил...   Dec 13 2017, 20:07
|- - -=TRO=-   Цитата(Plain @ Dec 14 2017, 00:07) Отсюда...   Dec 13 2017, 20:41
|- - jcxz   Цитата(-=TRO=- @ Dec 13 2017, 22...   Dec 13 2017, 20:44
- - DeNi   Здесь можно почитать подробней про DMA в STM32 - A...   Dec 13 2017, 20:10
|- - jcxz   Цитата(DeNi @ Dec 13 2017, 22:10) По прио...   Dec 13 2017, 20:12
- - -=TRO=-   jcxz, в принципе я был готов, что под задачу понад...   Dec 13 2017, 21:09
|- - DeNi   Цитата(-=TRO=- @ Dec 14 2017, 00...   Dec 13 2017, 21:32
|- - jcxz   Цитата(DeNi @ Dec 13 2017, 23:32) Если хо...   Dec 13 2017, 21:46
- - x893   А можно использовать APA102 и забыть про геморрой....   Dec 13 2017, 21:50
- - -=TRO=-   x893, а я темнота и не знал что и такие бывают... ...   Dec 13 2017, 22:43
- - x893   я на 3 канала spi цеплял через dma на 1 MHz   Dec 13 2017, 23:58
- - -=TRO=-   Огурцов, вы знаете, а вам таки удалось меня пнуть ...   Dec 16 2017, 02:52


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

 


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


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