适配过程
完成以上配置后, 已经可以将工程编译下载到目标板运行,但还不能显示图形界面。 打开 main.c 文件可以看到, 生成
的代码中已经完成了 touchgfx 框架初始化及任务调用。 还需要完成以下三个步骤才能显示图形界面。int main(void)
{
HAL_Init();
SystemClock_Config();
MX_CRC_Init(); // TouchGFX 需要使用 CRC
MX_TouchGFX_Init(); // 初始化 TouchGFX 框架
while (1)
{
MX_TouchGFX_Process(); // 在主循环中运行 TouchGFX 任务
}
}
1, 在 main 函数中加入 LCD 的初始化代码,比如 st7789v 的初始化:
void ctm_lcd_init(void)
{
lcd_drv = &st7789v_drv;
lcd_drv->Init();
lcd_drv->DisplayOn();
}
2, 用 tim 产生周期性的中断,作为 TouchGFX tick 节拍(通常 LCD 刷新率 60Hz, tim 定时周期配置约为 16ms)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM7) {
touchgfxSignalVSync(); // 触发 touchgfx 任务运行
}
}
extern "C" void touchgfxSignalVSync(void)
{
/* VSync has occurred, increment TouchGFX engine vsync counter */
touchgfx::HAL::getInstance()->vSync();
/* VSync has occurred, signal TouchGFX engine */
touchgfx::OSWrappers::signalVSync();
}
3, 实现刷新 LCD GRAM 函数,在 TouchGFXHAL::flushFrameBuffer 中更新部分 LCD 区域
volatile uint8_t vol_isTransmittingData = 0;
extern "C" int touchgfxDisplayDriverTransmitActive()
{
return vol_isTransmittingData;
}
extern "C" void touchgfxDisplayDriverTransmitBlock(const uint8_t* pixels, uint16_t x, uint16_t y,
uint16_t w, uint16_t h)
{
//partial fb
vol_isTransmittingData = 1;
lcd_draw_image_tgfxPBuf(x,y,w,h,pixels); // 实际更新 LCD,从坐标(x,y)开始, 宽 w,高 h 的区域
vol_isTransmittingData = 0;
startNewTransfer(); // 传输完成需调用
}
lcd_draw_image_tgfxPBuf 函数由用户根据 LCD 规格来实现, 会根据 TouchGFX 框架给出的坐标和宽高参数,来更新
LCD 指定区域。
实现这三个步骤后,便可以在 G071 目标板上运行并显示图形界面了。
小结
借助 TouchGFX 部分帧缓冲功能, 可以在低成本 MCU 上实现图形应用。 本文档介绍了低成本 MCU 图形应用的配置
流程,具体实现过程可参考电堂科技网站《STM32 & X-Cube-TouchGFX GUI 开发实践在线课程》之 X-CubeTouchGFX 快速上手视频。
|