DMD_STM32 - библиотека DMD матриц для СТМ32 и RP2040

У меня уличный он сейчас там стоит около 2070.

Светодиодный модуль Qiangli уличный Q4 320X160

спасибо

Нашел у себя на компе даташит на драйвер - DP3246 - возможно родственник вашего 3216. Он для запуска требует загрузки конфигурации.
Вы ничего подобного не делаете?

Нет , ничего не делал,

Сделал простенький скечт, пины взял как в примере с Вашим шаблоном(проверьте если не трудно). Всё работает…

#define DMD_PIN_A PA1
#define DMD_PIN_B PA2
#define DMD_PIN_C PA3

#define DMD_PIN_nOE PA0
#define DMD_PIN_SCLK PA5
#define DMD_PIN_CLK PB9

#define DMD_PIN_R0  PB15
#define DMD_PIN_G0  PB14
#define DMD_PIN_B0  PB13
#define DMD_PIN_R1  PB12
#define DMD_PIN_G1  PB11
#define DMD_PIN_B1  PB10


uint8_t buffer_displ[10][160];
uint8_t rows = 0;


void setup() {
  
 pinMode(DMD_PIN_A, OUTPUT);
 pinMode(DMD_PIN_B, OUTPUT); 
 pinMode(DMD_PIN_C, OUTPUT); 
 
 pinMode(DMD_PIN_nOE, OUTPUT); 
 pinMode(DMD_PIN_SCLK, OUTPUT); 
 pinMode(DMD_PIN_CLK, OUTPUT); 
 
 pinMode(DMD_PIN_R0, OUTPUT); 
 pinMode(DMD_PIN_G0, OUTPUT); 
 pinMode(DMD_PIN_B0, OUTPUT); 
 pinMode(DMD_PIN_R1, OUTPUT); 
 pinMode(DMD_PIN_G1, OUTPUT); 
 pinMode(DMD_PIN_B1, OUTPUT); 

  
  Timer1.pause(); // tic
  Timer1.setPeriod(100);
  Timer1.attachInterrupt(TIMER_UPDATE_INTERRUPT, Reload_buffer); // активируем прерывание
  Timer1.resume();

 
}

void loop() {
 for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 160; j++) {
            buffer_displ[i][j] =0b100100;
            delay(10);
        }
    }

}

void Reload_buffer(){
   if(rows == 10)  { rows = 0; }

      digitalWrite(DMD_PIN_nOE, HIGH);//OE

             digitalWrite(DMD_PIN_SCLK, HIGH);// LAT HIGH
             digitalWrite(DMD_PIN_SCLK, LOW);// LAT  LOW

             // Цикл вывода светодиодов в строке
             for(uint8_t i=0; i < 160; i++)
             {// Выставляем биты включения светодиодов

              GPIOB->regs->BSRR =(0b1111110000000000 << 16) | ( buffer_displ[rows][i] << 10 ) ;

                 // Отправляем выставленное значение
                digitalWrite(DMD_PIN_CLK, LOW);//CLK Low
                digitalWrite(DMD_PIN_CLK, HIGH);//CLK High
             }
             // Выставляем адрес строки для отображения
              //  GPIOA->BRR = 0b0000000000011110;

                digitalWrite(DMD_PIN_B, HIGH);//Oe PA2
          for (int r = 9; r >= 0; r--) {
                if (rows % 10 == r)  digitalWrite(DMD_PIN_C, HIGH);//SDI PA3

                            else digitalWrite(DMD_PIN_C, LOW);//SDI PA3

                digitalWrite(DMD_PIN_A, HIGH);//DCLK PA1
                digitalWrite(DMD_PIN_A, LOW);//DCLK PA1
                                         }

                digitalWrite(DMD_PIN_B, LOW);//Oe PA2

                                                                    // GPIOA->BSRR = (rows << 1);
        digitalWrite(DMD_PIN_nOE, LOW);//OE
rows++;

}

пины у меня другие, но вряд ли это влияет на работу… код посмотрю позже.
Спасибо.

Посмотрел, разница вот в чем. В этом коде Вы каждый раз заново задвигаете в регистр все 10 бит:

а я при каждом проходе лишь проталкиваю содержимое регистра на 1 бит вперед.

Вероятно этот регистр так не работает.
Если хотите, этот код как есть можно вставить в шаблон и проверить.

Попробовал так , как Вы сказали…

void set_mux(uint8_t curr_row) override {
        byte pin_DMD_A = this->mux_pins[0];
        byte pin_DMD_B = this->mux_pins[1];
        byte pin_DMD_C = this->mux_pins[2];
        // Just shift the row mux by one for incremental access
       

    digitalWrite(pin_DMD_B, HIGH);//Oe PA2
     for (int r = 9; r >= 0; r--) {
         if (curr_row % 10 == r)  digitalWrite(pin_DMD_C, HIGH);//SDI PA3
         else digitalWrite(pin_DMD_C, LOW);//SDI PA3
         digitalWrite(pin_DMD_A, HIGH);//DCLK PA1
         digitalWrite(pin_DMD_A, LOW);//DCLK PA1
       }
     digitalWrite(pin_DMD_B, LOW);//Oe PA2


    }

Печалька… :sob:

Вадим, кажется вижу в чем проблема. Ваши пины для цветовых каналов не подходят. Вот цитата из описания к версии 0.9.0 со старого форума:

Важно - использование ДМА требует подключения матрицы к строго определенным пинам, цветовые каналы R0-G0-B0-R1-G1-B1 к пинам PA0-PA5, сигнал CLK - к PA6. Старый режим RGB с возможностью относительно свободного выбора пинов сохранен для совместмости, но код режима изменился - теперь он называется COLOR_4BIT_Packed. ДМА в этом режиме не используется.

Попробуйте запустить код в цветовом режиме COLOR_4BIT_Packed

DMD_RGB_SHIFTREG_ABC <RGB80x40s10_sh, COLOR_4BIT_Packed> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);

Прощу прощения, библиотека большая, я уже сам начинаю забывать детали.

‘COLOR_4BIT_Packed’ was not declared in this scope
Наверно у меня Версия не самая последняя…

упс…

COLOR_4BITS_Packed

Ура, Заполняет по четверти экрана, начиная с левого верхнего угла,
Но сильно мерцает, и строки которые ещё не заполнены, тоже бледно мерцают…

поясните

попробуйте вернуть мой код set_mux() из сообщения 127

Сложно описать сначала заполняется четвёртая часть экрана, 40х20 пикселей слева сверху, затем сверху справа, затем снизу слева …
при заполнение бегут по 2 строки,цвет синий и всё сильно мерцает…

в итоге заполняется все?

Если да, то значит надо подбирать преобразование, которое в функции

get_base_addr()

Если нет - значит что-то работает неправильно.

Заполняется всё…

Вернул Ваш код из 126
Заполненные строки практически не мерцают, но мерцают соседние строки рядом с заполняемыми по одной сверху и снизу… но это наверное потому я nOE подключил некорректно …

тут удаленно ничего не могу сказать.

У Вас его надо к каким то определённым, из за Шима у меня PA0

пин OE нужно выбрать среди выходов таймера3 – PB0 PB1 PA6 PA7.