Top.Mail.Ru
Уведомления
Очистить все

[Закреплено] STM32 для начинающих

Страница 19 / 19
(@aleksej-6)
Level 3

Здравствуйте !

Решил разобраться с 7" дисплеем и платой с stm32hiit6 и sdram W9825G6KH

Дисплей светиться выбранным цветом (при выборе в настройках LTDS). SDRAM тоже (вроде) работает.

Как заставить дисплей светиться нужным цветом из программы (main) не понимаю.. Где то неверно установлены настройки, а где не пойму ? 

 

https://cloud.mail.ru/public/eAUY/oTbF777xh

ОтветитьЦитата
Размещено : 15.02.2025 05:35
(@aleksej-6)
Level 3

Хотя именно запись и чтение в SDRAM и не работает похоже.. Нет буфера и нет ничего далее.

ОтветитьЦитата
Размещено : 15.02.2025 07:33
(@aleksej-6)
Level 3

Точнее, запись и сравнение в sdram делаю - значения (записанное и прочитанное) сходятся.

А почему не получается на экран вывести не понимаю.. чего то не то делаю

 

ОтветитьЦитата
Размещено : 15.02.2025 09:16
Aveal
(@aveal)
Top level Admin

@aleksej-6 Доброго времени суток! Если тут менять, то цвет меняется?

изображение
ОтветитьЦитата
Создатель темы Размещено : 15.02.2025 11:34
(@aleksej-6)
Level 3

@aveal 

Да, цвет заливки экрана меняется.

Тот же эффект, если в программе такую строку написать LTDC->BCCR = 0x00FF; 

 

ОтветитьЦитата
Размещено : 15.02.2025 12:08
(@aleksej-6)
Level 3
 
Вот так запись и чтение в sdram работает  *(__IO uint8_t *) (SDRAM_BANK_ADDR + n) = 35;
 
а так нет    *(__IO uint16_t*)(SDRAM_BANK_ADDR + n) = 35;
 
А мне же буфер для экрана нужен именно 16 бит ..
 
ОтветитьЦитата
Размещено : 15.02.2025 13:46
(@aleksej-6)
Level 3

Напутал в элементарном:

for (uint32_t i = 0; i < bufer_lsd_size; i++)
{
    *(__IO uint16_t*) (SDRAM_BANK_ADDR + 2*i) = 310; //
}

Надо же 2*i, сейчас sdram  работает. 

Вопрос, какой функцией передать видео буфер в ltdc или 2dma ?

Эти функции не работают:

HAL_LTDC_SetAddress(&hltdc,SDRAM_BANK_ADDR,0);

HAL_DMA2D_Start(&hdma2d, 0x00, *(__IO uint16_t*)(SDRAM_BANK_ADDR),
hltdc.LayerCfg[0].ImageWidth, hltdc.LayerCfg[0].ImageHeight);

 

 

ОтветитьЦитата
Размещено : 16.02.2025 03:32
(@aleksej-6)
Level 3
IMG 1001

Когда совсем - совсем не работает, начинаешь читать "инструкции" )

Надо было выставить в настройках )

ОтветитьЦитата
Размещено : 16.02.2025 12:31
 Jebo
(@jebo)
Level 1

Доброго времени суток. 

Не могу понять почему не работает моя программа. Смысл простой. Сначала я открываю файл и жду данных из UART. Потом я заполняю буфер (64 8-битных слова) данными из UART через DMA. Когда посылка с UART прекращается я должен закрыть файл. Сначала я делал закрытие файла вручную (по кнопке) и программа прекрасно работала. Я отправлял посылку с терминала и через секунду другую жал на кнопку на плате чтобы принудительно закрыть файл. Все данные без проблем приходили на microSD и я читал их через адаптер на компе. 

Я решил сделать закрытие файла через таймер TIM1. Тупо настроен таймер на 5с (отдельно проверял работу таймера на светодиоде). И в середине посылки и в конце посылки внутри обработчика прерывания DMA таймер обнуляется и программа по моим расчетам должна ждать 5с после последней полупосылки и закрывать файл. Но получается ерунда. Передается только  одна первая половина буфера и файл закрывается. Я не могу понять почему так.

Спойлер
Код
// Настройка таймера
void TIM1_sets(void)
    {
	  RCC -> APB2ENR |= RCC_APB2ENR_TIM1EN;		
	  TIM1->SMCR &= ~ TIM_SMCR_SMS;			// биты SMS в 000
	  TIM1->PSC = 9999;							// биты предделителя (PSC + 1)
	  TIM1->ARR = 35999;						// биты счетчика (ARR + 1)
	  TIM1->DIER |= TIM_DIER_UIE;				

	  NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);		
	  NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0);	
    }

// Обработчик прерывания DMA
void DMA1_Stream1_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */
	if((DMA1->LISR&0x400)==0x400)
	  {
		res = f_write(&testFile, &transmit_SDIO[0], 32, &testBytes);
		clean_mass(&transmit_SDIO[0]);

		TIM1 -> CNT = 1;
		if(cnt1==0)
			TIM1 -> CR1 |= TIM_CR1_CEN;

		TIM1 -> CNT = 1;
		DMA1->LIFCR |= 0x400;
                cnt1++;
	  }
else if((DMA1->LISR&0x800)==0x800)
		  {
			 res = f_write(&testFile, &transmit_SDIO[32], 32, &testBytes);
			 clean_mass(&transmit_SDIO[32]);
			 TIM1->CNT = 1;
			 DMA1->LIFCR |= 0x800;
		  }
}

// Обработчик таймера 
void TIM1_UP_TIM10_IRQHandler(void)
{
  		if((TIM1->SR&0x1) == 0x1)			
	  {
	 	f_close(&testFile);
	 	TIM1->SR &= 0xFFFFFFFE;
	 	DMA1_Stream1->CR &= 0xFFFFFFFE;
	  }
}

// Функция очистки массива
void clean_mass(uint8_t *mass)
  {
	int i=0;
	for(i=0; i<32; i++)
		mass[i]=0;
  }
ОтветитьЦитата
Размещено : 16.02.2025 19:30
(@eduard)
Level 5 Moderator

@jebo Если закрывать файл не по таймеру, а по прерыванию от DMA?

Принимается посылка с UART с помощью DMA. Значит количество байт известно заранее. Логичнее было бы закрывать файл после отработки DMA.

ОтветитьЦитата
Размещено : 16.02.2025 20:55
 Jebo
(@jebo)
Level 1

@eduard , я просто экспериментирую на UARTе. В перспективе я собираюсь писать данные с микрофона I2S. Количество байт заранее я не знаю.

ОтветитьЦитата
Размещено : 16.02.2025 20:58
Aveal
(@aveal)
Top level Admin

Запись от: @aleksej-6

Когда совсем - совсем не работает, начинаешь читать "инструкции" )

Надо было выставить в настройках )

И в итоге все полностью заработало?)

 

ОтветитьЦитата
Создатель темы Размещено : 17.02.2025 10:35
(@aleksej-6)
Level 3

@aveal 

Как сказать.. Экран из программы могу окрасить любым цветом, правда с правой стороны экрана не понятные "артефакты" ) То значение (255) - это я так понял "прозрачность" выводимого слоя. Он был выключен, соответственно.

Но это ладно. 

Главный вопрос - как заполнить буфер в sdram (разные строки, буквы цифры..)  При использовании буфера в оперативной памяти контроллера, его можно было заполнить в несколько раз - одно записать, потом второе, третье. 

А при использования буфера в области sdram - он же автоматом сам переписывается в буфер ltds (как я понимаю).

Соответственно буфер (sdram) переписывается когда я его ещё не заполнил полностью.. Этот вопрос меня пока что в тупик поставил..  

ОтветитьЦитата
Размещено : 17.02.2025 14:19
(@aleksej-6)
Level 3

Заработало ! Надо было разобраться с частотами тактирования ltds и задержками на сам дисплей (марка не известна, но поставлялся с демо прошивкой, то есть заставку выводил).

Быстродействие конечно, как реакция у "шахматиста" .. Надо будет попробовать сделать два видео буфера (в sdram) и не переписывать видео буфер из одного в другой по готовности (отрисовки). А подменять их адреса в ltds. Должно будет быстродействие увеличиться. Надеюсь, потому что сейчас отрисовка одного кадра секунды 1,5. 

Для больших дисплеев конечно надо связку микроконтроллер (для расчётов) и одноплатник (для дисплея.)  

ОтветитьЦитата
Размещено : 19.02.2025 14:45
Aveal
(@aveal)
Top level Admin

Ну да, быстродействие узкое место... Но тем не менее заработало 👍 

ОтветитьЦитата
Создатель темы Размещено : 20.02.2025 17:45
Страница 19 / 19
Поделиться: