[ST_MICRO]/STM32F43x2015.03.14 22:00

STM32F439 EVM - SD카드를 이용한 BMP파일 출력 테스트

 STM32F439 EVM - SD카드를 이용한 BMP파일 출력 테스트



STM32F439 EVM 보드 에는 SDIO방식의 SD Card 연결할 수 있는 SD 소켓이 할당되어 있고 이를 이용하여 SD Card의 BMP파일을 TFT LCD에 출력하는 테스트를 진행해 보았다.




STM32F439 7" TFT-LCD 출력 테스트 동영상




STM32F439 SDIO 초기화 코드
uint8_t BSP_SD_Init(void)
  uint8_t SD_state = MSD_OK;
  
  /* uSD device interface configuration */
  uSdHandle.Instance = SDIO;

  uSdHandle.Init.ClockEdge           = SDIO_CLOCK_EDGE_RISING;
  uSdHandle.Init.ClockBypass         = SDIO_CLOCK_BYPASS_DISABLE;
  uSdHandle.Init.ClockPowerSave      = SDIO_CLOCK_POWER_SAVE_DISABLE;
  uSdHandle.Init.BusWide             = SDIO_BUS_WIDE_1B;
  uSdHandle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  uSdHandle.Init.ClockDiv            = SDIO_TRANSFER_CLK_DIV;
  
  /* Configure IO functionalities for SD detect pin */
  //BSP_IO_Init(); 
  
  /* Check if the SD card is plugged in the slot */
  if(BSP_SD_IsDetected() != SD_PRESENT)
  {
    return MSD_ERROR;
  }
  
  /* HAL SD initialization */
  SD_MspInit();
  if(HAL_SD_Init(&uSdHandle, &uSdCardInfo) != SD_OK)
  {
    SD_state = MSD_ERROR;
  }
  
  /* Configure SD Bus width */
  if(SD_state == MSD_OK)
  {
    /* Enable wide operation */
    if(HAL_SD_WideBusOperation_Config(&uSdHandle, SDIO_BUS_WIDE_4B) != SD_OK)
    {
      SD_state = MSD_ERROR;
    }
    else
    {
      SD_state = MSD_OK;
    }
  }
  
  return  SD_state;
}



STM32F439 SD Card를 이용한 BMP파일 출력 테스트 예제코드
    //SD 카드 초기화
    if(FATFS_LinkDriver(&SD_Driver, SDPath) == 0)
    {
        if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) != FR_OK)
        {
            Led2On();
            Error_Handler();

            while(1);
        }
        else
        {
            //파일 리스트 출력
            //res = print_files("");
            Led1On();
            
            
            //------------------------------------------------------------------
            //BMP파일 출력테스트
            InitBmpFileRead();
            
            //BMP파일 읽어와서
            if(OpenReadBmpFile(ImageBuffer, (const char*)"1_3.bmp"))
            {
                BSP_LCD_SelectLayer(1);
                
                //출력
                BSP_LCD_DrawBitmap(0, 0, ImageBuffer);  
                BSP_LCD_SetTransparency(1, 255);            
            }
            //------------------------------------------------------------------
}
}




STM32F439 BMP 이미지 7" TFT-LCD에 출력 결과









Posted by nexp
[ST_MICRO]/STM32F43x2015.03.01 23:30

STM32F439 LCD EVM - TFT LCD Test

STM32F439 LCD EVM - TFT LCD Test





STM32F429, STM32F439의 가장 큰 장점으로 TFT-LCD 컨트롤러가 내장되어 있어 1024x768 해상도의 TFT-LCD를 별도의 제어기 없이 연결할 수 있다. 물론 큰 LCD를 연결하려면 메모리 때문에 SDRAM을 연결해야 하는 부담이 있다.
여기서 조금 아쉬운점이 있는데 LCD메모리도 포함 시켜서 만들면 훨신더 경쟁력이 있지 않았을까? (adStar의 경우 TFT-LCD 컨트롤러 및 SDRAM이 한칩에 있어 가격이나 사이즈면에서 상당히 편리하다.)

24-bit RGB Parallel Pixel Output; 8 bits-per-pixel (RGB888)
- 2 display layers with dedicated FIFO (64x32-bit)
- Color Look-Up Table (CLUT) up to 256 color (256x24-bit) per layer
- Supports up to XGA (1024x768) resolution
- Programmable timings for different display panels
- Programmable Background color
- Programmable polarity for HSync, VSync and Data Enable
- Up to 8 Input color formats selectable per layer
- ARGB8888, RGB888, RGB565, ARGB1555, ARGB4444,
- L8 (8-bit Luminance or CLUT), AL44 (4-bit alpha + 4-bit luminance), AL88 (8-bit alpha + 8-bit luminance)




STM32F4 LTDC 핀맵







STM32F439  TFT-LCD 초기화 코드

uint8_t BSP_LCD_Init(void)

    /* LTDC Configuration ----------------------------------------------------*/

    LtdcHandler.Instance = LTDC;

    

    /* Configure horizontal synchronization width */

    LtdcHandler.Init.HorizontalSync = HSYNC;

    /* Configure vertical synchronization height */

    LtdcHandler.Init.VerticalSync = VSYNC;

    /* Configure accumulated horizontal back porch */

    LtdcHandler.Init.AccumulatedHBP = HBP;

    /* Configure accumulated vertical back porch */

    LtdcHandler.Init.AccumulatedVBP = VBP;

    /* Configure accumulated active width */

    LtdcHandler.Init.AccumulatedActiveW = ACTIVE_W-2;

    /* Configure accumulated active height */

    LtdcHandler.Init.AccumulatedActiveH = ACTIVE_H;

    /* Configure total width */

    LtdcHandler.Init.TotalWidth = TOTAL_WIDTH;

    /* Configure total height */

    LtdcHandler.Init.TotalHeigh = TOTAL_HEIGHT;


    

    /* Configure R,G,B component values for LCD background color */

    LtdcHandler.Init.Backcolor.Red= 0;

    LtdcHandler.Init.Backcolor.Blue= 0;

    LtdcHandler.Init.Backcolor.Green= 0;

    

    /* LCD clock configuration */

    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;

    PeriphClkInitStruct.PLLSAI.PLLSAIN = _PLLSAIN_CLK;

    PeriphClkInitStruct.PLLSAI.PLLSAIR = PLLSAIR_DIV;

    PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;

    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); 

    

    /* Polarity */

    LtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL;

    LtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL;

    LtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL;

    LtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;

    

    MspInit();

    HAL_LTDC_Init(&LtdcHandler); 

    


    /* Initialize the SDRAM */

    BSP_SDRAM_Init();


    /* Initialize the font */

    BSP_LCD_SetFont(&LCD_DEFAULT_FONT);


return LCD_OK;

}  






STM32F439 EVM TFT-LCD커넥터 핀맵






기존 7" TFT-LCD 모듈 커넥터 연결하여 다양한 LCD 테스트 가능하다.










STM32F439 TFT LCD 제어 예제

아래는 간단히 LCD 초기화 하고 LCD에 Text 표시하는 예제이다.


#if _USE_TFTLCD_
    LCD_BackLightInit();  
    
    //LCD초기화
    BSP_LCD_Init();

    /* Layer2 Init */
    BSP_LCD_LayerDefaultInit(1, LCD_FRAME_BUFFER_LAYER1);
    /* Set Foreground Layer */
    BSP_LCD_SelectLayer(1);
    /* Clear the LCD */
    BSP_LCD_Clear(LCD_COLOR_GREEN);  
    BSP_LCD_SetColorKeying(1, LCD_COLOR_RED);
    BSP_LCD_SetLayerVisible(1, DISABLE);

    /* Layer1 Init */
    BSP_LCD_LayerDefaultInit(0, LCD_FRAME_BUFFER_LAYER0);

    // Set Foreground Layer
    BSP_LCD_SelectLayer(0);

    // Enable The LCD 
    BSP_LCD_DisplayOn();

    // Clear the LCD 
    BSP_LCD_Clear(LCD_COLOR_BLUE);
    
    BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
    BSP_LCD_SetTextColor(LCD_COLOR_WHITE);


    BSP_LCD_DrawRect(0,0, LCD_WIDTH-1, LCD_HEIGHT-1);
    BSP_LCD_DisplayStringAtLine(0, "STM32F429- EtherCat Test");
#endif


코드 다운로드 하고 테스트 해보면 아래와 같이 TFT-LCD에 출력 되는것을 확인 할수 있다. STM32F439에서 TFT-LCD출력을 위한 기본 셋팅은 구성되었으므로 앞으로 여러가지 테스트 예제를 작성해 가면서 테스트 해보자.





STM32F439 TFT LCD 제어 테스트 예제 동영상

SD Card에 있는 BMP파일을읽어 TFT LCD에 출력하는 동영상









Posted by nexp
[ST_MICRO]/STM32F43x2015.03.01 18:30

STM32F439 EVM 테스트 보드 제작

STM32F439 EVM 테스트 보드 제작




STM32F439 시리즈중 100이상 모델은 TFT-LCD 컨트롤러를 내장하고 있어 LCD출력할 프로젝트라면 사용하기 좋은 MCU이다. 

TFT LCD 및 SDRAM, HDMI, 이더넷, USB등을 테스트 할 수 있는 176핀의 STM32F439IGT6 테스트 보드를 제작해 보았다.

기본적으로 기존에 제작한 핀맵을 기준으로 연결할 수 있도록 하고 나머지 핀들은 확장해서 테스트 할수 있도록 했다.



이 보드의 주요 기능은 7" TFT-LCD 모듈을 연결하여 여러가지 기능을 테스트 할수 있는 모듈이다.


기존 SRAM 방식의 TFT-LCD 모듈을 연결하여 테스트 가능하다.





기존 7" TFT-LCD 모듈 테스트 커넥터




7" TFT-LCD 테스트 커넥터




HDMI 출력 모듈 테스트 커넥터




Posted by nexp
[TI]/TM4C2014.07.27 21:00

TM4C123 EVM - TFT-LCD 테스트

TM4C123 EVM - TFT-LCD 테스트 



TM4C123 보드를 이용하여 TFT-LCD를 적은 핀수로 테스트 할 수 있는 [LCD-CONV] 보드의 TFT-LCD 테스트를 진행 했다. TFT-LCD출력 속도는 18ms로 빠른데 SD Card 읽어들이는 속도가 상대적으로 느려 고속출력은 무리가 있어 보인다.


TI 제공 ROM 함수 사용시

320x240 한프레임 출력 시간이 100ms 정도 출력된다.

상당히 느리다..

#define _LCD_DAT_OUT(Data) ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data>>8);\

                                        LCD_DATA_LATCH();\

                                                                ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data&0xFF)




레지스터 직접 제어시

18ms 로 상당히 빨라졌다.

#define _LCD_DAT_OUT(Data) PORTC = (Data>>8);\

                                              LCD_DATA_LATCH();\

                                                                PORTC = Data




TM4C123 TFT-LCD 테스트 동영상







TM4C123 TFT-LCD 드라이버 코드

//-----------------------------------------------------------------------------

// TFT LCD Driver

#define TFT_DRV_HD66791 0

#define TFT_DRV_COM44 1


                                        

#define LCD_LAT_BIT BIT6

#define LCD_LAT_PORT GPIO2

#define LCD_LAT_ON() PD6 = BIT6;

#define LCD_LAT_OFF() PD6 = 0;

#define LCD_DATA_LATCH() LCD_LAT_ON();LCD_LAT_OFF();


#define LCD_RST_BIT BIT6

#define LCD_RST_PORT GPIOA

#define LCD_RST_ON()

#define LCD_RST_OFF()


#define LCD_WR_BIT BIT0

#define LCD_WR_PORT GPIO2

#define LCD_WR_OFF() (PD0 = 0);

#define LCD_WR_ON() (PD0 = BIT0);


#define LCD_RS_BIT BIT1

#define LCD_RS_PORT GPIO2

#define LCD_RS_OFF() (PD1 = 0);

#define LCD_RS_ON() (PD1 = BIT1);


#define LCD_EN_BIT BIT2

#define LCD_EN_PORT GPIO2

#define LCD_ENABLE() (PD2 = 0);

#define LCD_DISABLE() (PD2 = BIT2);


#define LCD_BL_BIT BIT3

#define LCD_BL_PORT GPIO2

#define LCD_BL_OFF() (PD3 = 0);

#define LCD_BL_ON() (PD3 = BIT3);


/*                                        

#define _LCD_DAT_OUT(Data) ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data>>8);\

                                        LCD_DATA_LATCH();\

                                        ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data&0xFF)

*/


#define _LCD_DAT_OUT(Data) PORTC = (Data>>8);\

                                        LCD_DATA_LATCH();\

                                        PORTC = Data


#define TFTGpioInit() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, 0xFF);\

                                        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, 0xFF); 

//-----------------------------------------------------------------------------




TM4C123 SD Card 드라이버 코드

//-----------------------------------------------------------------------------

// SD Card HAL

#define _DEBUG_FAT_FILE                 1


#define MMC_CS_PORT GPIOA

#define MMC_CS_BIT     BIT3


#define MMC_CS_INIT() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, MMC_CS_BIT);


#define MMC_CS_HIGH() PA3 = BIT3

#define MMC_CS_LOW() PA3 = 0;


#define MMC_SpiInit() SPI0_Init()

#define MMC_SendByte SPI0_WriteReadByte

#define MMC_Send(Data) SPI0_WriteReadByte(Data)

#define MMC_Recv() SPI0_WriteReadByte(0xFF)

#define MMC_SPISpeed SPI0_SetSpeed


#define SPI_Mode3() 


#define FAT_MAX_NUM_FILE          50


#define FCLK_SLOW()                     MMC_SPISpeed(SPI_SPEED_1MHZ)

#define FCLK_FAST()                    MMC_SPISpeed(SPI_SPEED_10MHZ) 

//-----------------------------------------------------------------------------




Posted by nexp
[DSP]/DSP283462014.01.12 20:21

[TMS320C28346] 7" TFT LCD 테스트

[TMS320C28346] 7" TFT LCD 테스트



SSD1963 을 이용하여 TMS320C28346 보드에서 7" TFT LCD를 테스트 했다.


TFT LCD의 CS는 TMS320C28346의 ZONE7에 할당된 CS7을 이용하였고 RS는 A0로 할당해서 코드 수정했다.
#pragma DATA_SECTION(gExinf1Buff,"ZONE7DATA");

#define _LCD_CMD_OUT(Data) gExinf1Buff[0] = Data
#define _LCD_DAT_OUT(Data) gExinf1Buff[1] = Data


#if _USE_EXINF
//Write Command 
void Lcd_Cmd(unsigned short Data)
{
_LCD_CMD_OUT(Data);
}

void Lcd_Data(unsigned short Data)
{
_LCD_DAT_OUT(Data);
}



기존 코드 수정하고 동작하니 색깔을 나오는데... 화면에 1/3만 출력된다.
 
DSP 컴파일러에 문제가 있는것 같다.
처음에 unsigned int로 할당에서 문제가 되었는데 (800x480 이면 unsigned long), long 형으로 바꾸어도 문제가 되었다.
 
#define LCD_SIZE_MAX     384000//(800*480)
 
define 문으로 할당하지 않고 상수로 하니 정상 동작 한다.
이게 무슨 황당한 일인가? (옵션에 문제가 있나?)
-> CCS 5.x 에서 테스트 하니 정상 동작한다.
 
//Full Color Display Data
void Disp_Full_Color(unsigned int Color)
{
 unsigned long i;//size;
 lcd70_set_area(0,0,799,479);
 Lcd_Cmd(0x2C);
 
 //for(i=0;i<LCD_SIZE_MAX;i++)
 for(i=0;i<384000;i++)
 {
  Lcd_Data(Color);
 }
}
 

800x480 한 화면에 출력하는데 걸리는 시간은 25ms 정도 걸린다. (참고로 TSM320F28335 에서는 45ms 정도 걸린다.)


TMS320C28346 을이용한 7" TFT LCD 테스트 결과


TFT-LCD 테스트 동영상


Posted by nexp