Skocz do zawartości

STM32F469I-DISCOVERY uruchomienie LCD 800x480


virtualny

Pomocna odpowiedź

Witam,

Po bojach z H750, dzisiaj krótki raport z uruchomienia wyświetlacza LCD STM32F469-DISCO.

Zestaw wygląda tak:

DISCOF469-BOTTOM.thumb.jpg.e18b374dfe5ac4b0dab9c7892aaa2d87.jpg

Przyznam szczerze że kiedyś ten zestaw nie dawał się uruchomić z CubeIDE, ponieważ nie odczytałem tego co należy

BOARD_REV.thumb.jpg.a99ab6b6eeee6d27a59de26566cb770b.jpg

I nie zastosowałem tego w deklaracjach jak dzisiaj:

STMPROJECT.thumb.jpg.5daf9a9ff1c7bffcec3f63ce8f055810.jpg

 

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:

red-blue.thumb.jpg.252336c7a8cb5d1a35a2b1d50bab5528.jpg

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):

 

 

  • Lubię! 2
Link do komentarza
Share on other sites

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.

01_F469_TOP.thumb.jpg.539ec22dc853073bb9abdae79b59113f.jpg

 

2. Widok od dołu.

02_STM32F469i-DK_BOTTOM_LAYER.thumb.jpg.a70b359102975c057a1c3c4230168e16.jpg

 

3. Prawa strona od góry.

03_F469_T01.thumb.jpg.da6bbf100a4c67d6103697a1a734e18c.jpg

 

4. Lewa strona od góry.

04_F469_T02.thumb.jpg.45c4460ed9621f1ec3b8f35bd82cc1a9.jpg

 

5. Układ od panelu dotykowego ujęcie 1.

05_F469_TS_CHIP_01.thumb.jpg.71f3acfabf8980f31eac712792db1bf5.jpg

 

6. Układ od panelu pojemnościowego drugie ujęcie.

06_F469_TS_CHIP_02.thumb.jpg.75602f4052b829086cc32071f6d921eb.jpg

 

7. Widok z dołu z dodanym opisem elementów.

07_STM32F469i-DK_HW_LAYOUT.thumb.jpg.7181c4976ef5880d036e28eb475c3391.jpg

 

 

 

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.