*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 이 나옵니다.