본문 바로가기

[ST_MICRO]/STM32F43x

STM32F439 EVM - FMC SRAM 방식의 FTF LCD 제어 테스트

STM32F439 EVM - FMC SRAM 방식의 FTF LCD 제어 테스트








STM32F4는 FSMC(Flexible static memory controller)를 지원하는데 STMF439에서는 SDRAM을 지원하기 위해 FMC (Flexible memory controller )로 변경되었다. 

기존 프로그램에서 FMC를 이용하여 메모리 방식으로 LCD제어 하기 위해서는 코드 수정이 필요하다.



STM32F439 FMC 블록도

NOR,SRAM, SDRAM 을 지원한다.

- NOR/PSRAM memory controller

- NAND/PC Card memory controller

- Synchronous DRAM (SDRAM/Mobile LPSDR SDRAM) controller










[STM32F439 EV] 보드에서는 메모리 방식의 TFT-LCD는 CN26을 통해 연결되어 있고 PG9->FMC_NE2/FMC_NCE3 에 CS를 할당하였다.


FMC 어드레스 할당 핀맵

(BANK1)CS1 -> PD7    : ((uint32_t)0x60000000) 

(BANK2)CS2 -> PG9    : ((uint32_t)0x64000000) 

(BANK3)CS3 -> PG10   : ((uint32_t)0x68000000)

(BANK4)CS4 -> PG12   : ((uint32_t)0x6C000000)








STM32F439 TFT LCD FMC초기화 코드


void InitFMC_TftLcd(void)

{

  GPIO_InitTypeDef GPIO_Init_Structure;

 

  dio_fmc.Instance  = FMC_NORSRAM_DEVICE;

  dio_fmc.Extended  = FMC_NORSRAM_EXTENDED_DEVICE;

  

 

  SRAM_Timing.AddressSetupTime       = 5;

  SRAM_Timing.AddressHoldTime        = 5;

  SRAM_Timing.DataSetupTime          = 5;

  SRAM_Timing.BusTurnAroundDuration  = 2;

  SRAM_Timing.CLKDivision            = 2;

  SRAM_Timing.DataLatency            = 2; 

 

  SRAM_Timing.AccessMode             = FMC_ACCESS_MODE_A;

  

//뱅크 선택 FMC_NORSRAM_BANK1~FMC_NORSRAM_BANK4

  dio_fmc.Init.NSBank             = FMC_NORSRAM_BANK2;

  dio_fmc.Init.DataAddressMux     = FMC_DATA_ADDRESS_MUX_DISABLE;//FMC_DATA_ADDRESS_MUX_ENABLE

  dio_fmc.Init.MemoryType         = FMC_MEMORY_TYPE_SRAM;

  dio_fmc.Init.MemoryDataWidth    = SRAM_MEMORY_WIDTH;

  dio_fmc.Init.BurstAccessMode    = FMC_BURST_ACCESS_MODE_DISABLE;

  dio_fmc.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;

  dio_fmc.Init.WrapMode           = FMC_WRAP_MODE_DISABLE;

  dio_fmc.Init.WaitSignalActive   = FMC_WAIT_TIMING_BEFORE_WS;

  dio_fmc.Init.WriteOperation     = FMC_WRITE_OPERATION_ENABLE;

  dio_fmc.Init.WaitSignal         = FMC_WAIT_SIGNAL_DISABLE;

  dio_fmc.Init.ExtendedMode       = FMC_EXTENDED_MODE_DISABLE;

  dio_fmc.Init.AsynchronousWait   = FMC_ASYNCHRONOUS_WAIT_DISABLE;

  dio_fmc.Init.WriteBurst         = FMC_WRITE_BURST_DISABLE;

  dio_fmc.Init.ContinuousClock    = SRAM_CONTINUOUS_CLOCK;

  

  /* Initialize the SRAM controller */

  if(HAL_SRAM_Init(&dio_fmc, &SRAM_Timing, &SRAM_Timing) != HAL_OK)

  {

    /* Initialization Error */

    Error_Handler(); 

  }

      

}




이미지 한장 출력하는데 10m가 소요되고 있다. (STM32F405 에서는 7ms 정도 소요 된다.)

왜 STM32F439가 더 느리지? STM32F4에서 TFT-LCD 테스트와 동일한 클럭 속도 인데...



가장 기본 적인 LCD출력으로 파형을 관찰 해 볼까?


       while(1)
       {
              Lcd_Cmd(0x0200);Lcd_Data(0x0000);        //Horizontal Address Set
              Lcd_Cmd(0x0201);Lcd_Data(0x0000);        //Vertical Address Set
              Delay(delay_time);

       }



300ns 보다 약간 시간이 더 걸린다.
특이한점은 CS한번에 WR신호가 4번 출력 된다.







STM32F439 FMC 이용 LCD출력 테스트 결과

반응형