适配过程
完成以上配置后, 已经可以将工程编译下载到目标板运行,但还不能显示图形界面。 打开 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 快速上手视频。
|