28035 CLA SinPU 函数 在线仿真时能正常工作
为什么在FLASH模式下就不能工作?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
MemCopy(&Cla1funcsLoadStart, &Cla1funcsLoadEnd, &Cla1funcsRunStart);
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
{
// This function will copy the specified memory contents from
// one location to another.
//
// Uint16 *SourceAddr Pointer to the first word to be moved
// SourceAddr < SourceEndAddr
// Uint16* SourceEndAddr Pointer to the last word to be moved
// Uint16* DestAddr Pointer to the first destination word
//
// No checks are made for invalid memory locations or that the
// end address is > then the first start address.
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}
这个函数有什么问题?没看出来
peter,
将问题描述再细化一点,比如不能工作是指该函数不能工作而已,其他功能比如GPIO,PWM等模块是否正常?
另外你在仿真的时候用的CMD文件跟在Flash时用的CMD文件是一样的吗?
还有,你将L0~L3 RAM存储模块,你是如何分配,有没有分配给CLA的RAM,却在CMD中仍映射到CPU的某些段中。
Cla1Regs.MMEMCFG.bit.RAM0E = CLARAM0_ENABLE;
Cla1Regs.MMEMCFG.bit.RAM1E = CLARAM1_ENABLE;
Eric
其他函数都能正常工作,CMD文件用的是同一个,
Cla1Regs.MMEMCFG.bit.PROGE = SETDAT; // Configure the RAM as CLA program memory
Cla1Regs.MMEMCFG.bit.RAM0E = CLEARDAT; // configure RAM L1, F28035 as CPU RAM
Cla1Regs.MMEMCFG.bit.RAM1E = SETDAT; // Configure RAM L2, F28035 as CLA data memory 1
我觉得CLA 配置文件应该没有问题
详细情况如下
VacAngle += 0.019635;
SinWave = CLAsin(VacAngle);
以上两行代码都是在CLA1TASK1中运行,
在仿真模式下,我通过RS485通讯分别把这两个值发出来,VacAngle 变化,SinWave 变化
在FLASH模式下,我通过RS485通讯分别把这两个值发出来,VacAngle 变化,SinWave 等于0
CMD文件
_Cla1Prog_Start = _Cla1funcsRunStart;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start
MEMORY
{
/*Program Space*/
PAGE 0:
RAML0 : origin = 0x008000, length = 0x000C00 /* on-chip RAM (L0+CLARAM0), previous RAML0 : origin = 0x008000, length = 0x000800 */
RAML3 : origin = 0x009000, length = 0x001000 /* data RAM (L3) */
OTP : origin = 0x3D7800, length = 0x000400 /* on-chip OTP */
FLASHH : origin = 0x3E8000, length = 0x002000 /* on-chip FLASH */
FLASHG : origin = 0x3EA000, length = 0x002000 /* on-chip FLASH */
FLASHF : origin = 0x3EC000, length = 0x002000 /* on-chip FLASH */
FLASHE : origin = 0x3EE000, length = 0x002000 /* on-chip FLASH */
FLASHD : origin = 0x3F0000, length = 0x002000 /* on-chip FLASH */
FLASHC : origin = 0x3F2000, length = 0x002000 /* on-chip FLASH */
FLASHA : origin = 0x3F5000, length = 0x002F80 /* on-chip FLASH ,previous FLASHA : origin = 0x3F6000, length = 0x001F80 */
CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */
BEGIN : origin = 0x3F7FF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */
CSM_PWL : origin = 0x3F7FF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */
IQTABLES : origin = 0x3FE000, length = 0x000B50 /* IQ Math Tables in Boot ROM */
IQTABLES2 : origin = 0x3FEB50, length = 0x00008C /* IQ Math Tables in Boot ROM */
IQTABLES3 : origin = 0x3FEBDC, length = 0x0000AA /* IQ Math Tables in Boot ROM */
BOOTROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */
RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */
VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */
/*Data Space*/
PAGE 1 :
BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */
RAMM0M1 : origin = 0x000050, length = 0x0007B0// length = 0x0007B0 /* on-chip RAM block M0 and M1 ,Steven 2012.09.26*/
CLARAM1 : origin = 0x008C00, length = 0x000400 /* on-chip RAM block L2,prevous origin = 0x008E00, length = 0x000200 */
CLA_CPU_MSGRAM : origin = 0x001480, length = 0x000080 /* CLA-R/W, CPU-R message RAM */
CPU_CLA_MSGRAM : origin = 0x001500, length = 0x000080 /* CPU-R/W, CLA-R message RAM */
FLASHB : origin = 0x3F4000, length = 0x001000 /* on-chip FLASH */
}
SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHA, PAGE = 0
.pinit : > FLASHA, PAGE = 0
.text : > FLASHA, PAGE = 0
codestart : > BEGIN PAGE = 0
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
Cla1Prog : LOAD = FLASHC, /* Note for running from RAM the load and RUN can be the same */
RUN = RAML3,
LOAD_START(_Cla1funcsLoadStart),
LOAD_END(_Cla1funcsLoadEnd),
RUN_START(_Cla1funcsRunStart),
PAGE = 0
csmpasswds : > CSM_PWL PAGE = 0
csm_rsvd : > CSM_RSVD PAGE = 0
/* Allocate uninitalized data sections: */
// .stack : > RAMM0, PAGE = 1
// .ebss : > RAMM1, PAGE = 1
.stack : > RAMM0M1, PAGE = 1 //Steven 2012.9.26 combine RAMM0 and RAMM1
.ebss : > RAMM0M1, PAGE = 1
// .esysmem : > RAMM1, PAGE = 1
.esysmem : > RAMM0M1, PAGE = 1 //Steven 2012.9.26 combine RAMM0 and RAMM1
/* Initalized sections go in Flash */
/* For SDFlash to program these, they must be allocated to page 0 */
.econst : > FLASHA PAGE = 0
.switch : > FLASHA PAGE = 0
/* Allocate IQ math areas: */
IQmath : > FLASHD PAGE = 0 /* Math Code */
IQmathTables : > IQTABLES PAGE = 0, TYPE = NOLOAD /* Math Tables In ROM */
Cla1ToCpuMsgRAM : > CLA_CPU_MSGRAM PAGE = 1
CpuToCla1MsgRAM : > CPU_CLA_MSGRAM PAGE = 1
/*ClaDataRam0 : > CLARAM0, PAGE = 1 */
ClaDataRam1 : > CLARAM1, PAGE = 1
CLAmathTables : > CLARAM1, PAGE = 1
CLA1mathTables : > CLARAM1, PAGE = 1
//
// Must be allocated to memory the CLA has write access to
//
CLAscratch :
{ *.obj(CLAscratch)
. += CLA_SCRATCHPAD_SIZE;
*.obj(CLAscratch_end) } > CLARAM1, PAGE = 1 /*Previous CLARAM0*/
.reset : > RESET, PAGE = 0, TYPE = DSECT
vectors : > VECTORS PAGE = 0, TYPE = DSECT
/* Uncomment the section below if calling the IQNexp() or IQexp()
functions from the IQMath.lib library in order to utilize the
relevant IQ Math table in Boot ROM (This saves space and Boot ROM
is 1 wait-state). If this section is not uncommented, IQmathTables2
will be loaded into other memory (SARAM, Flash, etc.) and will take
up space, but 0 wait-state is possible.
*/
/*
IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD
{
IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)
}
*/
/* Uncomment the section below if calling the IQNasin() or IQasin()
functions from the IQMath.lib library in order to utilize the
relevant IQ Math table in Boot ROM (This saves space and Boot ROM
is 1 wait-state). If this section is not uncommented, IQmathTables2
will be loaded into other memory (SARAM, Flash, etc.) and will take
up space, but 0 wait-state is possible.
*/
/*
IQmathTables3 : > IQTABLES3, PAGE = 0, TYPE = NOLOAD
{
IQmath.lib<IQNasinTable.obj> (IQmathTablesRam)
}
*/
}
CLA初始化文件
void CLA_C_Init(void)
{
EALLOW;
Cla1Regs.MVECT1 = ((Uint16)Cla1Task1 - (Uint16)&Cla1Prog_Start);
Cla1Regs.MVECT8 = ((Uint16)Cla1Task8 - (Uint16)&Cla1Prog_Start);
MemCopy(&Cla1funcsLoadStart, &Cla1funcsLoadEnd, &Cla1funcsRunStart);
asm(" RPT #3 || NOP");
Cla1Regs.MMEMCFG.bit.PROGE = 1; // Configure the RAM as CLA program memory
Cla1Regs.MMEMCFG.bit.RAM0E = 0; // configure RAM L1, F28035 as CPU RAM
Cla1Regs.MMEMCFG.bit.RAM1E = 1; // Configure RAM L2, F28035 as CLA data memory 1
// Enable the IACK instruction to start a task
// Enable the CLA interrupt 8 and interrupt 1
asm(" RPT #3 || NOP");
Cla1Regs.MCTL.bit.IACKE = 1;
Cla1Regs.MIER.all = M_INT8;
Cla1ForceTask8();
EDIS;
}
CLA_C_Init();
EALLOW;
Cla1Regs.MPISRCSEL1.bit.PERINT1SEL = (Uint16)CLA_INT1_ADCINT1 ; // 0=ADCINT1 1=none 2=EPWM1INT
Cla1Regs.MIER.all = (Uint16)M_INT1;
asm(" RPT #3 || NOP");
EDIS;
Main 函数先初始化后启动CLA功能的,
还有确定CLA功能已经在运行,只是CLAsin 函数有问题,其他库函数就没问题