原创 LCD-TFT控制总结

2018-7-31 17:41 3977 19 6 分类: MCU/ 嵌入式 文集: stm32

最近学到LCD了,但是在将野火的代码转移到CubeMX时却遇到了大麻烦,屏幕一直是花的,只有一次正常显示一下下,但是过一段时间就又没了,好几天的时间都找不到问题。

说说如何找到问题的

找到问题的方法是我昨天才想到的,前些天就像无头苍蝇一样到处乱窜,花了很多时间,但是没有用对方法,都是无用功。

后来想到,LCD使用SDRAM最为显存,那么只需要读取SDRAM中的数据就知道为什么显示会有问题了。

通过访问SDRAM中的显存的地址,就可以直接得到SDRAM中的数据。

首先测试清屏函数,读取SDRAM中的数据在清屏前和清屏后的数据有什么不同。

1  printf("%s\n","-----D000 after clear-----");
2  uint32_t i;
3  uint8_t ubReaddata_8b=0;
4  for (i=0; i<200; i++) {
5    ubReaddata_8b = *(__IO uint8_t*)(0xD0000000 + i);
6    printf("%x ",ubReaddata_8b);
7  }
8
9  printf("\n%s\n","-----D000 after clear-----");
10
11  printf("%s\n","-----D020 after clear-----");
12
13  for (i=0; i<200; i++) {
14    ubReaddata_8b = *(__IO uint8_t*)(0xD0200000 + i);
15    printf("%x ",ubReaddata_8b);
16  }
17
18  printf("\n%s\n","-----D020 after clear-----");

发现清屏前后数据没有变化,都是一些随机的数据,因此可以推断清屏函数出了问题。

再看看清屏函数(LCD_Clear),调用了另外一个函数,可以推断应该是LL_FillBuffer这个函数出了问题。

1static void LL_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex)
2

之前使用的DMA2D的R2M模式,我使用M2M模式显示图片发现正常,方法参照微雪课堂,再次确认LL_FillBuffer这个函数出了问题。

看看LL_FillBuffer这个函数

1static void LL_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex) 
2
{
3  Dma2d_Handler.Init.Mode         = DMA2D_R2M;
4  if(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
5  { 
6    Dma2d_Handler.Init.ColorMode    = DMA2D_RGB565;
7  }
8  else if(Ltdc_Handler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
9  ...
10
11  /* DMA2D 初始化 */
12  if(HAL_DMA2D_Init(&Dma2d_Handler) == HAL_OK) 
13  {
14    if(HAL_DMA2D_ConfigLayer(&Dma2d_Handler, LayerIndex) == HAL_OK) 
15    {
16      if (HAL_DMA2D_Start(&Dma2d_Handler, ColorIndex, (uint32_t)pDst, xSize, ySize) == HAL_OK)
17      {
18        /* DMA轮询传输 */  
19        HAL_DMA2D_PollForTransfer(&Dma2d_Handler, 100);
20      }
21    }
22  } 
23}

它这里操作的是Dma2d_Handler这个结构体,但是我用CubeMX生成代码使用的是hdma2d这个结构体,再我将Dma2d_Handler替换为hdma2d后,程序运行正常。

简单介绍一下LCD使用到的外设资源
LTDC

液晶面板的信号线如下

信号名称说明
R[7:0]红色数据
G[7:0]绿色数据
B[7:0]蓝色数据
CLK像素同步时钟信号
HSYNC水平同步信号
VSYNC垂直同步信号
DE数据使能信号

LTDC作为液晶控制器可以使用SDRAM中的部分空间作为显存,直接控制液晶面板。

我们需要做的就是参考液晶屏的资料,将液晶屏的像素、控制时序等对LTDC进行初始化,LTDC就会自动对液晶屏进行刷新控制。

DMA2D

DMA2D用于图像数据搬运、混合及格式转换

有四种模式:DMA2D_M2M、DMA2D_M2M_PFC、DMA2D_M2M_BLEND、DMA2D_R2M

暂时只用过M2M和R2M,觉得M2M最好用了,将图片转为数组,开启存储器到存储器的DMA,通过HAL_DMA2D_Start_IT传输就好了。

FMC

FMC用于操作SDRAM,通过不断刷新SDRAM保证数据的正确性

------------------------------------

代码已上传github

------------------------------------

个人博客

文章评论1条评论)

登录后参与讨论

moniqiuwen 2018-8-2 10:10

博主这个习惯好,遇到问题记下了,赞
相关推荐阅读
greedyhao 2019-03-17 09:03
uboot链接脚本分析
上一篇uboot主编译脚本分析的编译选项参数中提到了链接脚本这么个东西我也是写到这里才开始了解链接脚本(Linker command scripts),之前只是大概知道有这么一个东西先从参考资料中的内...
greedyhao 2018-11-28 08:49
51总线方式获取adc0809数值
最近单片机有一个实验挺有意思的,使用51单片机以总线的方式读取adc0809的数据先补充点关于单片机总线的预备知识,我一开始不了解总线的时候做这个实验也是很懵逼的。单片机的三总线结构​51单片机有三条...
greedyhao 2018-09-29 21:18
对Xil_Out32未定义的引用
第一次在HLS中遇见一个官方库函数未定义问题,这就把解决方法记录下来。在创建好工程,写完工程代码后,发现报错如下./src/led_controller_test_tut_4A.o:在函数‘main’...
greedyhao 2018-09-29 21:12
Vivado生成Bitstream失败的解决方法
跟着实验指导书,难得的又遇到问题了,在最后生成Bitstream的时候出错了,无法生成Bitstream。报错信息如下[DRC NSTD-1] Unspecified I/O Standard: 4 ...
greedyhao 2018-09-17 22:26
zybo初体验
前段时间过生日,亲戚给了些钱让我自己买生日礼物,早就想搞一块zynq的板了,但是淘宝一看太贵,于是去咸鱼上淘了一块二手的ZYBO(谁知道是不是二手,反正看着挺新)来玩玩。学习肯定是从官方资料开始的,T...
greedyhao 2018-09-13 10:53
运行c代码前发生了什么
众所周知,c代码也是一种比较高级的语言了,机器是没有办法直接运行的,机器所能理解的只有机器码--那一串0和1而已。虽然早就知道c代码是先经过编译链接最后才放在机器上执行,但是在这么一个过程中究竟发生了...
我要评论
1
19
关闭 站长推荐上一条 /2 下一条