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.

[参考译文] TMS320F28377D:CLA 无法访问 AdcaResultRegs.ADCRESULT0中 rvalue 的成员

Guru**** 2540720 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/625737/tms320f28377d-cla-cannot-access-member-of-rvalue-at-adcaresultregs-adcresult0

器件型号:TMS320F28377D
主题中讨论的其他器件:C2000WARE

大家好、

我现在正在调试由 ADCAINT1触发的 CLA 任务。

可以成功触发 CLA 任务、但无法达到 ADC 结果。

我检查了 Code Composer Studio 的"Register"视图、只有内核寄存器和 CLA 寄存器。

以下是我的 CLA 代码:

中断 void Cla1Task1 (void)
{
_mdebugstop();
Samples.AGridVoltage = AdcaResultRegs.ADCRESULT0;
Samples.BGridVoltage = AdcbResultRegs.ADCRESULT0;
Samples.CGridVoltage = AdccResultRegs.ADCRESULT0;
Samples.UpDCVoltage = AdcaResultRegs.ADCRESULT1;
Samples.DownDCVoltage = AdcbResultRegs.ADCRESULT1;
Samples.SumDCVoltage = AdccResultRegs.ADCRESULT1;
} 

下面是 CLA 初始化代码:

void CLA_initCpu1Cla1 (void)
{
//
//计算所有 CLA 任务矢量
//在1类 CLA 上,MVECT 寄存器接受完整的16位任务地址为
//与旧的0类 CLA 上使用的偏移相对
//
EALLOW;
Cla1Regs.MVECT1 =(uint16_t)(&Cla1Task1);
Cla1Regs.MVECT2 =(uint16_t)(&Cla1Task2);
Cla1Regs.MVECT3 =(uint16_t)(&Cla1Task3);
Cla1Regs.MVECT4 =(uint16_t)(&Cla1Task4);
Cla1Regs.MVECT5 =(uint16_t)(&Cla1Task5);
Cla1Regs.MVECT6 =(uint16_t)(&Cla1Task6);
Cla1Regs.MVECT7 =(uint16_t)(&Cla1Task7);
Cla1Regs.MVECT8 =(uint16_t)(&Cla1Task8);

//
//启用 IACK 指令以在软件中启动 CLA 上的任务
//针对所有8个 CLA 任务。 此外、全局启用所有8个任务(或 A
//任务的子集),方法是在中写入它们各自的位
// MIER 寄存器
//
Cla1Regs.MCTL.bit.IACKE = 1;
Cla1Regs.MIER all = 0x00FF;

//使用ADCAINT1中断触发TASK1
DmaClaSrcSelRegs.CLA1TASSKSRCSEL1.bit.task1 = 1;
//使用ADCDINT1中断触发TASK2
DmaClaSrcSelRegs.CLA1TASSKSRCSEL1.bit.task2 = 16;

//
//为所有的任务结束中断配置向量
// 8个任务
//
PieVectTable.CLA1_1_INT =&cla1Isr1;
PieVectTable.CLA1_2_INT =&cla1Isr2;
PieVectTable.CLA1_3_INT =&cla1Isr3;
PieVectTable.CLA1_4_INT =&cla1Isr4;
PieVectTable.CLA1_5_INT =&cla1Isr5;
PieVectTable.CLA1_6_INT =&cla1Isr6;
PieVectTable.CLA1_7_INT =&cla1Isr7;
PieVectTable.CLA1_8_INT =&cla1Isr8;

//
//在组和子组级别启用 CLA 中断
//
PieCtrlRegs.PIEIER11.all = 0xFFFF;
IER |= M_INT11;

EDIS;
} 

这里是 CLA 存储器初始化代码:

void CLA_configClaMemory (void)
{
extern uint32_t Cla1ProgRunStart、Cla1ProgLoadStart、Cla1ProgLoadSize;
EALLOW;

#ifdef _FLASH
//
//将代码从闪存复制到 RAM
//
memcpy (((uint32_t *)&Cla1ProgRunStart、(uint32_t *)&Cla1ProgLoadStart、
(uint32_t)&Cla1ProgLoadSize);
#endif //_flash

//
//初始化并等待 CLA1ToCPUMsgRAM
//
MemCfgRegs.MSGxINIT.bit.init_CLA1TOCPU = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU!= 1){};

//
//初始化并等待 CPUToCLA1MsgRAM
//
MemCfgRegs.MSGxINIT.bit.init_CPUTOCLA1 = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1!= 1){};

//
//选择 LS5RAM 作为 CLA 的编程空间
//首先将 CLA 配置为 LS5的主器件,然后再配置
//将空间设置为程序块
//
MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 1;

// MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
// MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 1;

//
//接下来将 LS0RAM 和 LS1RAM 配置为 CLA 的数据空间
//首先将 CLA 配置为 LS0 (1)的主器件、然后
//将空格设置为代码块
//
// MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
// MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 0;


EDIS;
} 

非常感谢、请帮我解决问题。