在TouchGFX中,handleTickEvent方法的执行频率主要由以下因素决定:
核心决定因素:
TouchGFX内部定时器(Tick)配置
- 在
TouchGFXConfiguration.cpp中的 touchgfx_init() 函数里,通过 hal.setTickInterval(interval) 设置 基础Tick间隔(单位:毫秒)。
- 默认值通常为 1ms(即每秒尝试触发1000次)。
- 例如:
hal.setTickInterval(1); 目标是每1ms调用一次。
垂直同步(VSync)信号
- TouchGFX默认使用
REFRESH_BY_VSYNC 策略(在 touchgfx_init() 中配置)。
- 此时
handleTickEvent 的实际执行频率会被锁定到 LTDC的VSync频率(即屏幕刷新率)。
- 如果屏幕刷新率是60Hz,则
handleTickEvent 每秒执行60次(每帧一次)。
您的问题分析:
移植后 handleTickEvent 变慢,结合LTDC时钟25MHz,可能原因如下:
1. 屏幕刷新率降低(最可能)
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时序配置,通常这是执行频率差异的主因。
在TouchGFX中,handleTickEvent方法的执行频率主要由以下因素决定:
核心决定因素:
TouchGFX内部定时器(Tick)配置
- 在
TouchGFXConfiguration.cpp中的 touchgfx_init() 函数里,通过 hal.setTickInterval(interval) 设置 基础Tick间隔(单位:毫秒)。
- 默认值通常为 1ms(即每秒尝试触发1000次)。
- 例如:
hal.setTickInterval(1); 目标是每1ms调用一次。
垂直同步(VSync)信号
- TouchGFX默认使用
REFRESH_BY_VSYNC 策略(在 touchgfx_init() 中配置)。
- 此时
handleTickEvent 的实际执行频率会被锁定到 LTDC的VSync频率(即屏幕刷新率)。
- 如果屏幕刷新率是60Hz,则
handleTickEvent 每秒执行60次(每帧一次)。
您的问题分析:
移植后 handleTickEvent 变慢,结合LTDC时钟25MHz,可能原因如下:
1. 屏幕刷新率降低(最可能)
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时序配置,通常这是执行频率差异的主因。
举报