Здравствуйте !
Решил разобраться с 7" дисплеем и платой с stm32hiit6 и sdram W9825G6KH
Дисплей светиться выбранным цветом (при выборе в настройках LTDS). SDRAM тоже (вроде) работает.
Как заставить дисплей светиться нужным цветом из программы (main) не понимаю.. Где то неверно установлены настройки, а где не пойму ?
https://cloud.mail.ru/public/eAUY/oTbF777xh
Хотя именно запись и чтение в SDRAM и не работает похоже.. Нет буфера и нет ничего далее.
Точнее, запись и сравнение в sdram делаю - значения (записанное и прочитанное) сходятся.
А почему не получается на экран вывести не понимаю.. чего то не то делаю
Да, цвет заливки экрана меняется.
Тот же эффект, если в программе такую строку написать LTDC->BCCR = 0x00FF;
Напутал в элементарном:
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);
Доброго времени суток.
Не могу понять почему не работает моя программа. Смысл простой. Сначала я открываю файл и жду данных из 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;
  }
@jebo Если закрывать файл не по таймеру, а по прерыванию от DMA?
Принимается посылка с UART с помощью DMA. Значит количество байт известно заранее. Логичнее было бы закрывать файл после отработки DMA.
@eduard , я просто экспериментирую на UARTе. В перспективе я собираюсь писать данные с микрофона I2S. Количество байт заранее я не знаю.
Когда совсем - совсем не работает, начинаешь читать "инструкции" )
Надо было выставить в настройках )
И в итоге все полностью заработало?)
Как сказать.. Экран из программы могу окрасить любым цветом, правда с правой стороны экрана не понятные "артефакты" ) То значение (255) - это я так понял "прозрачность" выводимого слоя. Он был выключен, соответственно.
Но это ладно.
Главный вопрос - как заполнить буфер в sdram (разные строки, буквы цифры..) При использовании буфера в оперативной памяти контроллера, его можно было заполнить в несколько раз - одно записать, потом второе, третье.
А при использования буфера в области sdram - он же автоматом сам переписывается в буфер ltds (как я понимаю).
Соответственно буфер (sdram) переписывается когда я его ещё не заполнил полностью.. Этот вопрос меня пока что в тупик поставил..
Заработало ! Надо было разобраться с частотами тактирования ltds и задержками на сам дисплей (марка не известна, но поставлялся с демо прошивкой, то есть заставку выводил).
Быстродействие конечно, как реакция у "шахматиста" .. Надо будет попробовать сделать два видео буфера (в sdram) и не переписывать видео буфер из одного в другой по готовности (отрисовки). А подменять их адреса в ltds. Должно будет быстродействие увеличиться. Надеюсь, потому что сейчас отрисовка одного кадра секунды 1,5.
Для больших дисплеев конечно надо связку микроконтроллер (для расчётов) и одноплатник (для дисплея.)
Ну да, быстродействие узкое место... Но тем не менее заработало 👍
 
				 
				 
				 
				 
				 
				 
			


