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

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

Хорошо, буду ждать)


(И опять не завелось с первого раза).
Вопрос опять к знающим, может ли указанные пины влиять на вывод изображения битмапа?

#define ENABLE_DUAL_BUFFER false

// ==== DMD_RGB pins ====
// mux pins - A, B, C... all mux pins must be selected from same port!
#define DMD_PIN_A PB5
#define DMD_PIN_B PB4
#define DMD_PIN_C PB3
#define DMD_PIN_D PB7
#define DMD_PIN_E PB8
// put all mux pins at list
uint8_t mux_list[] = { DMD_PIN_A , DMD_PIN_B , DMD_PIN_C , DMD_PIN_D , DMD_PIN_E };

// pin OE must be one of PB0 PB1 PA6 PA7
#define DMD_PIN_nOE PB0
#define DMD_PIN_SCLK PB1

// Pins for R0, G0, B0, R1, G1, B1 channels and for clock.
// By default the library uses RGB color order.
// If you need to change this - reorder the R0, G0, B0, R1, G1, B1 pins.
// All this pins also must be selected from same port!
uint8_t custom_rgbpins[] = {PA15, PA2,PA3,PA4,PA5,PA6,PA7 }; // CLK, R0, G0, B0, R1, G1, B1

// Fire up the DMD object as dmd<MATRIX_TYPE, COLOR_DEPTH>
// We use 64x32 matrix with 16 scans and 4bit color:
DMD_RGB <RGB64x32_S8_OKSingra, COLOR_4BITS_Packed> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);
// other options are:
// <RGB32x16plainS8> - 32x16 matrix with 8scans
// <RGB80x40plainS20> - 80x40 matrix with 20scans
// <RGB64x64plainS32> - 64x64 matrix with 32scans
// Color depth - <COLOR_4BITS_Packed> or <COLOR_4BITS>
// <COLOR_1BITS> mode is not recomended for bitmap

Суть проблемы: хотел загрузить скетч примера бимапа dmd_rgb_bitmap. Загрузил, а на матрице остались артефакты. И это если на матрице было что-то выведено до залития скетча. А если до заливки на матрице ничего не было, то после скетча dmd_rgb_bitmap остается черная матрица. При этот часть кода из примера, которая отвечает за яркость работает. Яркость плавно уменьшается.
P.S. при этих же пинах и настройках пример с буквами dmd_rgb работает корректно.

Опишите подробнее, в какой момент появляются артефакты? Как это связано с загрузкой кода?
В скетче примера с битмапом показываются две картинки, сменяя друг друга. Артефакты видны на каждой из них или только на одной? Или в момент смены? Или только один раз после загрузки?

Если до загрузки скетча примера dmd_rgb_bitmap (да и в принципе заливки любого скетча) на матрице были какие-то буквы или изображение не важно, если горели какие-то пиксели, то в момент загрузки скетча часть пикселей полностью выключается, а часть рандомно остаются и эти пиксели загораются на полную яркость того же цвета, что и до этого горели. После загрузки скетча (уже конкретно dmd_rgb_bitmap) эти пиксели (рандомные артефакты, которые в тех же рандомных местах остаются) светятся в соответствии с уровнем яркости, который был выставлен в самом скетче. Вот после загрузки скетча эти пиксели начинают постепенно уменьшать яркость и потом в какой-то момент зажигаются ярко и опять постепенно снижают яркость. И так бесконечно. При этом картинки должны меняться, но на матрицах меняется только яркость свечения. Пиксели как горели в рандомных местах так и не меняют своего положения. Только меняется яркость этих пикселей.

А если на матрице до заливки скетча ничего выведено не было, то после заливки скетча dmd_rgb_bitmap матрица так черной и останется. И ничего не меняется вообще.

Насколько я понял, часть кода которая отвечает за регулировку яркости она работает корректно, а часть кода которая отвечает за отрисовку картинки битмапа не работает. Я загружаю примеры, менял только пины и сканирование. И вот с этими параметрами пример с текстом dmd_rgb работает корректно, а пример с битмапом dmd_rgb_bitmap не работает корректно.

Опять не очень понятно - какое сканирование Вы меняете? И зачем менять пины?

Вопрос такой - допустим вы загрузили пример с битмапом и наблюдаете артефакты, описанные в прошлом сообщении. Если на том же конфиге, не меняя пинов и сканирования , запустить пример с текстом - он будет работать нормально?

От того скетча что выложен на гитхаб отличия только вот в этих строчках

// ==== DMD_RGB pins ====
// mux pins - A, B, C... all mux pins must be selected from same port!
#define DMD_PIN_A PB5
#define DMD_PIN_B PB4
#define DMD_PIN_C PB3
#define DMD_PIN_D PB7
#define DMD_PIN_E PB8
// pin OE must be one of PB0 PB1 PA6 PA7
#define DMD_PIN_nOE PB0
#define DMD_PIN_SCLK PB1
uint8_t custom_rgbpins[] = { PA15,PA2,PA3,PA4,PA5,PA6,PA7 }; // CLK, R0, G0, B0, R1, G1, B1
DMD_RGB <RGB64x32_S8_OKSingra, COLOR_4BITS_Packed> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);
// other options are:
// <RGB32x16plainS8> -  32x16 matrix with 8scans
// <RGB80x40plainS20> - 80x40 matrix with 20scans
// <RGB64x64plainS32> - 64x64 matrix with 32scans
// Color depth - <COLOR_4BITS_Packed>, <COLOR_4BITS> or <COLOR_1BITS>

Вот получается я настроил пины на выводы матрицы A, B, C, nOE, SCLK, CLK, R0, G0, B0, R1, G1, B1
И поставил режим сканирования размером матрицы RGB64x32_S8_OKSingra

Вот такие параметры я выставляю в скетчи и один с текстом работает, а второй с битмапом нет.

Ляяяяя. Я вспомнил, что в dmd_rgb я добавлял строчку enableDebugPorts(); в функцию setup и все заработало. И вот сейчас я добавил эту строчку в dmd_rgb_bitmap и этот скетч тоже заработал.

Плата блюпилл STM32F103, прошиваете через ст-линк видимо?

Да, я все через ст-линк шью.

Для STM32F103 через ст-линк при использовании пинов PB3 PB4 нужно enableDebugPorts(); . Или поменяйте эти пины на какие-то другие.

Да, я еще в начале заливки битмапа думал, что что-то не так с подключением, но долговато вспоминал, как я это исправлял.
Хотел бы еще узнать про двойной буфер. Как им пользоваться. Пока что как я его не крутил не вертел, у меня ничего не получилось вывести при
#define ENABLE_DUAL_BUFFER true
Если есть возможность, на примере скетча dmd_rgb показать, как работает этот двойной буфер.
Или что-нибудь приближенное к этому скетчу, чтобы как можно меньше всяких лишних наворотов было. Чтобы прям для чайников объяснение.

Так ведь прямо в этом примере этот двойной буфер можно включить и выключить - и в обоих случаях картинка показывается, верно?
А значит вот это не совсем верно:

Нет, не верно. Когда я включаю двойной буфер у меня горит то же самое, как я описывал проблему выше без указания строчки enableDebugPorts();
То есть рандомные пиксели загораются и всё. А когда ВЫключаю двойной буфер, то скетч работает нормально.

Код примера не меняли, кроме пинов и нициализации обьекта DMD?

давайте разделим проблему. Откажитесь от использования пинов PB3 PB4 и уберите из кода enableDebugPorts(); и проверьте, как реагирует двойной буфер в этом случае

Сейчас чтобы наверняка скачал с гитхаба заново весь проект dmd_STM32. Сменил только пины и сканирование на вот такое

// ==== DMD_RGB pins ====
// mux pins - A, B, C... all mux pins must be selected from same port!
#define DMD_PIN_A PB7
#define DMD_PIN_B PB6
#define DMD_PIN_C PB5
#define DMD_PIN_D PB9
#define DMD_PIN_E PB8
// put all mux pins at list
uint8_t mux_list[] = { DMD_PIN_A, DMD_PIN_B, DMD_PIN_C, DMD_PIN_D, DMD_PIN_E };

// pin OE must be one of PB0 PB1 PA6 PA7
#define DMD_PIN_nOE PB0
#define DMD_PIN_SCLK PB1

// Pins for R0, G0, B0, R1, G1, B1 channels and for clock.
// By default the library uses RGB color order.
// If you need to change this - reorder the R0, G0, B0, R1, G1, B1 pins.
// All this pins also must be selected from same port!
uint8_t custom_rgbpins[] = { PA15, PA2, PA3, PA4, PA5, PA6, PA7 };  // CLK, R0, G0, B0, R1, G1, B1

// Fire up the DMD object as dmd<MATRIX_TYPE, COLOR_DEPTH>
// We use 64x32 matrix with 16 scans and 4bit color:
DMD_RGB<RGB64x32_S8_OKSingra, COLOR_4BITS_Packed> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);```

После этого двойной буфер включал и выключал и все работало НО!!! скетч dmd_rgb работает только при добавлении enableDebugPorts(); Без нее никак не работает. Со строчкой enableDebugPorts(); работает и #define ENABLE_DUAL_BUFFER true и #define ENABLE_DUAL_BUFFER false

Значит еще какие-то пины из этих используются в дебаге… Но я не знаю какие.
Я ст-линком шью только блек-пилы STM32F4, контроллеры STM32F1 только через бутлоадер

Еще сдвинул пины

#define DMD_PIN_A PB9
#define DMD_PIN_B PB8
#define DMD_PIN_C PB7
#define DMD_PIN_D PB6
#define DMD_PIN_E PB5

Без enableDebugPorts(); не работает.

Попробуйте PA15 поменять на какой-то иной PA пин. По-моему он используется при дебаге…