最近做的那个啥玩意要做UI界面,正好ST有个自家的UI生成器,也算个好东西。就拿来做个ui。
结果亮屏就快做了一周,蚌埠住了
好,这就来记录一下这个点亮屏幕的过程罢,好时代来临力。
LTDC
首先我们说一下什么是LTDC,这就不得不说屏幕接口的几种形态。
- MCU屏,这种屏幕和主机连接的方法一般是用8080端口或者spi端口,这种屏幕有一种好处,那就是不用占用主机的RAM(运行内存),这是因为MCU屏自带了显存,我们只要把数据传输过去就行了
- RGB屏幕:这种屏幕就是我们今天要用到的屏幕,这种屏幕不带显存,所有的显示部分都是由主机传输过去的。这导致我们使用这种屏幕需要花费大量的RAM才能正常运行。
LTDC的接口定义
- LTDC有RGB三种颜色各八根数据线
- LTDC有行列各一个刷新线
- 有一根CLK时钟线
- 有一根数据使能线
其中只有数据使能线有效的时候显示屏会接受显示信息。
LTDC接口控制器
由于cubemx这种好软件的存在,我们可以直接配置ltdc接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JOfuMZMO-1651311431906)
首先我们看sync系列的参数
- WIdth:这个里面的参数尤其关注Active,这个参数就是你屏幕的宽度,其他的数据在你填完active以后会自动计算(不一定是对的,但是能用),剩下的那些数据可以直接用生成的数据,也可以用显示屏datasheet给出的数据,这里每个显示屏不一定是一样的,所以就不给出具体数值了
- height:这和width差不多,也是直接关注active即可
然后我们看blackground,这个参数是设计背景色的,保持000即可
接下来我们转到Layer Settings
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DA2Xn8HC-1651311431908)(https://static01.imgkr.com/temp/2582066194b74ae3ad40e73b4858f8c5.png “layer settings”)]
- number of layers:这个填一,虽然可以用两个,但是touchgfx的要求是一个,所以我们选一个。
- 接下来就是layer的宽和高,这个好理解,直接填上你屏幕的有效范围,比如我的屏幕是484*272
- 然后选择颜色格式,这个随个人需要选择,我这里使用的是565.
- Blending里面只需要将第一个改成255即可,剩下的全部默认
- 关于FrameBuffer我们选择连接好的SDRAM(关于这部分会额外出一个博客)
- 下面两个依然是填写自己的屏幕参数即可,这部分会用来计算缓冲区的长度
- 特别注意开启ltdc的中断.
DMA2D/chrom-ART
这个东西可以加速图形处理,直接开启并且默认操作即可.
硬件解码图像
启动即可
TouchGFX设置
touchgfx是意法半导体公司开放给所有人的ui设计系统,配套designer和cubemx一起使用,可以图形化设计UI.非常方便
cubemx之中的touchgfx设置
下载和安装选择应用包的过程我就不说了,网上很多.这个不会建议紫菜
- 我们先看第一个设置:接口,这个东西没啥好说的,选择LTDC(除非你用的是其他接口或者你想自己写一个协议)
- 然后就是缓冲区的像素格式,选择和你之前弄得玩意一样的格式,我这边还是565
- 缓冲器地址选择按地址,下面的地址直接写自己ltdc的地址(也是sdram里面来的).
- 时钟来源直接选ltdc,启动DMA2D,配置好使用RTOS_V2(没有使用rtos就不要选).但是大项目建议用rtos
- 外部数据读取时565特有的功能,不管他
- 视频解码,这个只有在开启了上文的图像解码才会出现,酌情选择,下面填的还是屏幕参数.
时钟设置
时钟这个是很重要的设置项目,因为ltdc是按照时钟频率发送数据的,这导致过高的频率会让屏幕显示异常,而过低的频率会影响屏幕的刷新率,导致卡顿,这都是我们不想见到的.
- 各个设备的时钟设置数据不一定是一样的.但是我们在时钟设置界面中能找到一条直通LTDC的线,这个数据就是我们要设置的,我们可以通过分频等操作来控制输出到LTDC显示接口的时钟频率.请查看自己的屏幕数据手册来确定自己需要的时钟频率.我设置的是10Mhz.
点击生成代码键
这个没啥好说的吧,还有一些基本设置应该不是这里需要讲的.我们会得到一个带有TouchGFX项目文件夹的项目
注意:这个时候进行编译是会提示缺失文件报错的.我们还需要去TouchGFXDesigner软件中再次生成代码才行.
TouchGFXDesigner
- 选择生成的代码中的项目文件(touch文件不是keil项目文件).
- 随便整点啥,生成代码
keil
注意:这一步非常重要,我在这里卡了很久
- 打开项目文件,来到FREERTOS.c文件,找到默认的rots线程
- 在线程中添加以下代码
MX_TouchGFX_Process();
这样才能启动touchGFX线程. - 编译烧写运行即可.
显示就有了()