Skocz do zawartości

DUAL-CORE STM32H747i-DISCO LCD, testy, rejestry itd


Pomocna odpowiedź

Dzisiejszy zestaw to DUAL-CORE STM32H747I-DISCO

 

1363146262_STM32H747i-DISCOTOP1.thumb.jpg.c0192845892528bed899e5e35102728d.jpg

1928777397_STM32H747i-DISCOBOT2.thumb.jpg.23edc9f6c73524d9e6d5b8526e891f47.jpg

 

Wg dokumentacji:

Dual 32-bit Arm® Cortex®-M7 up to 480MHz and -M4 MCUs, up to
2MB flash, 1MB RAM, 46 com. and analog interfaces, SMPS, DSI

 

Z UM2411 Discovery kit with STM32H747XI MCU

The STM32H747I-DISCO Discovery kit is a complete demonstration and

development platform for the STMicroelectronics Arm® Cortex®-M7 and -M4 dual-core-based
 

Drugi rdzeń to CM4, który można taktować do 240MHz.

 

Ten zestaw przeleżał u mnie ze 3 lata, ponieważ bałem się że DUAL-COR'a nie będę w stanie uruchomić.

Przy okazji nadmieniam, że żaden tutaj z moich postów czy tematów nie jest wpisem sponsorowanym.
Zestawy kupuję i testuję bez żadnych dotacji, czy sponsoringu. Robię to według własnego uznania.

Na początek - użyłem firmowego exampla "DMA2D_BlendingWithAlphaInversion", ponieważ przykład "BSP" nie chciał się skompilować.
Zastosowany przykład skompilował się bez żadnych problemów. Jako hint mogę powiedzieć, że uruchamiając program na dwurdzeniowcu, drugi rdzeń można najczęściej zignorować, czy zadać mu wieczną pętlę...

Według komentarzy magistrale APB działają na 100MHz, co czyni podejrzenie że TIM2 będzie pracował na 200MHz
 

/**
 * @brief  System Clock Configuration
 *         The system Clock is configured as follow :
 *            System Clock source            = PLL (HSE)
 *            SYSCLK(Hz)                     = 400000000 (CM7 CPU Clock)
 *            HCLK(Hz)                       = 200000000 (CM4 CPU, AXI and AHBs Clock)
 *            AHB Prescaler                  = 2
 *            D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
 *            D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
 *            D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
 *            D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
 *            HSE Frequency(Hz)              = 25000000
 *            PLL_M                          = 5
 *            PLL_N                          = 160
 *            PLL_P                          = 2
 *            PLL_Q                          = 4
 *            PLL_R                          = 2
 *            VDD(V)                         = 3.3
 *            Flash Latency(WS)              = 4
 * @param  None
 * @retval None
 */

 

Poniższy programik prawdę powiedział:

 

    UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);
    UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
    UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_BLUE);
    UTIL_LCD_SetFont(&Font24);

    uint32_t dana = 0;
    char desc[64];

    RCC->APB1LENR |= 1;
    __asm("dsb sy");
    TIM2->PSC = 0;
    TIM2->ARR = 0xffffffff;

    TIM2->CR1 = 0;
    TIM2->CNT = 0;

    TIM2->CR1 = 1;
    HAL_Delay(1000);
    TIM2->CR1 = 0;
    dana = TIM2->CNT;

    UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);
    sprintf(desc, "0x%08X", (unsigned int) dana);
    UTIL_LCD_DisplayStringAt(0, 60, (uint8_t *) desc, CENTER_MODE);


wynik:

0x0BED815C.thumb.jpg.ff25460648a0e37ba6a9b692859cda5b.jpg

Co potwierdza że TIM2 jest taktowany 200MHz

 

Drugi program pozwolił zmierzyć REFRESH RATE:

    RCC->APB1LENR |= 1;
    __asm("dsb sy");
    TIM2->PSC = 0;
    TIM2->ARR = 0xffffffff;
    __disable_irq();
    while((LTDC->CPSR & 0xffff) != 50){}
    TIM2->CR1 = 0;
    TIM2->CNT = 0;

    while((LTDC->CPSR & 0xffff) != 10){}
    TIM2->CR1 = 1; // run timer2  count
    while((LTDC->CPSR & 0xffff) == 10){}
    while((LTDC->CPSR & 0xffff) != 10){}

    TIM2->CR1 = 0;
    dana = TIM2->CNT;
    __enable_irq();

    UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);
    sprintf(desc, "0x%08X", (unsigned int) dana);
    UTIL_LCD_DisplayStringAt(0, 60, (uint8_t *) desc, CENTER_MODE);

 

"Długość" renderowania się klatki obrazu

0x0056E468.thumb.jpg.04efdc97390bbfa07d848b5d335c3377.jpg

 

i teraz: 200 000 000  / 0x0056E468 = 0x23 , co dziesiętnie daje 35

Czyli ekran jest odświeżany z częstotliwością ok. 35,1 [Hz]

 

Zestaw H747i-DISCO posiada 32MB SDRAM (8MB * 32bit)

1264785888_SDRAMIS42S32800.thumb.jpg.ad256c33f411498e533dc0f6cfa016df.jpg

Według UM2411:

1083173574_UM2411SDRAM.thumb.jpg.0a873f7ce2ae4943c4e39034e6df8b38.jpg

SDRAM jest mapowany w pierwszym banku dla SDRAM, co daje adres 0xC0000000 (według RM procesora):

1711389134_FMCmemorybanks.thumb.jpg.d0637dc07debf5d82ec64fa06935410c.jpg

 

Jednakże według danych z nagłówka:

SDRAM_HEADER_FILE.thumb.jpg.2e204d4ab9c7037127c733667817549d.jpg

 

Jest to niezgodne z podaną wartością, dlatego kolejny programik pozwolił ustalić faktyczny adres mapowania SDRAM:

    uint32_t dana = 0;
    char desc[64];

    dana = LTDC_Layer1->CFBAR;

    UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);
    sprintf(desc, "0x%08X", (unsigned int) dana);
    UTIL_LCD_DisplayStringAt(0, 60, (uint8_t *) desc, CENTER_MODE);

 ... co potwierdziło że SDRAM jest mapowany pod 0xD0000000

0xD0000000.thumb.jpg.83666756fcbf86c46632045f11c732c6.jpg

 

Jeżeli Początek SDRAM jest pod 0xD0000000 i jest to początek pierwszego framebuffora, to jego długość dla trybu ARGB8888 będzie równa 800*480*4, co da 0x177000.

Czyli drugi bufor można umieścić pod 0xD0000000 + 0x00177000 = 0xD0177000

 

Krótki programik wypełniający oba bufory kolorem czarnym:

#define FRAME_ADDRESS   0xD0000000
#define FRAME_ADDRESS_2 0xD0177000

	uint32_t* pFBaddr = (uint32_t *) FRAME_ADDRESS;
	//---
	for(uint32_t i=0; i< (800*480); i++){
		pFBaddr[i] = UTIL_LCD_COLOR_BLACK;
	}

	pFBaddr = (uint32_t *) FRAME_ADDRESS_2;

	for(uint32_t i=0; i< (800*480); i++){
		pFBaddr[i] = UTIL_LCD_COLOR_BLACK;
	}

 

Tradycyjnie w rozpracowanym zestawie osadzone vectordoty:

 

 

 

 

 

  • 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.