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.
我设置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;
这是啥原因呢,图片上标注处有问题?
感觉现在应该对了,gusExcIndex 这个已经在变了,且是按照我设定的范围在变化,是不是JTAG调试本来就是这样的 (总是停在does not contain frame information)?但为啥ePWM6 的那个寄存器总是保持不变呢?
您好,先和您确认下:
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;
以上代码是正确的是吗?还是我这边的显示问题?
最新的代码是这样的,你忽略那些乱码,都是注释代码:
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;
(总是停在does not contain frame information)?
您好,请检查下linker命令文件并确保 CLA 数据部分 .Scratchpad PAGE = 1。
此外请参照数据表确保 ePWM 寄存器可由 CLA 写入。
"此外请参照数据表确保 ePWM 寄存器可由 CLA 写入。" 这个怎么理解?
我试过例程,这个是可以写入的,所以我坚信这个读写肯定没问题,只是我什么地方搞得不对;
通过修改一系列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 的运行,我将重新创建一个问题进行跟踪;