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.

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;

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

  • 感觉现在应该对了,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 写入。

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

  • "此外请参照数据表确保 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 的运行,我将重新创建一个问题进行跟踪;