STM32F429及F7,H7内部集成了LTDC寄存器,直接驱动RGB LCD。但在使用中发现屏幕整体右移的现象。
8 d# q' ^4 S* {7 a查找了一番,发现是LTDC的一些相关参数没有配置好的问题。
7 `3 \/ ^+ t6 z- [# b$ z0 t6 M9 y [在LTDC初始化中,如下:
- Y$ z0 Y( ^; ~2 j8 e9 q- //DIY的 320X240 RGB屏幕 \6 l7 A! {8 A% H# a- y
- lcdltdc.pwidth=320; //面板宽度,单位:像素& z0 n( y7 M/ ]
- lcdltdc.pheight=240; //面板高度,单位:像素
; a8 Z4 w" w e! }- h - // lcdltdc.hsw=32; //水平同步宽度0 _" m3 q1 C1 C
- // lcdltdc.vsw=1; //垂直同步宽度
+ ^4 c6 P9 D/ Z6 A& X1 I - // lcdltdc.hbp=68; //水平后廊0 Y5 q& H# b- g
- // lcdltdc.vbp=18; //垂直后廊
3 z0 h, e1 G% l3 G3 @ - // lcdltdc.hfp=20; //水平前廊6 J) D2 s, V1 s5 N Q
- // lcdltdc.vfp=3; //垂直前廊
! a/ l8 Y- A; J% f7 ?: Z- ` - 8 j0 V, T. N0 {" N0 x4 T) Y/ t. ?
- lcdltdc.hsw=2; //水平同步宽度
* l# I& K) J- \7 \7 ?4 G$ F. n - lcdltdc.vsw=1; //垂直同步宽度( _6 @! D' j; N7 E- ?) ?2 J- p+ f
- lcdltdc.hbp=68; //水平后廊
0 r5 m/ I- |/ V3 h( D7 ] - lcdltdc.vbp=17; //垂直后廊
: {/ b! M1 O+ K$ d6 n; C' I. ] - lcdltdc.hfp=20; //水平前廊% |: Q# u7 V9 _% l
- lcdltdc.vfp=0; //垂直前廊; ]7 g; j+ c- _" Y7 ?* \; d# N8 m p
- ; q# u: Z, _, h; q# Q/ z
- LTDC_Clk_Set(288,4,RCC_PLLSAIDIVR_8); //设置像素时钟 9Mhz
复制代码 " W9 {* J0 f' C& W# z k
- A0 { g5 V) W, o; a6 @; i注释掉的是之前的配置,后经反复修正查看,更新为新的配置。
$ y6 e4 z9 _# ^具体原理,来着网上一个网友的思路:- f8 V' C/ ?8 P; V' ?) i: J
正常的TFT一行的显示周期是 前消隐+实际点输出+后消隐
6 z# c; ]0 I/ g1 o: Y7 @HBP、HFP 代表前后消隐所需要的周期3 A, l4 n7 i, v$ }) R5 ^" P
如果前消隐设置小了,后消隐设置大了,LCD控制器的实际输出就会被当做消隐而不会实际显示出来,看到的效果就是图像左移,反之图像右移
0 N8 m2 `! B/ w2 |4 h. U% }1 [4 z如果前后消隐都设置小了,理论上第二行的图像可能会被当做第一行的图像显示,照成屏幕歪斜不同步,但是有些TFT中内部的时序电路会自动补上缺少的时钟,所以也不一定会看到不同步的画面
' c- h7 U7 M: U/ [, ]- n2 ~场的消隐同理
" Y" W$ ]( m% I至于为什么要消隐是为了兼容CRT显示器的显示原理,CRT显示器每一个扫描行完成后,电子枪需要回扫,这段时间不能显示,所以这段时间的视频信号需要暂停一下,就是消隐. | 其中发现有时候即便调整的没有白边,但是图像闪烁明细,后增加前后整体时间,闪烁消失。遂好!
' y& g0 j% Z- w5 B非常感谢这位兄弟!
0 N3 h" X3 {0 @0 v4 t
4 Y5 _" ^: L ^3 G* X7 G5 Z; F0 ? |