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