工具/软件:Code Composer Studio
您好!
我正在使用 LAUNCHXL-F28069M。
我的代码在 RAM 调试模式下按我的意愿运行。
然后、我将 cmd 从"F2806X_CLA_C_lnk.cmd"修改为如下所示、并希望在闪存模式下运行、但无法像在 RAM 调试模式下那样运行。
我已经测试了"Example_2806xFlash"、它可以与 LAUNCHXL-F28069M 配合使用。
我的 cmd 文件有什么问题? 还是在我的配置中?
我的 cmd 文件:(F2806x_Headers_nonBIOS.cmd 未被修改)
--------------------------------------------------------------------
--define=CLA_C=1
--define=_FLASH
_Cla1Prog_Start =_Cla1ProgRunStart;
存储器
{
第0页:/* 程序内存*/
/*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
CLAPROGRAM :origin = 0x009000,length = 0x001000 //片上 RAM 块 L3 */
RAMM0 :origin = 0x000050、length = 0x0003B0 //片上 RAM 块 M0 *
RAML5L8 :origin = 0x00C000、length = 0x008000
OTP :origin = 0x3D7800,length = 0x000400 //片上 OTP */
FLASHH :origin = 0x3D8000,length = 0x004000 //片上闪存*/
FLASHG :origin = 0x3DC000、length = 0x004000 //片上闪存*/
FLASHF :origin = 0x3E0000,length = 0x004000 //片上闪存*/
FLASHE :origin = 0x3E4000、length = 0x004000 //片上闪存*/
FLASHD :origin = 0x3E8000、length = 0x004000 //片上闪存*/
FLASHC :origin = 0x3EC000,length = 0x004000 //片上闪存*/
FLASHA :origin = 0x3F4000,length = 0x003F7E //片上闪存*/
CSM_RSVD :origin = 0x3F7F7E,length = 0x000076 // FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
begin :origin = 0x3F7FF4,length = 0x000004 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
CSM_PWL_P0 :origin = 0x3F7FF8,length = 0x000008 // FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/
FPUTABLES :origin = 0x3FD860,length = 0x0006A0 //引导 ROM 中的 FPU 表*/
IQTABLES :origin = 0x3FDF00,length = 0x000B50 //引导 ROM 中的 IQMath 表*
IQTABLES2 :origin = 0x3FEA50,length = 0x00008C //引导 ROM 中的 IQMath 表*
IQTABLES3 :origin = 0x3FEADC,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/
ROM :origin = 0x3FF3B0,length = 0x000C10 //引导 ROM */
复位 :origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分 */
向量 :origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分 */
第1页:/* 数据存储器*/
/*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
/*寄存器保留在第1页 中*/
BOOT_RSVD :origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
RAMM1 :origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
CLA1_MSGRAMLOW :origin = 0x001480,length = 0x000080
CLA1_MSGRAMHIGH:origin = 0x001500,length = 0x000080
CLARAM0 :origin = 0x008800,length = 0x000400 //片上 RAM 块 L1 */
CLARAM1 :origin = 0x008C00,length = 0x000400 //片上 RAM 块 L2 */
CLARAM2 :origin = 0x008000、length = 0x000800 //片上 RAM 块 L0 */
RAML4 :origin = 0x00A000、length = 0x002000 //片上 RAM 块 L4 */
USB_RAM :origin = 0x040000、length = 0x000800 // USB RAM *
FLASHB :origin = 0x3F0000,length = 0x004000 //片上闪存*/
}
/*将段分配给内存块。
注:
DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
闪存时执行
ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
*
部分
{
/*分配计划领域:*/
codestart :> begin, page = 0
#IF 定义(RAM)
.cinit :> RAMM0, page = 0
.pinit :> RAMM0, page = 0
.text :> RAML5L8, page = 0
ramfuncs :>RAML5L8, page = 0
.econst :> RAML5L8, PAGE = 0
switch :>RAMM0, page = 0
IQMath :> RAML5L8, page = 0 /*数学代码*/
Cla1Prog :{_Cla1ProgRunStart=.;}> CLAPROGRAM,
PAGE = 0
CLA1mathTables :> CLARAM1, page = 1.
#elif defined (_flash)
.cinit :> FLASHA, page = 0
.pinit :> FLASHA, page = 0
.text :> FLASHA, page = 0
ramfuncs :load = FLASHD,
运行= RAML5L8、
load_start (_RamfuncsLoadStart)、
run_start (_RamfuncsRunStart)、
load_size (_RamfuncsLoadSize)、
PAGE = 0
/*将初始化段放入闪存中*/
/*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
econst :> FLASHA, PAGE = 0
.switch :> FLASHA, PAGE = 0
IQMath :> FLASHA, page = 0 /*数学代码*/
Cla1Prog :load = FLASHD,
运行= CLAPROGRAM、
Load_start (_Cla1ProgLoadStart)、
load_size (_Cla1ProgLoadSize)、
run_start (_Cla1ProgRunStart)、
PAGE = 0
CLA1mathTables :load = FLASHB,
运行= CLARAM2、
Load_start (_CLA1mathTablesLoadStart)、
load_size (_CLA1mathTablesLoadSize)、
run_start (_CLA1mathTablesRunStart)、
PAGE = 1.
其他
#ERROR 将"RAM"或"_flash"添加到 C2000链接器->高级选项->命令文件预处理->-define
ENDIF//RAM
csmpasswds :>csm_PWL_P0,page = 0
csm_rsvd :>csm_RSVD, page = 0
/*分配未初始化的数据段:*/
.stack :>RAML4, page = 1.
.ebss :> RAML4, PAGE = 1
.esysmem :>RAML4, page = 1.
/*分配 IQ 数学区域:*/
IQmathTables :>IQTABLES, PAGE = 0,TYPE = NOLOAD
/*分配 FPU 数学区域:*/
FPUmathTables :> FPUTABLES, PAGE = 0,TYPE = NOLOAD
Cla1ToCpuMsgRAM :> CLA1_MSGRAMLOW, page = 1.
CpuToCla1MsgRAM :>CLA1_MSGRAMHIGH, PAGE = 1.
Cla1DataRam0 :> CLARAM0, PAGE = 1
Cla1DataRam1 :> CLARAM1, PAGE = 1
Cla1DataRam2 :> CLARAM2, PAGE = 1.
/*分配 CLA "C"区域*/
#ifdef CLA_C
/* CLA C 编译器段*/
//
//必须被分配给 CLA 具有写入访问权限的内存
//
暂存区 :> CLARAM1, PAGE = 1
.bss_cla :> CLARAM2, page = 1.
.const_CLA :> CLARAM2、 PAGE = 1.
#endif //cla_C
/*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
库中的函数、以便利用
引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
1个等待状态)。 如果此部分未注释、则为 IQmathTables2
将被加载到其他存储器(SARAM、闪存等)中并将采用
上行空间、但0等待状态是可能的。
*
/*
IQmathTables2 :> IQTABLES2,PAGE = 0,TYPE = NOLOAD
{
IQMath.lib (IQmathTablesRam)
}
*
/*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
库中的函数、以便利用
引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
1个等待状态)。 如果此部分未注释、则为 IQmathTables2
将被加载到其他存储器(SARAM、闪存等)中并将采用
上行空间、但0等待状态是可能的。
*
/*
IQmathTables3 :> IQTABLES3,PAGE = 0,TYPE = NOLOAD
{
IQMath.lib (IQmathTablesRam)
}
*
/*.reset 是编译器使用的标准段。 它包含*/
/* C 代码_c_int00起始地址。 /*
/*当使用引导 ROM 时,此部分和 CPU 矢量*/
/*不需要表。 因此、默认类型设置为 */
/* DSECT */
.reset :> reset, page = 0,type = DSECT
VECTORS :> VECTORS, PAGE = 0,TYPE = DSECT
}
--------------------------------------------------------------------
main.c 文件:
--------------------------------------------------------------------
#include "DSP28x_Project.h" //器件头文件和示例 include 文件
#include "Init.h"
//这些由链接器定义
ifdef 闪存
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsRunStart;
extern UINT16 RamfuncsLoadSize;
#endif
void main (void)
{
Dint;
InitSysCtrl();
ifdef 闪存
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(uint32)&RamfuncsLoadSize);
InitFlash();
#endif
InitGpio();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitCpuTimer();
InitCLA();
InitADC();
InitEPwm();
InitECAN();
InitSCI();
InitSPI();
InitI2C();
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
// Cla1ForceTask8andWait();
while (1){
}
}
--------------------------------------------------------------------
谢谢、
陈
LAUNCHXL-F28069M