【GD32450I-EVAL】TLI时钟与RGB接口时序
[复制链接]
本帖最后由 tinnu 于 2020-10-6 21:44 编辑
(一)查看帧率
通过电气信息查看目前RGB屏幕刷新帧率最简单的方法是查看VS引脚的脉冲,因为VS引脚一旦产生一个脉冲即意味着一帧的结束
以目前的配置,1s有53帧,还没达到60帧。
(二)时钟源
红色的四个框都是寄存器,可以配置的,其中后面三个是RCU_PLLSAI(本寄存器)中的位,第一个PLLPSC需要在其他寄存器里面配置。
下划线的五个是五条时钟线:
图片标注都省略了前缀PLLSAI
这时候有需要查看PLLSRC的时钟是从哪里来的?
相关位在RCU_PLL寄存器:
RCU_PLL寄存器本应该是PLL这个锁相环自己用的,但这个选择功能属于PLL_I2S和PLL_SAI,都放到这里来公用了。
(三)修改时钟
而系统要达到200M的速度,必须要PLL为系统提供时钟,所以这里的初始化必然是在systemInit里面进行的
初始化使用的函数是:
system_clock_200m_25m_hxtal(void)
里面注释写明了:
PSC=25,外部晶振也是25M,也就是说VCOSRC只有1M!
回到现在TLI的配置:
rcu_pllsai_config(192, 2, 3)
也就是给了VCO 192M的频率,出来首先来了一波属于R的3分频
接着再来一波属于div的8分频:
rcu_tli_clock_div_config(RCU_PLLSAIR_DIV8);
只剩下8M!
我们直接来一波2分频试试!
查看VS引脚,时序没有太大问题的样子:
但是屏幕一片空白,之后尝试了下4分频,依然不行。
看来翻倍还是太激进了,尝试修改下倍频:
修改时钟到219,这时候恰好超过60帧,也没有问题,看来超过一点60Hz是可以的,但想要120Hz,这种屏幕做不到。
操作上没感觉到什么不同,因为这个是与USB共用的时钟,如果不考虑USB应用是可以随便调整的。
(四)屏幕刷新闪屏问题
在移植SDRAM之前,屏幕有个闪屏的问题:
这是与刷新策略有关。
相关函数为LittleVGL刷新函数:
static void DEMO_FlushDisplay(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
里面刷新调用的是
if (color_p == EXT_BUFFER0_ADDR)
{
tli_layer_disable(LAYER0);
tli_layer_enable(LAYER1);
tli_reload_config(TLI_FRAME_BLANK_RELOAD_EN);
}
else if (color_p == EXT_BUFFER1_ADDR)
{
tli_layer_disable(LAYER1);
tli_layer_enable(LAYER0);
tli_reload_config(TLI_FRAME_BLANK_RELOAD_EN);
}
相关寄存器为重载层配置寄存器 (TLI_RL)
FBR
帧消隐重载请求 此位通过软件置位,在重载之后由硬件清除。
0:禁止重载
1:层配置将在帧消隐时被重载进入真正寄存器。
RQR
立即重载请求 此位通过软件置位,在重载之后由硬件清除。
0:禁止重载
1:层配置将在该位置位之后被重载进入真正寄存器。
这里不应该立即刷新,应该等待一帧完成再刷新:
if (color_p == EXT_BUFFER0_ADDR)
{
tli_layer_disable(LAYER0);
tli_layer_enable(LAYER1);
tli_reload_config(TLI_FRAME_BLANK_RELOAD_EN);
}
else if (color_p == EXT_BUFFER1_ADDR)
{
tli_layer_disable(LAYER1);
tli_layer_enable(LAYER0);
tli_reload_config(TLI_FRAME_BLANK_RELOAD_EN);
}
|