|
|
  |
STM32F051 DMA на GPIO со стробом |
|
|
|
Feb 10 2016, 07:04
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(esaulenka @ Feb 10 2016, 09:54)  Что-то кажется мне, что запускаться эта передача должна таймером. Соответственно, пусть таймер и дёргает стробом. Там все хитрее - нужно еще переключать мультиплексор и защелкивать данные при выключенном выходе, иначе будет смаз от соседних диодов. При этом нужно как-то управлять яркостью, не всегда надо 100%. Создается впечатление, что ТС собирает 6-битный SPI... Если матрица одна, то правильнее воспользоваться на таком чахлике (STM32F051) аппаратным SPI, при этом замкнув выход матрицы со следующим входом, и задвигать 64 * 6 = 384 байта.
|
|
|
|
|
Feb 10 2016, 07:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sherr @ Feb 10 2016, 08:06)  Надо раз в 50-400 мкс задвигать 64 байта данных(точнее 64 х6 бит) в сдвиговые регистры. Можно ли при передаче по DMA после выставления на порту каждого нового байта формировать импульс CLK(80-100 нс достаточно), или прийдется вешать внешнюю логику ? Да, задача не очень понятна. Если я ее правильно понял, то я бы просто завел массив на 64*2 байтов, и этот массив при помощи DMA выпихивал в порт по таймеру. В каждом байте 6 бит под данные, 1 бит под CLK. Желательно, чтобы все сигналы были на одном порту, иначе придется задействовать по одному массиву и каналу DMA на каждый порт. Делал так, выводил одновременно на три порта 16 вообще не связанных между собой последовательных сигналов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 10 2016, 08:03
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Сергей Борщ @ Feb 10 2016, 10:32)  и этот массив при помощи DMA выпихивал в порт по таймеру. Между возникновением DMA-запроса от таймера и самой DMA-транзакцией (запись в GPIO) может пройти около 12 тактов. Поэтому частота DMA-запросов не может быть высокой. При 4 МГц будут фэйлы в работе, при 2МГц скорее всего нет. С учетом того, что данные нужно выставить (и сбросить CLK), в следующим такте дать фронт CLK (при установленных данных), частоту делим еще на 2. Расход памяти будет 6 бит данных + 1 clk + 1 пустой, т.е. всего 75% полезного использования. Инициализация такого массива потребует как минимум удвоенные требования к производительности (нужно писать две копии данных). Как правило матрица - это 6 сдвиговых регистров на 512 бит каждый. Не проще ли сделать из них один сдвиговый регистр на 3072 бита? При помощи SPI, TIMER и DMA задвигать туда 384 байта и формировать защелку таймером. При выводе статической картинки из памяти вообще никакого матана - просто натравливай DMA на нужный адрес.
|
|
|
|
|
Feb 10 2016, 09:58
|
Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955

|
Цитата(adnega @ Feb 10 2016, 09:50)  Точно после каждого байта, а не после каждой пачки из 64 байт? Опишите какой интерфейс управления матрицей (или хотя бы номер хаба, например, HUB12). Номер xаба не помню, матрица RGB 32*64 шаг 3мм (!). R1-G1-B1...R2-G2-B2 + CLK,EN,STB, A0-A3. Глубина сдвиговых регистров - 64 бита, мультиплексирование 1/16 . По поводу сделать массив вдвое больше - уже думал, памяти маловато,при 5 бит/цвет почти все 8 к и уйдут...
Сообщение отредактировал sherr - Feb 10 2016, 09:59
|
|
|
|
|
Feb 10 2016, 10:22
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(sherr @ Feb 10 2016, 12:58)  Номер xаба не помню, матрица RGB 32*64 шаг 3мм (!). R1-G1-B1...R2-G2-B2 + CLK,EN,STB, A0-A3. Глубина сдвиговых регистров - 64 бита, мультиплексирование 1/16 . По поводу сделать массив вдвое больше - уже думал, памяти маловато,при 5 бит/цвет почти все 8 к и уйдут... Для 32 * 64 * RGB нужно минимум 32*64*3=6144 бита = 768 байт. О каких 8К идет речь? Длина регистра 64 бита = 8 байт. Соединяете R1_OUT c R2_IN, R2_OUT с G1_IN, G1_OUT с G2_IN, G2_OUT с B1_IN, B1_OUT с B2_IN. Получаете единый сдвиговый регистр на 48 байт. Передаете эти 48 байт при помощи SPI (SPI_MOSI -> R1_IN, SPI_SCK -> CLK). По окончанию выключаем вывод (EN=0), чуть-чуть ждем, делаем импульс на STB (после импульса на STB можно уже начать задвигать следующую строку), устанавливаем соответствующий A0-A3, включаем вывод (EN=1, если вставить ожидание перед включением, то можно управлять яркостью).
|
|
|
|
|
Feb 10 2016, 10:44
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(adnega @ Feb 10 2016, 12:22)  (после импульса на STB можно уже начать задвигать следующую строку), Я не работал с такими матрицами, но зацеплюсь за эту фразу. Так может пусть таймер формирует этот импульс своей схемой сравнения и генерит прерывание. В прерывании можно запихать эту самую следующую строку параллельно (если уж sherr так хочет грузить параллельно) ногодрыгом в цикле и дальше спокойно ждать следующего прерывания.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 10 2016, 12:19
|
Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955

|
Цитата(adnega @ Feb 10 2016, 13:22)  Для 32 * 64 * RGB нужно минимум 32*64*3=6144 бита = 768 байт. О каких 8К идет речь? 768 x 5(бит/цвет, ВАМ-модляция)x2(как предлагалось выше для получения CLK)=7680 байт. Соответствие между точками на экране и байтами в памяти там достаточно непростое - уж очень быстро быстро не сформируешь ... Сразу признаюсь - задачка учебно-экспериментальная, для STM32 кое-что писал для себя, но практически без прерываний и DMA.
|
|
|
|
|
Feb 10 2016, 12:37
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(sherr @ Feb 10 2016, 15:19)  5(бит/цвет, ВАМ-модляция) Т.е. получается у вас 2^(5*3) = 32768 цветов. По опыту скажу, что выше 4096 делать смысла нет, ибо не заметишь. Т.е. при градациях яркости 4 бита на цвет вполне достаточно. А это 3072 байта на картинку + 768 байт на текущий выводимый буфер.
|
|
|
|
|
Feb 10 2016, 15:58
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Огурцов @ Feb 10 2016, 18:53)  а есть какой-нибудь хак, чтобы пересылка из памяти в порт была строго определена по тактам ? чтобы картинка по экрану не плыла Не хак, а FSMC. Но у этого МК такого нет. Кста, статическая картинка не должна плыть, т.к. есть STB. А бегущая строка будет плыть, т.к. строки мультиплексируются.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|