项目场景:
CubeIDE+touchGFX+2inchLCD,显示特定界面。
使用前提:
- CubeIDE已正确配置2寸屏(在没有添加touchGFX时可以画线等)。
- 已正确安装TouchGFX Designer。
- SPI配置
- Timer配置
- TouchGFX配置
配置TouchGFX代码:
- 进入工程文件下的TouchGFX文件夹,使用TouchGFX Designer打开名为XXX.touchgfx的文件。
- 根据需要添加图片,点击生成代码。
配置程序:
- 使能定时器
HAL_TIM_Base_Start_IT(&htim6);
- 回调函数定时刷新
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint8_t p_Time6Cnt = 0;
if(htim->Instance == htim6.Instance){
p_Time6Cnt++;
if(!(p_Time6Cnt %4)){
touchGFX_signalVSyncTimer();
}
}
}
- 连接TouchGFX和LCD驱动
void TouchGFXHAL::flushFrameBuffer(const touchgfx::Rect& rect)
{
// Calling parent implementation of flushFrameBuffer(const touchgfx::Rect& rect).
//
// To overwrite the generated implementation, omit the call to the parent function
// and implement the needed functionality here.
// Please note, HAL::flushFrameBuffer(const touchgfx::Rect& rect) must
// be called to notify the touchgfx framework that flush has been performed.
// To calculate the start address of rect,
// use advanceFrameBufferToRect(uint8_t* fbPtr, const touchgfx::Rect& rect)
// defined in TouchGFXGeneratedHAL.cpp
LCD_2IN_SetWindow(rect.x, rect.y, rect.width, rect.height);
__IO uint16_t* ptr;
uint16_t height;
LCD_2IN_CS_0;
LCD_2IN_DC_1;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
HAL_SPI_Init(&hspi1);
for (height = 0; height < rect.height ; height++)
{
ptr = getClientFrameBuffer() + rect.x + (height + rect.y) * 240;
HAL_SPI_Transmit(&hspi1, (uint8_t*)ptr, rect.width, 200);
}
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
HAL_SPI_Init(&hspi1);
LCD_2IN_CS_0;
TouchGFXGeneratedHAL::flushFrameBuffer(rect);
}
- 定义刷新函数
extern "C" void touchGFX_signalVSyncTimer(void)
{
HAL::getInstance()->vSync();
OSWrappers::signalVSync();
}
- main中初始化LCD屏即可。
DEV_Module_Init();
LCD_SetBackLight(1000);
LCD_Init();
LCD_Clear(WHITE);
注意问题:
- 如果项目拷贝而来,每次使用TouchGFX Designer生成代码后,需要手动更改库文件路径。
- TouchGFX是C++,倘若用到驱动的C代码,记得用extern C包含。
#ifdef __cplusplus
extern "C" {
#endif
void LCD_Init(void);
void LCD_Clear(UWORD Color);
void LCD_Display(UBYTE *image);
void LCD_DrawPaint(UWORD x, UWORD y, UWORD Color);
void LCD_SetBackLight(UWORD Value);
void LCD_WriteData_Word(UWORD da);
void LCD_SetCursor(UWORD X, UWORD Y);
void LCD_SetWindow(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend);
void LCD_ClearWindow(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,UWORD color);
#ifdef __cplusplus
}
#endif
大功告成!