STM32CubeIDE+touchGFX+LCD

项目场景:

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

大功告成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值