硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2680|回复: 8
收起左侧

stm32f429屏幕闪屏/花屏的问题怎么解决?

[复制链接]

5

主题

8

回帖

5

积分

新手上路

积分
5
发表于 2017-5-8 10:40:56 | 显示全部楼层 |阅读模式
在使用STM32F429驱动 1024*600,像素格式使用RGB565的时候,如果始终频率过高,超过12Mhz,则会出现花屏或者屏幕抖动的现象。

花屏

花屏


但是如果降低LCD的始终频率,12Mhz及以下,屏幕会出现闪屏及水波纹的现象。
我是使用外部SRAM作为显存,单独读写SRAM数据正常,感觉应该不是SRAM配置的问题。
有朋友遇到同样的情况的吗?
回复

使用道具 举报

5

主题

8

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2017-5-8 11:02:02 | 显示全部楼层
文档.png
官方文档说明可以支持1024*768,我也没有超呀。真是纳闷。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2017-5-8 13:43:28 | 显示全部楼层
你用的多大的SRAM,2MB?

RGB565的话,需要 1024*600*2


为什么不用SDRAM,16位异步SRAM性能太挫了,而且高速的超贵。
回复

使用道具 举报

5

主题

8

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2017-5-8 14:24:34 | 显示全部楼层

回 eric2013 的帖子

eric2013:你用的多大的SRAM,2MB?

RGB565的话,需要 1024*600*2


....... (2017-05-08 13:43) 
是16位 2M的,2块1M和在一起的。硬件同事做的,地址连续,读写正常,功能和一块2M大小的一样。访问周期为55ns;
另外,请教一下,为什么说16位的SRAM性能挫?是因为SDRAM的访问周期比SRAM更快吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2017-5-8 14:33:41 | 显示全部楼层

回 zy_35 的帖子

zy_35:是16位 2M的,2块1M和在一起的。硬件同事做的,地址连续,读写正常,功能和一块2M大小的一样。访问周期为55ns;
另外,请教一下,为什么说16位的SRAM性能挫?是因为SDRAM的访问周期比SRAM更快吗? (2017-05-08 14:24) 
55ns太慢了,性能捉急。

我们V5板子配套的是10ns。F407完全发挥不出性能。F429的FMC总线一样的。

务必要使用SDRAM。看我早前的性能测试
http://www.armbbs.cn/forum.php?mod=viewthread&tid=16836
回复

使用道具 举报

5

主题

8

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2017-5-9 12:41:15 | 显示全部楼层

Re:回 zy_35 的帖子

eric2013:

55ns太慢了,性能捉急。

我们V5板子配套的是10ns。F407完全发挥不出性能。F429的FMC总线一样的。

.......
回复

使用道具 举报

5

主题

8

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2017-5-9 12:41:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:

55ns太慢了,性能捉急。

我们V5板子配套的是10ns。F407完全发挥不出性能。F429的FMC总线一样的。

.......
[blockquote]eric2013:

55ns太慢了,性能捉急。

我们V5板子配套的是10ns。F407完全发挥不出性能。F429的FMC总线一样的。

.......
谢谢回复。
根据你的SDRAM测试代码,我测试了一下我SRAM的读写速度。代码如下:

  1. //-------------------------------------------------
  2. #define SAMPLE_SRAM_SIZE (1024*1)
  3. #define ALIGN_RW 0// 0: 8bit 1:16bit 2:32bit 3:64bit
  4. /*************************************************
  5. * @function :SRAM_Sample()
  6. * @Description:
  7. * @Input :无
  8. * @Output :
  9. * @Return :无
  10. * @Others :
  11. *************************************************/
  12. void SRAM_Sample()
  13. {
  14. #if 1
  15. int i, j = 0, nAlign;
  16. static int nReadRate, nWriteRate, nNopTime, nRWTime;
  17. #if (ALIGN_RW == 0) // 8
  18. u8 *pBuf = (u8*)SRAM_BANK3_ADDR;
  19. nAlign = 1;
  20. #elif (ALIGN_RW == 1) // 16
  21. u16 *pBuf = (u16*)SRAM_BANK3_ADDR;
  22. nAlign = 2;
  23. #elif (ALIGN_RW == 2) // 32
  24. u32 *pBuf = (u32*)SRAM_BANK3_ADDR;
  25. nAlign = 4;
  26. #elif (ALIGN_RW == 3) // 64
  27. u64 *pBuf = (u64*)SRAM_BANK3_ADDR;
  28. nAlign = 8;
  29. #endif
  30. TFTLCD_Init(); //LCD初始化
  31. SRAM_Init();
  32. SWTMR_Init(SWTMR_1MS); // 1ms中断一次
  33. delay_ms(300);
  34. SWTMR_StartTimer(1, SWTMR_CYCLE, SWTMR_Callback2, NULL);
  35. //----------写--------------------------------
  36. nRWTime = 10;
  37. while(nRWTime--)
  38. {
  39. nSWTMR_Tick = 0;//计数值清零
  40. #if (ALIGN_RW == 0) // 8
  41. pBuf = (u8*)SRAM_BANK3_ADDR;
  42. #elif (ALIGN_RW == 1) // 16
  43. pBuf = (u16*)SRAM_BANK3_ADDR;
  44. #elif (ALIGN_RW == 2) // 32
  45. pBuf = (u32*)SRAM_BANK3_ADDR;
  46. #elif (ALIGN_RW == 3) // 64
  47. pBuf = (u64*)SRAM_BANK3_ADDR;
  48. #endif
  49. for (i = SAMPLE_SRAM_SIZE * 1024 / nAlign / 32; i > 0 ; i--)
  50. {
  51. *pBuf++ = j++;
  52. *pBuf++ = j++;
  53. *pBuf++ = j++;
  54. *pBuf++ = j++;
  55. *pBuf++ = j++;
  56. *pBuf++ = j++;
  57. *pBuf++ = j++;
  58. *pBuf++ = j++;
  59. *pBuf++ = j++;
  60. *pBuf++ = j++;
  61. *pBuf++ = j++;
  62. *pBuf++ = j++;
  63. *pBuf++ = j++;
  64. *pBuf++ = j++;
  65. *pBuf++ = j++;
  66. *pBuf++ = j++;
  67. *pBuf++ = j++;
  68. *pBuf++ = j++;
  69. *pBuf++ = j++;
  70. *pBuf++ = j++;
  71. *pBuf++ = j++;
  72. *pBuf++ = j++;
  73. *pBuf++ = j++;
  74. *pBuf++ = j++;
  75. *pBuf++ = j++;
  76. *pBuf++ = j++;
  77. *pBuf++ = j++;
  78. *pBuf++ = j++;
  79. }
  80. nWriteRate += nSWTMR_Tick;
  81. }
  82. nWriteRate = nWriteRate / 10;
  83. //-------------------------------------------
  84. //---------读----------------------------------
  85. nRWTime = 10;
  86. while(nRWTime--)
  87. {
  88. #if (ALIGN_RW == 0) // 8
  89. pBuf = (u8*)SRAM_BANK3_ADDR;
  90. #elif (ALIGN_RW == 1) // 16
  91. pBuf = (u16*)SRAM_BANK3_ADDR;
  92. #elif (ALIGN_RW == 2) // 32
  93. pBuf = (u32*)SRAM_BANK3_ADDR;
  94. #elif (ALIGN_RW == 3) // 64
  95. pBuf = (u64*)SRAM_BANK3_ADDR;
  96. #endif
  97. nSWTMR_Tick = 0;//计数值清零
  98. for (i = SAMPLE_SRAM_SIZE * 1024 / nAlign / 32; i > 0 ; i--)
  99. {
  100. j = *pBuf++;
  101. j = *pBuf++;
  102. j = *pBuf++;
  103. j = *pBuf++;
  104. j = *pBuf++;
  105. j = *pBuf++;
  106. j = *pBuf++;
  107. j = *pBuf++;
  108. j = *pBuf++;
  109. j = *pBuf++;
  110. j = *pBuf++;
  111. j = *pBuf++;
  112. j = *pBuf++;
  113. j = *pBuf++;
  114. j = *pBuf++;
  115. j = *pBuf++;
  116. j = *pBuf++;
  117. j = *pBuf++;
  118. j = *pBuf++;
  119. j = *pBuf++;
  120. j = *pBuf++;
  121. j = *pBuf++;
  122. j = *pBuf++;
  123. j = *pBuf++;
  124. j = *pBuf++;
  125. j = *pBuf++;
  126. j = *pBuf++;
  127. j = *pBuf++;
  128. j = *pBuf++;
  129. j = *pBuf++;
  130. j = *pBuf++;
  131. j = *pBuf++;
  132. }
  133. nReadRate += nSWTMR_Tick; // 累加使用时间
  134. }
  135. nReadRate = nReadRate / 10;// 求平均
  136. //-------------------------------------------
  137. #endif
  138. while(1);
  139. }
复制代码
连续读写10次,求平均。
写1M数据
 先写后读先读后写
对其方式(bit)读(ms)写(ms)读速率(MB/s)写速率(MB/s)读(ms)写(ms)读速率(MB/s)写速率(MB/s)
82041104.909.092051114.889.01
161005510.0018.181005610.0017.86
32835512.0518.18815812.3517.24
64735513.7018.18735513.7018.18


有几点疑惑:
1. 为什么对其方式不同时,读写速率会不一样?
2. 读取的速率居然把写入的快。不是应该写更耗时吗。
3. 按SRAM芯片手册上读写周期55ns,理论的读写速率应该是18MB/s才对。而测试结果,只有当对其方式为不为8bit的时候,写速率才有那么高,读的就10-13M左右。
这个速率恰恰是我LCD正常显示时的时钟频率,高了就会花屏或斗屏。


望答复。谢谢
[/blockquote]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2017-5-9 13:15:48 | 显示全部楼层

回 zy_35 的帖子

zy_35:谢谢回复。
根据你的SDRAM测试代码,我测试了一下我SRAM的读写速度。代码如下:

//-------------------------------------------------
....... (2017-05-09 12:41)
1. 因为你的是16位SRAM,写一次8位跟写一次16位数据,时间上基本没有区别。
2. STM32就是这样的。写更耗时那是nand,spiflash那种存储介质。
3. 总的来说,你用的这个SRAM性能太挫了,而且容量小。

以后用emWin的三缓冲都没法用,容量太小了,完全发挥不了性能。
回复

使用道具 举报

5

主题

8

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2017-5-9 13:35:47 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 因为你的是16位SRAM,写一次8位跟写一次16位数据,时间上基本没有区别。
2. STM32就是这样的。写更耗时那是nand,spiflash那种存储介质。
3. 总的来说,你用的这个SRAM性能太挫了,而且容量小。

....... (2017-05-09 13:15) 
[s:151][s:141]
又学到了,非常感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 01:29 , Processed in 0.229102 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表