STM32
直播中

张燕

8年用户 1464经验值
私信 关注
[问答]

touchgfx handletickevent 执行的频率 是由什么决定的?

移植了一个屏幕项目,ltdc 时钟频率时 25Mhz, 但是明显handletickevent执行频率比以前慢

回帖(1)

笑过就走

2025-8-18 16:41:39

在TouchGFX中,handleTickEvent方法的执行频率主要由以下因素决定:


核心决定因素:




  1. TouchGFX内部定时器(Tick)配置  



    • TouchGFXConfiguration.cpp中的 touchgfx_init() 函数里,通过 hal.setTickInterval(interval) 设置 基础Tick间隔(单位:毫秒)。  

    • 默认值通常为 1ms(即每秒尝试触发1000次)。  

    • 例如: hal.setTickInterval(1); 目标是每1ms调用一次。




  2. 垂直同步(VSync)信号  



    • TouchGFX默认使用 REFRESH_BY_VSYNC 策略(在 touchgfx_init() 中配置)。  

    • 此时 handleTickEvent 的实际执行频率会被锁定到 LTDC的VSync频率(即屏幕刷新率)。  

    • 如果屏幕刷新率是60Hz,则 handleTickEvent 每秒执行60次(每帧一次)。






您的问题分析:


移植后 handleTickEvent 变慢,结合LTDC时钟25MHz,可能原因如下:


1. 屏幕刷新率降低(最可能)



  • LTDC时钟频率(25MHz)影响像素输出速率,但并不直接决定刷新率。  

  • 刷新率由LTDC时序参数决定:  
     刷新率 = LTDC时钟 / [(宽度 + HBP + HFP + HSYNC) × (高度 + VBP + VFP + VSYNC)]

  • 对比旧项目:  

    • 如果旧项目LTDC时钟更高(如50MHz)或时序参数更小,刷新率可能更高(如60Hz)。  

    • 当前25MHz配置可能导致刷新率降低(如30Hz),直接导致 handleTickEvent 执行频率减半。



2. Tick间隔配置被修改



  • 检查 touchgfx_init() 中的 hal.setTickInterval() 值是否变大(如从1ms改为10ms)。


3. 渲染性能下降



  • 如果新项目的UI更复杂或MCU负载更高,可能导致帧渲染时间过长。  

  • TouchGFX会跳过VSync期间的Tick事件以保证帧率稳定,进一步减少 handleTickEvent 调用。


4. VSync信号生成问题



  • LTDC的VSync信号异常(如配置错误)可能导致实际刷新率偏低。




解决步骤:


✅ 步骤1:检查LTDC时序配置


计算当前屏幕的实际刷新率(以800x480分辨率为例):


// 典型时序参数 (单位:像素周期)
uint32_t width = 800;
uint32_t hbp = 88;    // 水平后沿
uint32_t hfp = 40;    // 水平前沿
uint32_t hsync = 48;  // 水平同步脉宽
uint32_t height = 480;
uint32_t vbp = 32;    // 垂直后沿
uint32_t vfp = 13;    // 垂直前沿
uint32_t vsync = 3;   // 垂直同步脉宽

// 计算刷新率
uint32_t total_pixels_per_line = width + hbp + hfp + hsync;
uint32_t total_lines = height + vbp + vfp + vsync;
float refresh_rate = 25000000.0f / (total_pixels_per_line * total_lines); // LTDC时钟25MHz

结论:  



  • 若结果显著低于旧项目(如30Hz vs 60Hz),需调整时序参数或提高LTDC时钟。


✅ 步骤2:验证TouchGFX配置


TouchGFXConfiguration.cpp 中确认:


void touchgfx_init() {
  ...
  hal.setFrameRefreshStrategy(REFRESH_BY_VSYNC); // 确保使用VSync
  hal.setTickInterval(1); // 确保Tick间隔=1ms
}

✅ 步骤3:监测实际帧率


handleTickEvent 中添加帧率统计:


void ScreenView::handleTickEvent() {
  static uint32_t last_tick = 0;
  static uint32_t frames = 0;

  frames++;
  if (tickCount - last_tick >= 60) { // 每60个Tick统计一次
    uint32_t fps = frames / 2;       // 约1秒内的帧率
    frames = 0;
    last_tick = tickCount;
    printf("Current FPS: %d", fps);  // 通过串口输出
  }
}

✅ 步骤4:优化性能



  • 简化UI动画或减少重绘区域。

  • 启用DMA2D硬件加速(在 touchgfx_init() 中调用 hal.enableDMAAcceleration())。

  • 提升MCU主频(如果可能)。




总结:
































可能原因 检查点 解决方案
刷新率降低 LTDC时序参数与25MHz时钟计算实际刷新率 调整时序或提高LTDC时钟
Tick间隔配置错误 hal.setTickInterval(1) 是否被修改 恢复为1ms
渲染性能不足 监控帧率是否低于预期 优化UI或启用硬件加速
VSync信号异常 用示波器检查LTDC_VSYNC信号频率 修正LTDC配置

建议优先对比新旧项目的LTDC时序配置,通常这是执行频率差异的主因。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分