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

И ещё вопрос, на F407 в режиме DMA не генерируется сигнал на PA0-PA6 анализатор показывает L сигнал.

Уверены, что не напутали с характеристиками? Покажите, пожалуйста, четкие фото панели с обратной стороны.

Речь точно про эту библиотеку? Она не поддерживает контроллеры F407

С модулем точно ничего не перепутал,данные брал с конфиг брал с приёмной карты novastar, с другими паттерна и работает ещё хуже . За f407 извиняюсь,просто читал ваши посты про dma и думал удалось реализовать. На плате нашлись 74hc245c + icnd2013ep и ещё какие-то микрухи (скорее всего драйвера) на них не читается маркировка от слова совсем.


Хм… просто 104х52 необычный размер. Хотя если подумать, с промежутком 3мм это получается почти стандартные 320х160 мм.

Судя по наклейке на панели, используются драйвера icn2013 и sm16306. Первый самый обычный, а вот со вторым встречаюсь в первый раз. Даташит на китайском и сразу не могу сказать, заработает он или нет.
Сейчас не дома и смогу заняться этим на следующей неделе.

DMA работает, но я работаю с платами "блекпил’ с контроллерами F401 и F411, с F407 не пробовал.

Посмотрел код dma в библиотеке, скорее всего проблема лишь в выбранном таймере, потому что выходы tim1 это PE

Здравствуйте. Все еще разбираюсь в библиотеке и в файле DMD_STM32.cpp увидел две функции с одинаковым названием: DMD::drawChar.

int DMD::drawChar(const int bX, const int bY, const unsigned char letter, uint16_t color, byte orientation)
{
	uint8_t height = Font->get_height();
	return drawChar(bX, bY, letter, color, 0, height, orientation);
}

/*--------------------------------------------------------------------------------------*/
int DMD::drawChar(const int bX, const int bY, const unsigned char letter, uint16_t color, int16_t miny, int16_t maxy, byte orientation)
{
	
	if ((bX >= _width) || (bY >= _height)) return -1;

	unsigned char c = letter;
	if (!Font->is_char_in(c)) return 0;

	uint8_t fg_col_bytes[4];
	uint8_t bg_col_bytes[4];
	uint16_t bg_color = inverse_color(color);
	uint8_t height = Font->get_height();
	// temp parameter for beta version
	uint8_t matrix_h = 16;
	
	if (c == ' ') { //CHANGED FROM ' '
		if (orientation) { // vertical scroll
			this->drawFilledBox(bX, bY, bX + height, bY + matrix_h, bg_color);
			return height;
		}
		else {   // normal scroll
			int charWide = Font->get_char_width(' ');
			this->drawFilledBox(bX, bY + miny, bX + charWide, bY + maxy, bg_color);
			return charWide;
		}
	}

	if (Font->is_gfx_font()) {

		DMD_GFX_Font* ff = (DMD_GFX_Font*)Font;
		GFXfont* gfxFont_p = ff->get_font_by_char(c);
		c -= ff->get_first_by_char(c);

#if (defined(__STM32F1__) || defined(__STM32F4__))
		GFXglyph* glyph = &((gfxFont_p->glyph)[c]);
		uint8_t* bitmap = gfxFont_p->bitmap;
#endif		
	
		uint16_t bo = pgm_read_word(&glyph->bitmapOffset);
		uint8_t  w = pgm_read_byte(&glyph->width);
		uint8_t	 h = pgm_read_byte(&glyph->height);
		int8_t  yo = height + (int8_t)pgm_read_byte(&glyph->yOffset);
		uint8_t  xx, yy, bits = 0, bit = 0, bsize, hh;
		int8_t   xo = (int8_t)pgm_read_byte(&glyph->xOffset);
		uint8_t  ww = pgm_read_byte(&glyph->xAdvance);
		if (orientation) {   // vertical scroll
			xo = yo;
			yo = w + (matrix_h - w) / 2;
			hh = xo + h;
			ww = hh;
			this->drawFilledBox(bX, bY, bX + hh, bY + matrix_h, bg_color);
		}
		else {
			if (fast_Hbyte) {
				getColorBytes(fg_col_bytes, color);
				getColorBytes(bg_col_bytes, bg_color);
			}
			this->drawFilledBox(bX, bY + miny, bX + ww, bY + maxy, bg_color);
		}



		for (yy = 0; yy < h; yy++) {
			for (xx = 0; xx < w; xx++) {
				if (!(bit++ & 7)) {
					bits = pgm_read_byte(&bitmap[bo++]);
				}

				if ((!orientation) && (fast_Hbyte)) {
					bsize = ((w - xx) > 8) ? 8 : (w - xx);
					uint8_t bbit = (bit - 1) & 7;
					if (bsize > (8 - bbit)) bsize = 8 - bbit;
					drawHByte(bX + xo + xx, bY + yo + yy, bits, bsize, fg_col_bytes, bg_col_bytes);
					bit += bsize - 1;
					xx += bsize - 1;
					bits <<= bsize;
				}
				else {
					uint16_t col;
					if (bits & 0x80) { col = color; }
					else { col = bg_color; }
					if (orientation) { // vertical scroll
						writePixel(bX + xo + yy, bY + yo - xx, col);
					}
					else {
						writePixel(bX + xo + xx, bY + yo + yy, col);
					}
					bits <<= 1;
				}

			}
		}

		return ww;
	}
	else {


		DMD_Standard_Font* ff = (DMD_Standard_Font*)Font;
		uint8_t width = ff->get_char_width(c);
		uint8_t bytes = (height + 7) / 8;
		uint16_t index = ff->get_bitmap_index(c);
		c -= ff->get_first();

		if (bX < -width || bY < -height) return width;



		// last but not least, draw the character
		for (uint8_t j = 0; j < width; j++) { // Width
			for (uint8_t i = bytes - 1; i < 254; i--) { // Vertical Bytes
				uint8_t data = pgm_read_byte(ff->font_ptr + index + j + (i * width));
				int offset = (i * 8);
				if ((i == bytes - 1) && bytes > 1) {
					offset = height - 8;
				}
				for (uint8_t k = 0; k < 8; k++) { // Vertical bits
					if ((offset + k >= i * 8) && (offset + k <= height)) {
						if (data & (1 << k)) {
							writePixel(bX + j, bY + offset + k, color);
						}
						else {
							writePixel(bX + j, bY + offset + k, bg_color);
						}
					}
				}
			}
		}
		return width;
	}
}

Хотелось бы узнать, почему эти функции имеют одинаковые имена и почему не происходит конфликта из-за этого?

Гугал: “Перегрузка функций С++”. Читать до понимания

Функция - это не только название, но и параметры !

@craftish @Vahoo
Если остались проблемы с матрицами, пишите, я вернулся :slight_smile:

Честно говоря, я жду сделанную вами библиотеку для 80х40 , 1/10 scan.

@Vahoo
вот с этим шаблоном что выводит?

У меня еще вопрос: как можно сделать две бегущие строки одновременно?
Я попытался сделать по аналогии через функцию dmd.stepMarquee(); но у меня сдвигается только последний нарисованный массив. А первый массив стоит статично.

вручную циклическим изменением координаты текста

dmd.stepMarquee(); может быть только один

пробовал, вот резултати слово “TEST”

Можете запустить код, заполняющий матрицу по одному пикселю по строкам?

Буду рад помощи)

@craftish
Здравствуйте
Покажите часть кода скетча, где задаются пины и инициализацию объекта DMD.
Какую плату используете?

Вот!

Пожалуйста, запустите тест заполнения матрицы с этими шаблонами:

#define RGB80x40_S10_pt1    	4,80,40,10,1

и

#define RGB80x40_S10_pt2    	4,80,40,10,2

и запишите видео с заполнением хотя бы первых 5-6 строк

Если хотите, можем перейти в почту

#define RGB104x52_S13_craft 4,112,52,13,3
// ==== DMD_RGB pins ====
// mux pins - A, B, C... all mux pins must be selected from same port!
#define DMD_PIN_A PB6
#define DMD_PIN_B PB5
#define DMD_PIN_C PB11
#define DMD_PIN_D PB10
#define DMD_PIN_E PB1
// 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 PB7

// 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[] = { PA6, PA0,PA1,PA2,PA3,PA4,PA5 }; // CLK, R0, G0, B0, R1, G1, B1

DMD_RGB <RGB104x52_S13_craft, COLOR_4BITS> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);