TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28069: 调用CLA 改写ePWM6 寄存器 不成功

Part Number:TMS320F28069

我设置ePWM 6 来触发CLA1 运行改写ePWM6 寄存器,看样子触发CLA 是成功的,但寄存器貌似没有改写:

我CLA的初始化如下:

EALLOW;
// Cla1Regs.MVECT1 = (Uint16) ((Uint32)&Cla1Task1 – (Uint32)&Cla1Prog_Start);
// Cla1Regs.MVECT2 = (Uint16) ((Uint32)&Cla1Task2 – (Uint32)&Cla1Prog_Start);
// Cla1Regs.MVECT3 = (Uint16) ((Uint32)&Cla1Task3 – (Uint32)&Cla1Prog_Start);
// Cla1Regs.MVECT4 = (Uint16) ((Uint32)&Cla1Task4 – (Uint32)&Cla1Prog_Start);
// Cla1Regs.MVECT5 = (Uint16) ((Uint32)&Cla1Task5 – (Uint32)&Cla1Prog_Start);
Cla1Regs.MVECT6 = (Uint16) ((Uint32)&Cla1Task6 – (Uint32)&Cla1Prog_Start);

//涓柇婧愯锟?
// Cla1Regs.MPISRCSEL1.bit.PERINT1SEL = CLA_INT1_ADCINT1;
// Cla1Regs.MPISRCSEL1.bit.PERINT2SEL = CLA_INT2_ADCINT2;
// Cla1Regs.MPISRCSEL1.bit.PERINT3SEL = CLA_INT3_ADCINT3;
// Cla1Regs.MPISRCSEL1.bit.PERINT4SEL = CLA_INT4_ADCINT4;
Cla1Regs.MPISRCSEL1.bit.PERINT6SEL = CLA_INT6_EPWM6INT;

//鎷疯礉CLA绋嬪簭
//memcpy(&Cla1funcsRunStart, &Cla1funcsLoadStart, (Uint32)&Cla1funcsLoadSize);
memCopy(&Cla1funcsLoadStart, &Cla1funcsLoadEnd, &Cla1funcsRunStart);

Cla1Regs.MMEMCFG.bit.PROGE = 1;

//浣胯兘杞欢涓柇
// Cla1Regs.MCTL.bit.IACKE = 1;
//浣胯兘6涓猅ASK
// Cla1Regs.MIER.all = (M_INT1 | M_INT2 | M_INT3 | M_INT4 | M_INT5 | M_INT6);
Cla1Regs.MIER.all = M_INT6;

//鏄犲皠绌洪棿
EALLOW;
Cla1Regs.MMEMCFG.all = CLA_PROG_ENABLE | CLARAM2_ENABLE ; //| CLA_RAM2CPUE;
// Cla1Regs.MCTL.bit.IACKE = 1;
EDIS;

这是啥原因呢,图片上标注处有问题?

user6049953:

感觉现在应该对了,gusExcIndex 这个已经在变了,且是按照我设定的范围在变化,是不是JTAG调试本来就是这样的 (总是停在does not contain frame information)?但为啥ePWM6 的那个寄存器总是保持不变呢?

,

Cherry Zhou:

您好我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!

,

Cherry Zhou:

您好,先和您确认下:

user6049953 说:

EALLOW; // Cla1Regs.MVECT1 = (Uint16) ((Uint32)&Cla1Task1 – (Uint32)&Cla1Prog_Start); // Cla1Regs.MVECT2 = (Uint16) ((Uint32)&Cla1Task2 – (Uint32)&Cla1Prog_Start); // Cla1Regs.MVECT3 = (Uint16) ((Uint32)&Cla1Task3 – (Uint32)&Cla1Prog_Start); // Cla1Regs.MVECT4 = (Uint16) ((Uint32)&Cla1Task4 – (Uint32)&Cla1Prog_Start); // Cla1Regs.MVECT5 = (Uint16) ((Uint32)&Cla1Task5 – (Uint32)&Cla1Prog_Start); Cla1Regs.MVECT6 = (Uint16) ((Uint32)&Cla1Task6 – (Uint32)&Cla1Prog_Start);

//涓柇婧愯锟? // Cla1Regs.MPISRCSEL1.bit.PERINT1SEL = CLA_INT1_ADCINT1; // Cla1Regs.MPISRCSEL1.bit.PERINT2SEL = CLA_INT2_ADCINT2; // Cla1Regs.MPISRCSEL1.bit.PERINT3SEL = CLA_INT3_ADCINT3; // Cla1Regs.MPISRCSEL1.bit.PERINT4SEL = CLA_INT4_ADCINT4; Cla1Regs.MPISRCSEL1.bit.PERINT6SEL = CLA_INT6_EPWM6INT;

//鎷疯礉CLA绋嬪簭 //memcpy(&Cla1funcsRunStart, &Cla1funcsLoadStart, (Uint32)&Cla1funcsLoadSize); memCopy(&Cla1funcsLoadStart, &Cla1funcsLoadEnd, &Cla1funcsRunStart);

Cla1Regs.MMEMCFG.bit.PROGE = 1;

//浣胯兘杞欢涓柇 // Cla1Regs.MCTL.bit.IACKE = 1; //浣胯兘6涓猅ASK // Cla1Regs.MIER.all = (M_INT1 | M_INT2 | M_INT3 | M_INT4 | M_INT5 | M_INT6); Cla1Regs.MIER.all = M_INT6;

//鏄犲皠绌洪棿 EALLOW; Cla1Regs.MMEMCFG.all = CLA_PROG_ENABLE | CLARAM2_ENABLE ; //| CLA_RAM2CPUE; // Cla1Regs.MCTL.bit.IACKE = 1; EDIS;

以上代码是正确的是吗?还是我这边的显示问题?

,

user6049953:

最新的代码是这样的,你忽略那些乱码,都是注释代码:

EALLOW; // Cla1Regs.MVECT1 = (Uint16) ((Uint32)&Cla1Task1 – (Uint32)&Cla1Prog_Start); // Cla1Regs.MVECT2 = (Uint16) ((Uint32)&Cla1Task2 – (Uint32)&Cla1Prog_Start); // Cla1Regs.MVECT3 = (Uint16) ((Uint32)&Cla1Task3 – (Uint32)&Cla1Prog_Start); // Cla1Regs.MVECT4 = (Uint16) ((Uint32)&Cla1Task4 – (Uint32)&Cla1Prog_Start); // Cla1Regs.MVECT5 = (Uint16) ((Uint32)&Cla1Task5 – (Uint32)&Cla1Prog_Start); Cla1Regs.MVECT6 = (Uint16) ((Uint32)&Cla1Task6 – (Uint32)&Cla1Prog_Start);

//涓柇婧愯锟? // Cla1Regs.MPISRCSEL1.bit.PERINT1SEL = CLA_INT1_ADCINT1; // Cla1Regs.MPISRCSEL1.bit.PERINT2SEL = CLA_INT2_ADCINT2; // Cla1Regs.MPISRCSEL1.bit.PERINT3SEL = CLA_INT3_ADCINT3; // Cla1Regs.MPISRCSEL1.bit.PERINT4SEL = CLA_INT4_ADCINT4; Cla1Regs.MPISRCSEL1.bit.PERINT6SEL = CLA_INT6_EPWM6INT;

//鎷疯礉CLA绋嬪簭 //memcpy(&Cla1funcsRunStart, &Cla1funcsLoadStart, (Uint32)&Cla1funcsLoadSize); memCopy(&Cla1funcsLoadStart, &Cla1funcsLoadEnd, &Cla1funcsRunStart);

Cla1Regs.MMEMCFG.bit.PROGE = 1;

//浣胯兘杞欢涓柇 // Cla1Regs.MCTL.bit.IACKE = 1; //浣胯兘6涓猅ASK // Cla1Regs.MIER.all = (M_INT1 | M_INT2 | M_INT3 | M_INT4 | M_INT5 | M_INT6); Cla1Regs.MIER.all = M_INT6;

//鏄犲皠绌洪棿 EALLOW; // Cla1Regs.MMEMCFG.all = CLA_PROG_ENABLE | CLARAM2_ENABLE ; //| CLA_RAM2CPUE; Cla1Regs.MCTL.bit.IACKE = 1; EDIS;

,

Cherry Zhou:

好的感谢您提供的信息,有答复尽快给到您哈。

,

Cherry Zhou:

user6049953 说:(总是停在does not contain frame information)?

您好,请检查下linker命令文件并确保 CLA 数据部分 .Scratchpad PAGE = 1。

此外请参照数据表确保 ePWM 寄存器可由 CLA 写入。

,

user6049953:

Scratchedpad 是干什么的?我应该知道原因,是由于数据位宽的问题,正在尝试

,

user6049953:

"此外请参照数据表确保 ePWM 寄存器可由 CLA 写入。" 这个怎么理解?

我试过例程,这个是可以写入的,所以我坚信这个读写肯定没问题,只是我什么地方搞得不对;

,

user6049953:

通过修改一系列CLA 所在工程的位宽定义问题,通过CLA Task 对EPwm6Regs.CMPA.half.CMPA 执行修改操作,看样子是成功了,

CLA 要求:typedef unsigned short Uint16;typedef unsigned long Uint32;

而C2000 CPU :

typedef unsigned long Uint32;typedef unsigned int Uint16;

参考这个:

CLA中对于int类型会解析为32bits数据,而CPU会解析为16bits数据,从而可能导致CPU从CLA中取数的时候会导致错误;

processors.wiki.ti.com/…/C2000_CLA_C_Compiler 

不是说CLA 是独立与CPU 运行的吗?

但貌似不是这样啊,CPU 运行时间会影响CLA 的运行,我将重新创建一个问题进行跟踪;

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28069: 调用CLA 改写ePWM6 寄存器 不成功
分享到: 更多 (0)