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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Хочу писать в 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
DeNi
сообщение Dec 13 2017, 17:54
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 18-10-06
Из: Москва
Пользователь №: 21 459



Да и с 3 каналами DMA нормальное решение от одного таймера, первый настроить только на выдачу 1, второй по буферу, третий - 0. В STM32 таймер не может управлять целым портом.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 13 2017, 18:05
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
DeNi
сообщение Dec 13 2017, 18:32
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 18-10-06
Из: Москва
Пользователь №: 21 459



Цитата(jcxz @ Dec 13 2017, 21:05) *
Можно взять другой МК, имеющий внешнюю 16-разрядную шину и выдавать на неё при помощи DMA требуемый поток.
А если в этом МК ещё и стоит хороший контроллер DMA, умеющий передачи "свЯзным списком", то его вообще можно запрограммировать так, чтобы он брал скажем два первых 16-битных слова с фиксированного адреса, а третье слово - из вашего кольцевого буфера.

И чем выдача на шину выигрышние выдачи в порт GPIO через DMA?

Цитата(jcxz @ Dec 13 2017, 21:05) *
Автор не озвучил частоту выдачи.

Он озвучил цену за плату в 2$. И этот светодиод где-то и работает до мегагерца максимум.

Сообщение отредактировал DeNi - Dec 13 2017, 18:35
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 13 2017, 19:15
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(-=TRO=- @ Dec 13 2017, 18:25) *
в STM32 я полный новичек

как полному новичку для озвученной задачи советую взять не stm32, а cpld/fpga
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Dec 13 2017, 19:32
Сообщение #6


Местный
***

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



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

Секундочку, я грешным делом думал, что если одному DMA дать задание через его один канал, то пока он весь свой цикл не отработает, по другим каналам его озадачивать нельзя... Я выходит думал не правильно?

Огурцов, спасибо, но тут у меня под STM32 задачек не одна, и твердо решил изучать его, пока никуда не распыляясь.

Сообщение отредактировал -=TRO=- - Dec 13 2017, 19:35
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 13 2017, 19:38
Сообщение #7


Гуру
******

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



Цитата(DeNi @ Dec 13 2017, 20:32) *
И чем выдача на шину выигрышние выдачи в порт GPIO через DMA?

Ничем. Для низких частот и низких требований к стабильности длительностей фаз - и то и другое пойдёт одинаково.
Моя фраза насчёт последовательных интерфейсов касалась высоких частот (от нескольких МГц).

Цитата(DeNi @ Dec 13 2017, 20:32) *
Он озвучил цену за плату в 2$. И этот светодиод где-то и работает до мегагерца максимум.

Не знаю. Недавно на одном из форумов читал, что некто собирался тактировать такие линейки несколькими МГц. Или даже больше 10.

Цитата(-=TRO=- @ Dec 13 2017, 21:32) *
что если одному DMA дать задание через его один канал, то пока он весь свой цикл не отработает, по другим каналам его озадачивать нельзя

Можно
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Dec 13 2017, 19:47
Сообщение #8


Местный
***

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



Цитата(jcxz @ Dec 13 2017, 23:38) *
Не знаю. Недавно на одном из форумов читал, что некто собирался тактировать такие линейки несколькими МГц. Или даже больше 10.

У этих светодиодов четко 1.25мкс на битовый период, и довольно жесткие допуски по длительностям (около 10-20%, точно не вспомню, даташит надо открывать).

https://hsto.org/files/d91/3c8/0f8/d913c80f...70f5eb4b897.png

Сообщение отредактировал -=TRO=- - Dec 13 2017, 19:51
Go to the top of the page
 
+Quote Post
Plain
сообщение Dec 13 2017, 19:55
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 6 776
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710



А откуда задохлик STM32 будет брать такие объёмы видео? Рожать такое самостоятельно ему явно не по силам.
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Dec 13 2017, 20:03
Сообщение #10


Местный
***

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



Plain, по началу с компа, потом с карточки.
К тому же там не такой большой объем как вы думаете, такой объем (в 16 ног) нужно прокачивать из за динамической индикации, я просто "вращалку" задумал, среднего (по сегодняшним меркам) разрешения.

Сообщение отредактировал -=TRO=- - Dec 13 2017, 20:09
Go to the top of the page
 
+Quote Post
Plain
сообщение Dec 13 2017, 20:07
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 6 776
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710



Отсюда и решение — все данные форматировать на сильной стороне, т.е. перетасовывать биты и избыточно кидать в SD лишние 0 и 1, а STM32 будет лишь тупой молотилкой.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 13 2017, 20:08
Сообщение #12


Гуру
******

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



Цитата(-=TRO=- @ Dec 13 2017, 21:47) *
У этих светодиодов четко 1.25мкс на битовый период, и довольно жесткие допуски по длительностям (около 10-20%, точно не вспомню, даташит надо открывать).

Ну вот и прикиньте: на один битовый период вам нужно успеть выполнить 3 пересылки через DMA (установка 0, установка 1, установка бита данных).
И с точностью фазы 10% максимальная допустимая задержка будет = 1.25/3*0.1= ~42нс. А какая частота CPU? Наверное не более 72МГц? Это ~14 нс/такт.
А теперь представьте, что вот пришёл к DMA запрос от таймера выполнить очередную пересылку ОЗУ->GPIO, а в это время CPU по этой же самой шине выполняет команду например:
POP {R0-R12,PC} т.е. - 15 тактов.
Сколько нс DMA будет ждать своей очереди?
Конечно у DMA-каналов обычно есть FIFO (но есть ли оно в этом МК и сколько?) - может оно и поможет как-то....
Go to the top of the page
 
+Quote Post
DeNi
сообщение Dec 13 2017, 20:10
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 18-10-06
Из: Москва
Пользователь №: 21 459



Здесь можно почитать подробней про DMA в STM32 - AN2548 Using the STM32F101xx and STM32F103xx DMA controller

По приоритетам обслуживания CPU и DMA в STM32 одинаковые, и если не будет 100% загрузки шины,
то запросы будут выполняться довольно точно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 13 2017, 20:12
Сообщение #14


Гуру
******

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



Цитата(DeNi @ Dec 13 2017, 22:10) *
По приоритетам обслуживания CPU и DMA в STM32 одинаковые, и если не будет 100% загрузки шины,
то запросы будут выполняться довольно точно.

Если CPU уже начал выполнять длинную команду, то никакой DMA шину у него в это время не отберёт. Имха sm.gif
Можете конечно весь код на асме написать. С сохранением/восстановлением стека только пословно. И отказавшись вообще от прерываний biggrin.gif
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Dec 13 2017, 20:41
Сообщение #15


Местный
***

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



Цитата(Plain @ Dec 14 2017, 00:07) *
Отсюда и решение — все данные форматировать на сильной стороне, т.е. перетасовывать биты и избыточно кидать в SD лишние 0 и 1, а STM32 будет лишь тупой молотилкой.

Если гнать с компа то поток хотелось бы тоже не быстрый (например через UART пропихнуть), а экономить хочется оперативку, это ведь из неё через ДМА выгребатся все будет (20 кило байт оперативы, по 3 байта на цвет, уже 6 килопикселей, а это 80x80 всего, если запихнуть еще старт-стопы, то даже 50x50 не поместится).

К тому же эти самы непредсказуемые джиттеры ДМА и подначивали решать старстоповые дела без ДМА (все же нагрузка в три раза меньше).
Была мысль с аппаратным решением проблеммы, поставить буферный регистр с третьим состоянием, одним выходом таймера переводить регистр в третье состояние, а другим таймером формировать подтяжками нули и еденицы, а ДМА инициировать как раз в начале перехода регистров в Z состояние (за 80мкс старстопов ДМА должен успеть), тогда по фронтам должно быть все шоколадно... но это два корпуса регистров и 16 сопротивлений (или штук пять корпусов логики). Но ведь хочется то же самое все силами контроллера.

Сообщение отредактировал -=TRO=- - Dec 13 2017, 20:51
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 13 2017, 20:44
Сообщение #16


Гуру
******

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



Цитата(-=TRO=- @ Dec 13 2017, 22:41) *
Но ведь хочется то же самое все силами контроллера.

Так и возьмите МК, которому заведомо это под силу. У которого есть например 4 шт. quad-SPI.
Ну или какой-нить STM32, у которого есть несколько независимых регионов памяти, с отдельными шинами. С CCM например.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 13 2017, 21:07
Сообщение #17


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(-=TRO=- @ Dec 13 2017, 21:47) *
У этих светодиодов четко 1.25мкс на битовый период, и довольно жесткие допуски по длительностям (около 10-20%, точно не вспомню, даташит надо открывать).

https://hsto.org/files/d91/3c8/0f8/d913c80f...70f5eb4b897.png

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

Советую присмотреться к микроконтроллерам i.MX RT1050, там сделаете 16 каналов с бит-стримом без проблем.
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Dec 13 2017, 21:09
Сообщение #18


Местный
***

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



jcxz, в принципе я был готов, что под задачу понадобится более мощный МК, но первую урезанную по характеристикам тренировочную версию буду ваять на том что есть.
К тому же, попытки впихнуть не впиховываемое, в рамках конкретной задачи, сильно мотивирует к углубленному изучению, что для начинающего самое оно.

AlexandrY, прошу пардону, про длинные это я получается не правду написал, с учетом динамической индикации их там в одной линейке от силы 32 (ну максимум 64) штуи будет.
Про затягивание фронтов к концу линейки спасибо что предупредили, пока в наличии только россыпью, линейки только почтой едут, как приедут потыкаю осцилографом, и погоняю длительностям.

Сообщение отредактировал -=TRO=- - Dec 13 2017, 21:17
Go to the top of the page
 
+Quote Post
DeNi
сообщение Dec 13 2017, 21:32
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 18-10-06
Из: Москва
Пользователь №: 21 459



Цитата(-=TRO=- @ Dec 14 2017, 00:09) *
jcxz, в принципе я был готов, что под задачу понадобится более мощный МК, но первую урезанную по характеристикам тренировочную версию буду ваять на том что есть.
К тому же, попытки впихнуть не впиховываемое, в рамках конкретной задачи, сильно мотивирует к углубленному изучению, что для начинающего самое оно.

Я думаю не стоит впихивать невпихумое, как правильно здесь написали надо брать что-то другое. В F1 у DMA нет FIFO, и длинные инструкции типа входа в прерывание будут давать слишком большой джиттер.
Если хочется именно STM32, на F4 можно попробовать, поместив буфер в отдельный блок ОЗУ.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 13 2017, 21:46
Сообщение #20


Гуру
******

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



Цитата(DeNi @ Dec 13 2017, 23:32) *
Если хочется именно STM32, на F4 можно попробовать, поместив буфер в отдельный блок ОЗУ.

Да. В F4 есть CCM с прямой шиной к ядру - стеки можно туда. Ну и memcpy() не пользовать при болтании лампочками.
Go to the top of the page
 
+Quote Post
x893
сообщение Dec 13 2017, 21:50
Сообщение #21


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



А можно использовать APA102 и забыть про геморрой.
И уже всё бы светилось.
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Dec 13 2017, 22:43
Сообщение #22


Местный
***

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



x893, а я темнота и не знал что и такие бывают...
только что на алиэкспрессе заказал сотню в размере 3535 (за 10 с хвостиком баксов), бум пробовать, спасибо.
Go to the top of the page
 
+Quote Post
x893
сообщение Dec 13 2017, 23:58
Сообщение #23


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



я на 3 канала spi цеплял через dma на 1 MHz

Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 14 2017, 01:50
Сообщение #24


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(-=TRO=- @ Dec 13 2017, 20:32) *
Огурцов, спасибо, но тут у меня под STM32 задачек не одна, и твердо решил изучать его, пока никуда не распыляясь.

никто не запрещает к cpld сбоку притулить stm32
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Dec 16 2017, 02:52
Сообщение #25


Местный
***

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



Огурцов, вы знаете, а вам таки удалось меня пнуть в этом направлении. Оказалось с тех пор когда я пытался пинать себя сам в этом направлении, прошло много времени, и бюджетные cpld стали совсем бюджетными, и судя по беглой информации, знакомство с ними обещает быть даже проще чем предстоящие разборки с переферией stm32. Количество ножек все еще пугает, но тем не менее. Так что спасибо.
Go to the top of the page
 
+Quote Post

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

 


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


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