virtualny Napisano 1 marca Udostępnij Napisano 1 marca Witam, Po bojach z H750, dzisiaj krótki raport z uruchomienia wyświetlacza LCD STM32F469-DISCO. Zestaw wygląda tak: Przyznam szczerze że kiedyś ten zestaw nie dawał się uruchomić z CubeIDE, ponieważ nie odczytałem tego co należy I nie zastosowałem tego w deklaracjach jak dzisiaj: Na szybko z danych technicznych: 1. Ekran jest w rezolucji 800x480, co daje 800x480x4 = 1500 [kB] (niemal półtora megabajta) na jedną ramkę framebuffor'a w trybie ARGB8888. 2. SDRAMU jest 16MB (4M x 32 bit) i jest mapowany pod 0xC0000000, adres drugiego bufora wybierany w programie 0xc0180000 Jak wspomniałem kiedyś nie mogłem tak łatwo uruchomić tego zestawu i wspomagałem się że tak to nazwę frameworkiem do LTDC skompilowanym na platformie mbed, której sterowniki same dostrajały się do wersji devboarda. Warto zauważyć, że LCD różni się dość znacznie od zastosowanego w zestawie H750 - zamiast 480x272 mamy 800x480. To daje wielkość ramki zamiast 0.5MB, 1.5MB. Pomimo 3 krotnie większego zapotrzebowania na RAM, istotną sprawą jest, że częstotliwość odświeżania w zestawie 469i wynosi zamiast 60 [Hz], 30 [Hz]. Nie oceniam tego, czy to dobrze, czy źle, tylko podaję informację. Prosty program bazujący jak poprzednio na przykładzie z pakietu firmware od STM (LCD PAINT) inicjuje LCD, oraz jak poprzednio: 1. Czyści bufory ramki (razem 3MB) #define FRAME_ADDRESS 0xC0180000 uint32_t* pFBaddr ; pFBaddr = (uint32_t *) LCD_FB_START_ADDRESS; // 0xC00000000 for(uint32_t i=0; i< (1500*1024/4); i++){ pFBaddr[i] = LCD_COLOR_BLACK; // fill SDRAM layer buffor at 0xC0000000 as black color } pFBaddr = (uint32_t *) FRAME_ADDRESS; // 0xC0180000 => 2nd frame buffor for(uint32_t i=0; i< (1500/2*1024/4); i++){ pFBaddr[i] = LCD_COLOR_RED; // fill SDRAM layer buffors as red color (half of frame) } for(uint32_t i=(1500/2*1024/4); i< (1536*1024/4); i++){ pFBaddr[i] = LCD_COLOR_BLUE; // fill SDRAM layer buffors as blue color (2nd half of frame) } 2. Ustala adres framebufora na 0xc0180000 korzystając z poprzednio zdobytego doświadczenia: LTDC_Layer1->CFBAR = FRAME_ADDRESS ; // set frame buffor address to 0xC0180000 LTDC->SRCR = LTDC_SRCR_VBR; // or LTDC_SRCR_IMR for immediatelly change Efekt działania programu wygląda tak: Funkcja main: /** * @brief Main program * @param None * @retval None */ int main(void) { uint8_t sdram_status = SDRAM_OK; uint8_t lcd_status = LCD_OK; /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED1 and LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED3); /*##-1- Initialize the SDRAM */ sdram_status = BSP_SDRAM_Init(); if(sdram_status != SDRAM_OK) { Error_Handler(); } /*##-2- LCD Initialization #################################################*/ /* Initialize the LCD DSI */ lcd_status = BSP_LCD_Init() ; if(lcd_status != LCD_OK) { Error_Handler(); } lcd_status = BSP_LCD_InitEx(LCD_ORIENTATION_LANDSCAPE); if(lcd_status != LCD_OK) { Error_Handler(); } BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER_BACKGROUND, LCD_FB_START_ADDRESS); #define FRAME_ADDRESS 0xC0180000 uint32_t* pFBaddr ; pFBaddr = (uint32_t *) LCD_FB_START_ADDRESS; // 0xC00000000 for(uint32_t i=0; i< (1500*1024/4); i++){ pFBaddr[i] = LCD_COLOR_BLACK; // fill SDRAM layer buffor at 0xC0000000 as black color } pFBaddr = (uint32_t *) FRAME_ADDRESS; // 0xC0180000 => 2nd frame buffor for(uint32_t i=0; i< (1500/2*1024/4); i++){ pFBaddr[i] = LCD_COLOR_RED; // fill SDRAM layer buffors as red color (half of frame) } for(uint32_t i=(1500/2*1024/4); i< (1536*1024/4); i++){ pFBaddr[i] = LCD_COLOR_BLUE; // fill SDRAM layer buffors as blue color (2nd half of frame) } LTDC_Layer1->CFBAR = FRAME_ADDRESS ; // set frame buffor address to 0xC0180000 LTDC->SRCR = LTDC_SRCR_VBR; // or LTDC_SRCR_IMR for immediatelly change /* Infinite loop */ while (1) { } } Cały projekt na github: https://github.com/wegi1/STM32H469I-DISCO.git Dawniej uruchomiony program z dotami (zestaw po lewej, to F469i): 2 Link do komentarza Share on other sites More sharing options...
virtualny 1 marca Autor tematu Udostępnij 1 marca Kilka dodatkowych szczegółów: Ten procesor ma aż 2MB internal flasha i nie ma tu wielkiego ciśnienia, żeby programy wrzucać do QSPI, ale oczywiście jest to możliwe... Flash QSPI jest mapowany w obszarze 0x90000000 - 0x90FFFFFF SDRAM jest mapowany w obszarze 0xC0000000 - 0xC0FFFFFF W załączeniu zdjęcia plus opis na warstwie dolnej (wczoraj wieczorem nie można było sfotografować w lepszej jakości). 1. Widok z góry - strasznie ciężko nad takim ekranem jest złapać focus. 2. Widok od dołu. 3. Prawa strona od góry. 4. Lewa strona od góry. 5. Układ od panelu dotykowego ujęcie 1. 6. Układ od panelu pojemnościowego drugie ujęcie. 7. Widok z dołu z dodanym opisem elementów. 1 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »