I.MX RT1176 use 128Mb-Hyper Ram has Problem when enable prefetch

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

I.MX RT1176 use 128Mb-Hyper Ram has Problem when enable prefetch

1,727 Views
zicheng_hong
Contributor II

感谢,我这边碰到一个疑问,我们目前要从8MB的hyper ram更换为16MB的,发现一些问题。

我测试16MB的内存整块内存空间的连续读写,发现在die 0和die 1的边界处(比如整块内存是0x60000000~0x61000000,两个die之间的边界是0x60800000)会报错,报错如下:

 

 

我找到的一个合理解释是手册里面有明确写明下图(winbond和cypress都有),只要使能prefetch貌似就没法避免这个问题,针对这种情况会有什么好的解决办法吗?

image.pngimage.png

这种内部有两个die的hyperram的内部结构如下:

image.png

Tags (1)
0 Kudos
4 Replies

1,697 Views
kerryzhou
NXP TechSupport
NXP TechSupport

Hi zicheng_hong,

  楼主你好!

  看你贴的图,应该和本身hyperRAM的特性有关系。

   如果这种情况,我想,是否可以把你上下8M的区域分为两块,然后访问的时候在各自区访问,也就是在工程的linkerfile里面做两块,这样定义的时候尽量避免直接跨界的情况出现。

    另外,如果有时间,也可以看看这个文章,虽然是flash的,是否对你这总情况也有所指导:https://www.cnblogs.com/henjay724/p/13374775.html

   还有,你提到prefetch, 如果不使能prefetch是否也有这样的问题?

 

Best Regards,

Kerry

0 Kudos

1,686 Views
zicheng_hong
Contributor II

不使能Prefetch不会有问题,因为是否burst读是由Prefetch决定的,所以这一块还能理解。

我的想法其实是看看你们这边有没有什么好的办法比如利用flexspi控制器的什么特性可以规避这个问题,看起来是不行了,难顶。

目前我这边的解决办法是这样的(希望对后来者有点帮助吧)

启用Heap5.c,实现如下:

/* vPortDefineHeapRegions() ***must*** be called. */
HeapRegion_t xHeapRegions[] = {
{ ( uint8_t * ) 0x60400000U, 0x400000 },
{ ( uint8_t * ) 0x60800400U, 0x7FFC00 },
{ NULL, 0 }
};

vPortDefineHeapRegions( xHeapRegions );

Tags (1)
0 Kudos

1,680 Views
kerryzhou
NXP TechSupport
NXP TechSupport

感谢楼主的经验分享,关于prefetct,楼主也可以看看这篇应用笔记:

https://www.nxp.com/docs/en/application-note/AN12042.pdf

chapter5 ,看看是否对你有用。

 

Best Regards,

kerry

0 Kudos

1,726 Views
zicheng_hong
Contributor II

补一张报错的图image.png

0 Kudos