28335保存数组到指定内存空间

放肆的年华 提交于 2020-02-27 23:21:22

28335保存数组到指定内存空间

28335的内存空间比较小,当需要用大数组的时候(比如FFT),经常会提示错误。一般的28335开发板都会外扩RAM,下面将介绍如何将数组保存到指定的外扩RAM中。

1.计算RAM地址

根据原理图计算RAM地址,比如我的原理图中(玻尔电子3XD开发板):

RAM的A18-A0接到28335的XA18-XXA0。XA19经过一个非门后,与XZCS6n通过2输入或门输出到R_CSn引脚,接到RAM芯片的CE引脚。当RAM的CE引脚为0时选通,此时XA19n和R_CS6n都为0,XA19为1,当28335读0x10 0000地址的内存时,R_CS6会自动拉低。XA19要求为1,则读写的地址为0x18 0000到0x1F FFFF时,读写的是RAM芯片。

所以RAM的地址为0x180000到0x1FFFFF。

2.计算RAM空间大小

RAM地址为0x18 0000到0x1F FFFF,一共19根地址线,这空间大小为

,16进制表示为0x08 0000。

3.修改CMD文件

按照28335手册和CMD文件格式,添加EXRAM分区:

MEMORY
{
PAGE 0 :   /* Program Memory */
......

PAGE 1 :   /* Data Memory */
......
RAML_XXXCMD     : origin = 0x00BFF0, length = 0x000004     
}
......

SECTIONS
{
......
ramdata         : > RAML_XXXCMD,   PAGE = 1
......
}

下面是我添加的示例:在MEMORY下PAGE 1中添加一个EXRAM_ZONE6(外扩ZONE6下的RAM),首地址为0x18 0000,长度为0x08 0000。

MEMORY
{
PAGE 0 :

PAGE 1 :

   EXRAM_ZONE6 : origin = 0x180000, length = 0x080000  /* XINTF zone 6 RAM - space */
}

在SECTIONS中添加一个EXRAM。

SECTIONS
{
   EXRAM            : > EXRAM_ZONE6,     PAGE = 1
}

4.定义数组

在.C文件中,定义一个数组,使用#pragma命令将数组关联到EXRAM中:

#pragma DATA_SECTION(SaveBuffer,"EXRAM");
Uint16 SaveBuffer[1000];

然后对SaveBuffer进行操作即可,SaveBuffer是保存在之前定义的EXRAM中,也就是0x18 0000开始的地址内的。

5.检验

写一个对SaveBuffer初始化的小程序,然后通过断点功能暂停程序,并通过CCS的Expressions和Momory Browser功能查看内存数据,是否与初始化符合。

   for(i=0;i<1000;i++)
   {
       SaveBuffer[i]=i;
   }
   asm("     ESTOP0");

程序跑起来,停下来后在Expressions功能中,能看见SaveBuffer的地址为0x18 0000。

在Momory Browser中输入0x18 0000,也能看见数据为0,1,2,3…

以上可以说明SaveBuffer数组确确实实是被保存在了RAM中。

7.延伸

将定义的数组由16位修改为32位,看看效果如何

#pragma DATA_SECTION(SaveBuffer,"EXRAM");
Uint32 SaveBuffer[1000];

在Momory Browser查看数据,可以分析出,数据的高位放在了地址的高位,比如02的数据,是0002 0000。

所以28335的数据保存应该是小端模式,实际上,大部分ARM、DSP都是小端模式,C51是大端模式。

8.问题

在延伸的基础上,将数组的数据类型改为8位整型(unsigned char):

#pragma DATA_SECTION(SaveBuffer,"EXRAM");
unsigned char SaveBuffer[1000];

在Momory Browser查看数据,出现了一个小问题,按理来说,1000的16进制是03E8,最后一个数据是03E7是对的,但是保存的数据格式是8位的整型,为什么会出现03E8呢,最大不应该是00FF么。

值得思考,这个问题,可能得需要对DSP的数据类型进行更深入的了解才能解答。

9.解答

通过查询资料得知,28335的数据是16位对齐的,unsigned char是16位的数据格式,那么也就能说得通上面的问题了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!