跳转到主要内容

性能测量

TouchGFX Core开放了几个信号,可用于测量性能。 当这些信号在内部触发时,用户可在应用程序中同步触发单个GPIO,从而实现“渲染时间”和其他有用信号的可视化。 本文介绍了如何在CubeMX中配置GPIO以及每个开放信号的作用。

Further reading

TouchGFX Core开放的信号

以下信号在TouchGFX Core头文件GPIO.hpp中定义:

信号说明
VSYNC_FREQTouchGFX应用程序由内部或外部事件驱动,如:来自LTDC、外设或硬件计时器的中断事件。 当TouchGFX引擎完成渲染后,将等待VSYNC信号。 它指示显示屏何时完成更新,以便TouchGFX可以开始渲染下一帧。
RENDER_TIME这是从帧传输到TouchGFX到渲染阶段结束的时间。
FRAME_RATE这是用户应用程序的帧速率。 当帧更新时,信号翻转。 如果渲染时间超过显示屏定义的最大渲染时间,帧速率将下降。
MCU_ACTIVE每当TouchGFX使用MCU时,该信号为高。 当传输帧缓存以及TouchGFX正在工作时,即不在空闲任务中时,MCU处于活动状态。

STM32CubeMX GPIO配置

STM32CubeMX可用于GPIO输出引脚的简单配置。 通过为每个引脚指定一个用户标签TouchGFXGPIO.cpp中的TouchGFX生成器生成的代码就会知道从TouchGFX Core内部接收到信号时翻转哪个引脚。

引脚排列视图中,将四个未使用的GPIO配置为输出。 在STM32CubeMX GPIO IP中,为每个引脚的用户标签提供一个与TouchGFX Core定义的特定名称相匹配的标签,该名称对应的信号应通过GPIO触发(即:VSYNC_FREQRENDER_TIMEFRAME_RATEMCU_ACTIVE)。 ).

TouchGFXGPIO类

TouchGFX生成器为TouchGFXGPIO.cpp文件中的GPIO类生成函数。 TouchGFX Core调用TouchGFXGPIO类上的函数,根据STM32CubeMX中的用户配置,来翻转引脚。 GPIO::set如下面的代码片段所示:

TouchGFXGPIO.cpp
void GPIO::set(GPIO_ID id)
{
switch (id)
{
case GPIO::VSYNC_FREQ:
#if defined(VSYNC_FREQ_GPIO_Port) && defined(VSYNC_FREQ_Pin)
HAL_GPIO_WritePin(VSYNC_FREQ_GPIO_Port, VSYNC_FREQ_Pin, GPIO_PIN_SET);
#endif
break;
case GPIO::RENDER_TIME:
#if defined(RENDER_TIME_GPIO_Port) && defined(RENDER_TIME_Pin)
HAL_GPIO_WritePin(RENDER_TIME_GPIO_Port, RENDER_TIME_Pin, GPIO_PIN_SET);
#endif
break;
case GPIO::FRAME_RATE:
#if defined(FRAME_RATE_GPIO_Port) && defined(FRAME_RATE_Pin)
HAL_GPIO_WritePin(FRAME_RATE_GPIO_Port, FRAME_RATE_Pin, GPIO_PIN_SET);
#endif
break;
case GPIO::MCU_ACTIVE:
#if defined(MCU_ACTIVE_GPIO_Port) && defined(MCU_ACTIVE_Pin)
HAL_GPIO_WritePin(MCU_ACTIVE_GPIO_Port, MCU_ACTIVE_Pin, GPIO_PIN_SET);
#endif
break;
}
}

如果引脚具有用户标签VSYNC_FREQ CubeMX将自动为端口、引脚生成匹配符号,例如VSYNC_FREQ_GPIO_PortVSYNC_FREQ_Pin。 使用示波器或逻辑分析仪测量配置信号。 下图为显示了四个信号的逻辑分析仪图形。 该应用程序在STM32F746G-DISCO上运行,带有动画图像UI示例。 此应用的VSYNC信号由LTDC每16ms生成一次。