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

TMS320F28374S: 关于CLA的使用

Part Number:TMS320F28374SOther 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 RAMmemcpy((INT32U *)&Cla1ProgRunStart, (INT32U *)&Cla1ProgLoadStart, (INT32U)&Cla1ProgLoadSize);#endifMemCfg_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=770CLA_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=770CLA_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任务中断呢?感觉不使能中断也并不影响任务的触发与执行

Yale Li:

先回答你这个问题:

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

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

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

是的;

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

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

,

user980814:

感谢您的回复!

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

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

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

Yale Li said:任务1执行的时间比任务1中断执行的时间还要短

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

,

Yale Li:

例程全都在C2000ware中了;

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

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

你说的是没有问题的。

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

,

user980814:

感谢回复。

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

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

,

Yale Li:

ADC的速率是多少?

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

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

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28374S: 关于CLA的使用
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1