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")
说明:
-
symbol 是符号。可以是函数名字。也可以是全局变量。Section name 是用户自己定义的段名。
-
CODE_SECTION 用来定义代码段,DATA_SECTION 用来定义数据段。熟悉汇编的人很清楚,起始二者在汇编层次上分别是由伪指令.sect 和.usect实现的。
.sect 意思是用户定义的已初始化的段。
解释 在DSP2833X_CodeStartBranch.asm 用汇编指令中定义了codestart 的段
Codestart : > BEGIN PAGE=0
上面的语句表示 codestart 段 被装载到前面通过memory指令定义的BEGIN 存储空间中去。
-
重要
例如 在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 如下图