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.

TMS320F28374S: 关于CLA的使用

Part Number: TMS320F28374S
Other Parts Discussed in Thread: C2000WARE, SYSCONFIG

专家好:

参考C2000Ware例程写了一个CLA的程序,使用PWM过零触发ADC,ADC转换完成后会触发CLA进行闭环计算。目前只使用到了CLA的任务1(任务2给也设置了地址,但没有设置触发方式,因此不执行)

任务1里目前是个空白函数,任务1对应的中断里,只有清除相应ACK的操作。

测试发现,只进入了1次任务1对应的中断,之后CLA寄存器的状态就变成如下

可以看到,MIFR中的INT1是置位状态,表示产生了任务请求

但不知道为啥MIOVF的INT1也被置位了,从手册看MIOVF置位了表示在MIFR为1的时候又再次受到了任务请求,不知道是否是这样理解?

那这里就有点奇怪,第一次收到MIFR任务请求的时候,应该就会进入相应的任务去执行相关操作(任务是个空白函数),之后这个MIFR应该就会被自动清除掉,因此下一次被触发的时候MIFR应该为0才对。

另外,MIRUN的INT1一直为1,表示了任务1的函数当前正在执行,可是我的任务1对应的函数是个空白函数啊,为何会这样呢?

软件配置如下:

void CLA_DSP_configClaMemory(void)
{
    extern INT32U Cla1ProgRunStart, Cla1ProgLoadStart, Cla1ProgLoadSize;
    
    #ifdef _FLASH
    // Copy over code from FLASH to RAM
    memcpy((INT32U *)&Cla1ProgRunStart, (INT32U *)&Cla1ProgLoadStart, (INT32U)&Cla1ProgLoadSize);
    #endif
    
    MemCfg_initSections(MEMCFG_SECT_MSGCLA1TOCPU);
    while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCLA1TOCPU)){};
    
    MemCfg_initSections(MEMCFG_SECT_MSGCPUTOCLA1);
    while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCPUTOCLA1)){};
    
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_DATA);
    
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_PROGRAM);
}


void CLA_DSP_initCpu1Cla1()
{

    #pragma diag_suppress=770
    
    CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_1, (uint16_t)&Cla1Task1);
    CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_ADCA1);
    
    CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_2, (uint16_t)(&Cla1Task2));
    //CLA_setTriggerSource(CLA_TASK_2, CLA_TRIGGER_ADCD1);
    
    #pragma diag_warning=770
    
    
    CLA_enableIACK(CLA1_BASE);
    
    CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_1);
    CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_2);
    
    Interrupt_register(INT_CLA1_1, &cla1Isr1);
    Interrupt_register(INT_CLA1_2, &cla1Isr2);
}

void CLA_init()
{
    CLA_DSP_configClaMemory();
    
    CLA_DSP_initCpu1Cla1();
}

任务1:

__interrupt void Cla1Task1 (void)
{

return;

}

任务1对应的中断函数:

__interrupt void cla1Isr1 ()
{

Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP11);
}

//更新后续操作现象

单步调试的时候,发现进入了任务1后,单步执行退出任务1后不知道为啥又进入了task2

任务1执行完后,单步执行下一步就进入了任务2

任务2的触发方式未做设置,按理说不应该会触发任务2吧?

想请教一下,这个是为啥呢,该如何修改?

另外,有点不明白为啥任务被触发后,还需要进一步触发相应的CLA任务中断呢?感觉不使能中断也并不影响任务的触发与执行

  • 先回答你这个问题:

    另外,有点不明白为啥任务被触发后,还需要进一步触发相应的CLA任务中断呢?感觉不使能中断也并不影响任务的触发与执行

    这个主要是用来在CLA与CPU之间做交互用,CLA任务执行完毕后通过中断的方式通知CPU,起到协同的作用;

    但不知道为啥MIOVF的INT1也被置位了,从手册看MIOVF置位了表示在MIFR为1的时候又再次受到了任务请求,不知道是否是这样理解?

    是的;

    任务1每次执行完成后,就会触发任务1中断。任务1执行的时间比任务1中断执行的时间还要短,所以任务1中断就会一直处于触发及overflow的状态。

    我建议你在例程的基础上进行修改。

  • 感谢您的回复!

    我建议你在例程的基础上进行修改。

    目前这个是在例程上修改的,只是需要将例程加入目前已有的工程文件中,所以做了简化处理。

    另外,目前例程基本都是寄存器操作形式提供的,仅有一个arccos的是用driverlib的形式提供,且其中还用到了sysconfig这种图形化配置界面,请问还有其他可以参考的以driverlib形式提供的例程吗?

    任务1执行的时间比任务1中断执行的时间还要短

    这个会有什么问题吗?假设CLA的任务触发周期是1s,任务执行时间0.1s,中断执行时间0.2s,那中断执行完毕后,清除了CLA对应的中断标志位,之后就等待0.7s直到任务继续被触发吧?没明白任务执行时间和中断执行时间长短关系有何影响

  • 例程全都在C2000ware中了;

    不好意思,之前没有看到有关触发的描述,

    假设CLA的任务触发周期是1s,任务执行时间0.1s,中断执行时间0.2s,那中断执行完毕后,清除了CLA对应的中断标志位,之后就等待0.7s直到任务继续被触发吧?

    你说的是没有问题的。

    根据你之前描述的现象来看,如果器件没有问题的话,很大可能还是触发的问题。你上传上来的代码只有内存及相关任务、中断的配置。我建议你还是从触发的角度排查一下问题。

  • 感谢回复。

    任务的触发在上面的代码中也给出来了,如下:

    CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_1, (uint16_t)&Cla1Task1);
    CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_ADCA1);

    CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_2, (uint16_t)(&Cla1Task2));
    //CLA_setTriggerSource(CLA_TASK_2, CLA_TRIGGER_ADCD1);

    是用ADCA1的中断来触发任务1,ADCD1的中断来触发任务2(测试中任务2的触发被屏蔽)

    触发应该是比较简单的配置下就行吧,不明白这里可能有啥问题,而且单步调试发现任务2的触发方式被屏蔽了,但是任务1执行完毕后就直接进入了任务2

  • ADC的速率是多少?

    硬件用的是什么板子?TI的demo板还是自己做的?

    方便直接跑一下例程看一下吗?排除一下器件方面的原因。

  • 感谢大佬回复。

    ADC速率是时钟频率/4,这个应该没问题,是参考例程里的速度来配置的,也经过了测试。

    硬件是买的第三方匹配的开发板,例程执行运行是没有问题。

    反复对比了和例程的差异,我觉得可能有以下几个方面的因素,不知道是否正确:

    1. Task的8个任务是否都需要配置,我看所有例程里都对8个同时进行了配置(虽然只用到了其中的1个task),我这里因为只用到了2个task,所以也只对这2个task进行了配置;

    2. 任务的触发。例程里的task触发都是单一的,我这里是用ADCA1的中断来触发任务1,与此同时ADCA1也会触发相应的故障信号检测对应的ISR中断。ISR中断和任务1对应中断里,都有对ADCA1的中断标志清除处理,这样是否会有可能产生冲突呢?

    是否支持一个中断触发信号同时触发ISR和任务中断呢?

  • 1.·不需要,使用哪个配置哪个即可;

    2. 不大可能。

    方便把你的工程上传上来看一下吗?

  • 感谢大佬,工程文件是在公司加密电脑上的

    仔细对比了和例程的文档区别,在cmd文件上也有点差异,不知道是不是和这个有关系

    例程里还有上面这个对CLA的存储相关配置,我的cmd里没有加入这个部分

    目前在出差,控制板不在身边,等回去了再试试看

  • 是有这个可能的,你试一下