本帖最后由 orta 于 2017-12-18 15:56 编辑
请问,小弟最近做一个项目,需要用64MB内存 + 10寸 1280x800 电容屏(RGB565)
首先,单独测试SDRAM(程序中没有LTDC的使用)
u8 testsram[64*1024*1024] __attribute__((at(0XC0000000)));// 数组映射到地址 0XC0000000
测试代码:
for(i=0;i<64*1024*1024;i++)
{
testsram[ i ] = k; // K 代表测试次数
}
temp=0;
for(i=0;i<64*1024*1024;i++)
{
if(testsram[ i ]!=k){wrong++;}
}
这个代码十分简单,使劲刷SDRAM所有地址 所有数据, 经测试,64MB SDRAM 工作正常,wrong 从来没有++ 过。
======================================================================================================
然后,开始挂载1280x800电容屏。用的正点原子的 10.1寸电容屏,采用1层 LTDC, 屏的SDRAM映射地址为:
u16 ltdc_lcd_framebuf[1280][800] __attribute__((at(0XC0000000))), 也就是 SDRAM起始地址。
层配置:
LTDC_Layer_Parameter_Config(0,(u32)ltdc_framebuf[0],LCD_PIXFORMAT,255,0,6,7,0X000000);
LTDC_Layer_Window_Config(0,0,0,lcdltdc.pwidth,lcdltdc.pheight);
通过 多点触摸 测试程序, 5点触摸工作正常,屏幕显示稳定。
===========================================================================================================
最后,挂载电容屏显示的同时,将SDRAM空闲部分的空间进行测试。
屏的映射起始地址:u16 ltdc_lcd_framebuf[1280][800] __attribute__((at(0XC0000000))),
测试数组映射地址:u8 sdram_array[60*1024*1024] __attribute__((at(0XC0400000))); // 屏缓冲占 1280x800x2 字节 , 我多给它让一点空间,让出4MB吧,所以, sdram_array 数组起始地址为 0XC0000000 + 4*1024*1024 = 0XC0400000
然后,通过
测试代码:
for(i=0;i<60*1024*1024;i++)
{
sdram_array[ i ] = k; // K 代表测试次数
}
temp=0;
for(i=0;i<60*1024*1024;i++)
{
if(sdram_array[ i ]!=k){wrong++;}
}
悲剧发生了, wrong跑出来很多 (但不是所有地址都有错)。
经过测试, i<10*1024*1024 , 只测试10MB空间 还是正确,加大测试范围则开始出现错误,但不是所有地址都错 (wrong 计数器 小于 i 计数器)
我尝试过
1. 降低SDRAM配置时钟
2. 降低LTDC时钟
3. 更换LTDC映射地址位置
都无法解决。
请问还有什么原因会导致这个问题呢?
我想到的,是不是 因为同时挂载了LTDC 和SDRAM, LTDC总是占用总线,导致 单独对SDRAM其他地址空间操作时失败?
谢谢大家!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
像素时钟不能超过50M
一周热门 更多>