F28335 存储器 以及CMD文件操作

F28335的存储器结构

 

28335 包括SARAM存储器FLASH存储器

其中SARAM存储器的空间是34K x 16位 包括M0 ,M1 L0~L7

L4—L7用于DMA控制器访问。

其中FLASH存储器的空间是256K X16

 

 

 

FLASH的地址范围 0X30 0000~0x33 FFF7

注意下图 中的0x33 FFF8 是128 bit password 块的首地址。

FLASH的范围是0X30 0000~0x33 FFF7

 

 

FLASH的范围是0X30 0000~0x33 FFF7 实际上有0X3FFF8个16位内存单元

 

0X3FFF8 对应十进制是 262136 262136/1024=256

故 是256K X 16 位 的 FLASH

 

关键字128

注意在FLASH A 的底部 有128个单元是比较特殊 的 如下图所示 。

 

 

 

 

 

F28335 的片内FLASH 共 8 个 32K x 16位 的单元 总共256K x 16位单元

名称

起始地址

结束地址

Sector H (32k X 16)

0X30 0000

0X30 7FFF

Sector G (32k X 16)

0X30 8000

0X30 FFFF

Sector F (32k X 16)

0X31 0000

0X31 7FFF

Sector E (32k X 16)

0X31 8000

0X31 FFFF

Sector D (32k X 16)

0X32 0000

0X32 7FFF

Sector C (32k X 16)

0X32 8000

0X32 FFFF

Sector B (32k X 16)

0X33 0000

0X33 7FFF

Sector A(32k X 16)

0X33 8000

0X33 FFFF

 

 

 

 

 

CMD 文件中memory 指令

 

通过MEMORY 伪指令来指示存储空间

页0 来指示程序空间

页1 来指示数据空间

 

ZONE0 是外部扩展接口 起始地址是0x4000 终止地址是0x4FFF 总长度是0x1000

2的12次方 是4x 1024 是4K X16 位

 

ZONE6 必须定义 因为 我DSP 程序中PORT_AD 输出电流和输出电压的采样利用的外部AD 外部AD通过ZONE6 进行访问的 。如下图所示

 

 

 

 

 

 

 

 

FLASH 的起始地是0x30 0000 长度应该是0x3 FF80 上图误写成 0x ff80

应该是包括了 Sector A 的一部分 ;sector B ; Sector C; Sector D ; Sector E ; Sector F ;

Sector G ; Sector H

 

 

BEGIN 段2个16bit 单元是FLASH 引导程序入口。

 

BOOT ROM 也称为引导ROM

地址范围是 共8K X 16位

地址是0x3FE00 ~0X3FFFF 空间的分配如下图所示

 

 

上图中红色的地址区域 在地址0x3Ffc00 开始处存有上电引导程序,该程序由初始化引导函数Init-Boot 引导模式选择函数SelcetBoot Mode 退出引导函数 EXITbOOT 及几种加载引导函数组成。 是CAN加载 还是SCI加载。

 

地址03F FFC0~0X3F FFC1 内容是复位向量。 DSP在复位以后会读取该向量。并使程序的执行转向Boot ROM 中的引导程序(0x3f fc 00-----0x3f ffbf) 进而完成用户程序的加载。

 

 

 

 

 

 

 

现在回到CMD文件

以上的PAGE0是程序存储空间 。

 

现在讲PAGE1 PAGE1 是数据存储空间 主要定义的是片上RAM的存储空间

 

 

 

 

 

 

 

至此CMD 文件中的memory 指令 分为page0 (程序存储空间) page1 (数据存储空间)

现在已经讲解完了。

 

 

 

现在开始说SECTION 指令

 

SECTION 指令主要是分配段到存储空间中去, 存储空间前面已经用MEMORY指令完成。

另外还有一些段 代码段 与数据段 是通过在 C的伪指令中定义的

例如 #pragma 是标准C中保留的预处理命令

# pragma 的语法是:

 

#pragma CODE_SECTION (symbol,"section name")

#pragma DATA_SECTION (symbol,"section name")

说明:

  1. symbol 是符号。可以是函数名字。也可以是全局变量。Section name 是用户自己定义的段名。
  2. CODE_SECTION 用来定义代码段,DATA_SECTION 用来定义数据段。熟悉汇编的人很清楚,起始二者在汇编层次上分别是由伪指令.sect 和.usect实现的。

.sect 意思是用户定义的已初始化的段。

 

 

 

 

 

 

 

 

解释 在DSP2833X_CodeStartBranch.asm 用汇编指令中定义了codestart 的段

 

Codestart : > BEGIN PAGE=0

上面的语句表示 codestart 段 被装载到前面通过memory指令定义的BEGIN 存储空间中去。

 

  1. 重要

    例如 在DC_CONTROL.H 头文件中定义了 ramfuncs 段

    通过code_section 伪指令

     

     

    上图中的

    SECTION

    {

    Ramfuncs : LOAD=FLASH ,

    RUN=RAML0,

    LOAD_START(_RamfuncsLoadStart),

    LOAD_END(_RamfuncsLoadEnd),

    RUN_START(_RamfuncsRunStart),

    PAGE=0

    }

     

上面的语句 通过了SECTION伪指令规定了段(段ramfuncs)将被装载在存储器内的何处以及在存储器内如何运行:

 

其中 LOAD和RUN 是段的两个属性, LOAD_START LOAD_END RUN_START

这几个并非是参数而是能够生成全局符号的指令

在DigitalControl.map 里面能够找到 全部变量符号 RamfuncsLoadStart

如下图

 

这个的RamLoadStart RamLoadEnd RamRunStart 分别决定了装载的首位地址和运行地址。

 

代码段的含义指的是

存放在FLASH 中的段ramfuncs 须调入RAML0运行。

 

其装载在FLASH 的首地址为RamLoadStart,RamLoadEnd ,在RAM中的运行首地址为RamRunStart

 

完成将FLASH中的段ramfuncs 拷贝进入RANML0中运行 还需要以下步骤

 

第一步

将DSP2833x_Memory.c 函数加入到工程中,

Void MemCopy (UINT16 *SourceAddr ,UINT16 *SourceEndAddr , UINT16 *DestAddr)

{

While(SourceAddr<SourceEndAddr)

{

*DestAddr ++ = * SourceAddr++ ;

 

}

 

return

}

 

第二步

由于RamfuncsLoadStart , RamfuncsLoadEnd ,RamfuncsRunStart 是cmd文件定义的,为了能够在C语言中被MemCopy() 调用。需要按照如下格式声明

 

extern Uint16 RamfuncsLoadStart

extern Uint16 RamfuncsLoadEnd

extern Uint16 RamfuncsRunStart

 

/***********************************************************************/

注意:实际上下面的红色 就是定义全局符号的指令

SECTION

{

Ramfuncs : LOAD=FLASH ,

RUN=RAML0,

LOAD_START(_RamfuncsLoadStart),

LOAD_END(_RamfuncsLoadEnd),

RUN_START(_RamfuncsRunStart),

PAGE=0

}

/************************************************************************/

 

 

第三步 需要在主函数中 调用 MemCopy() 函数实现 ramfuncs 段从FLASH 往RAML0

中的复制

 

程序的代码段如下:

 

Memcopy(&RamfuncsLoadStart ,&RamfuncsLoadEnd, &RamfuncsRunStart)

如下图中的拷贝程序

 

C语言中有7个定义好的段

已初始化的段

(1).text 编译C语言中的语句时候,生成的汇编指令代码存放于此。

(2).cinit 存放用来对全局和静态变量初始化的常数

(3).switch 存放switch语句产生的常数表格

 

未初始化的段

(1).bss 存放全局和静态变量 。

(2).stack 存放C语言的栈。

(3) .sysmen 存放c语言的堆。

(4).const 稍微有些复杂的段,简单而言 是存放一些特殊的常数和字符 。

 

在本CMD文件中 将.text .cinit .switch .const .pinit (已经初始化的段)

放在FLASH 中 page 0 页中

将.stack .ebss .sysmem (没有初始化的段)

放在RAM中去 放在page 1 中。

 

如下图

 

 

 

IQmathTables 是编译程序以后产生的段

他存放在 前面memory 指定的空间 IQTABLES 中去 在PAGE 0 中

 

IQmath 是头文件中包含 IQmathlib.h 以后 编译 产生的的段

该段 存放在MEMORY 指定的FLASH 空间中

需要拷贝到RAML0中去运行 。

 

其装载在FLASH 中的首地址是 IQmathLoadStart IQmathLoadEnd

RAML0 中运行的首地址是 IQmathRunStart

 

 

 

 

在BOOTROM中 除CPU复位向量 以外的其他向量 为CPU中断向量 这些向量用于TI公司芯片自己测试 用户无需关心

第2 因为 不用 bootloader 所以复位向量用暂时不用管

类型均为 DSECT 如下图

 

 

 

百度网盘源文件链接

 

posted @ 2020-05-12 16:51  STEVEN-SUN  阅读(3965)  评论(0编辑  收藏  举报