*TouchGFX SPI LCD 사용시 반만 Display 되는 경우 *

 

TouchGFX 사용시 Serial 방식을 사용할 경우 FrameBuffer 를 한줄씩 보내는 코드입니다.

 

void TouchGFXHAL::copyFrameBufferBlockToLCD(const Rect& rect)
{
    __IO uint16_t* ptr;
    uint32_t height;

    // This can be accelerated using regular DMA hardware
    for (height = 0; height < rect.height ; height++)
    {
        ptr = getClientFrameBuffer() + rect.x + (height + rect.y)  * BSP_LCD_GetXSize();
        LCD_IO_WriteMultipleData((uint16_t*)ptr, rect.width);
    }
}

 

 

 

TouchGFX 의 공식 Support 홈페이지에 있는 코드인데 32bit 임베디드 시스템을 사용할 경우 생각대로 동작 안할 수 있습니다.

support.touchgfx.com/docs/development/touchgfx-hal-development/scenarios/scenarios-fmc

예를 들면,

 

 

 

#define FRAME_BUF_ADDR   0xD0000000
#define WIDTH            320
#define COLOR_DEPTH      3

__IO uint16_t* ptr;
ptr = FRAME_BUF_ADDR;
ptr = ptr + (WIDTH * COLOR_DEPTH);

 

 

0xD0000000 + (320 * 3) = 0xD00003C0 을 예상합니다.

하지만, 0xD00000780 이 나옵니다.

 

 

 

바로 __IO uint16_t* ptr; 때문입니다. 
아래와 같이 __IO uint8_t * ptr 로 수정해 줍니다. 

 

 

void TouchGFXHAL::copyFrameBufferBlockToLCD(const Rect& rect)
{
    __IO uint8_t* ptr;
    uint32_t height;

    // This can be accelerated using regular DMA hardware
    for (height = 0; height < rect.height ; height++)
    {
        ptr = getClientFrameBuffer() + rect.x + (height + rect.y)  * BSP_LCD_GetXSize();
        LCD_IO_WriteMultipleData((uint8_t*)ptr, rect.width);
    }
}

 

 

0xD0000000 + (320 * 3) = 0xD00003C0 이 나옵니다.

+ Recent posts