LTDC外设可以看成是一种M2LCD的的DMA,LTDC的初始化结构体中有一段映射地址,这个地址一般为片外RAM,也可以片内。程序修改这个RAM对应地址段的值,就会体现在屏幕上。就好比一个大数组,每个元素对应LCD的一个像素色。例如RGB888,那么每个像素点,有三个色,各占8bit,一个字节。一个像素点24bit,3字节。开辟一个这样的数组,与LTDC的起始地址段共地址,那么修改这个数组的元素值,就会体现在LCD屏幕上。这样就实现了屏幕显示。: J& i, {# N/ o. p + f' h6 }9 o7 T H5 k2 F8 G9 u1 Z ) ~6 g% _0 V4 @% Q( k# X2 _5 O3 ? DMA2D就直接是一种DMA了,加上了2D,不知道这个2D是 to display的意思还是2D图像的意思。不管怎么说,就是一种专门给图形显示加速的DMA无疑了。DMA2D可以混合两张图片,然后给LCD显示。其实我原来一直没有搞懂,这个混合怎么用。如果想混合,我需要3个GRAM空间。LTDC那个不能动,需要另外两个GRAM作为DMA2D的输入。由DMA2D完成混合之后,搬移到LTDC的GRAM上,实现显示。看到很多人实际的代码中,其实是只有两个GRAM,LTDC的GRAM和另外一片GRAM空间,由这俩空间混合后,搬移到LTDC的GRAM上。有点像a=a+b的意思。其实我一直觉得这样不好的原因并不是3片空间太浪费,主要是想不明白,LTDC的空间被修改之后,下一次往上附加或者混合别的内容,会不会有残留。举个例子,我想让一个图片移动。那么如果直接混合到LTDC的内存上,那么它就会把LTDC原来的信息覆盖,图片移走之后,虽然可以擦除图片痕迹,但LTDC怎么恢复之前的信息呢?这些需要再想想。因为即便有无数个GRAM空间,总有需要混合和覆盖的问题,都需要解决。除非每个GRAM的信息都能独立被保存,实时被刷新。以便重新覆盖有移动的地方的内存空位。这样代价会不会太大?有几个图层就需要几个刷新的线程,不断的更新。不断的混合。如果只是直接修改LTDC的存储还可以少点内存。如果每个图层用独立的GRAM空间,那就热闹了,得多大的RAM啊? & z2 s$ A4 ?, a" e* K$ q & e& K" J' K6 j- ? 3 W/ T% I% w, B7 l: V |
工程师笔记 | STM32H7 RAMECC功能及应用
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试