Здравствуйте !
Решил разобраться с 7" дисплеем и платой с stm32hiit6 и sdram W9825G6KH
Дисплей светиться выбранным цветом (при выборе в настройках LTDS). SDRAM тоже (вроде) работает.
Как заставить дисплей светиться нужным цветом из программы (main) не понимаю.. Где то неверно установлены настройки, а где не пойму ?
Хотя именно запись и чтение в SDRAM и не работает похоже.. Нет буфера и нет ничего далее.
Точнее, запись и сравнение в sdram делаю - значения (записанное и прочитанное) сходятся.
А почему не получается на экран вывести не понимаю.. чего то не то делаю
@aleksej-6 Доброго времени суток! Если тут менять, то цвет меняется?
Да, цвет заливки экрана меняется.
Тот же эффект, если в программе такую строку написать 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.
Для больших дисплеев конечно надо связку микроконтроллер (для расчётов) и одноплатник (для дисплея.)
Ну да, быстродействие узкое место... Но тем не менее заработало 👍