Здравствуйте !
Решил разобраться с 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.
Для больших дисплеев конечно надо связку микроконтроллер (для расчётов) и одноплатник (для дисплея.)
Ну да, быстродействие узкое место... Но тем не менее заработало 👍


