主题中讨论的其他器件:C2000WARE
你(们)好。
我正在尝试熟悉用于28733D 的 CLA、并在文档"C2000微控制器研讨会、版本6.1、2015年5月"中建议我尝试使用 Lab9。
我尝试完成了此练习、我想检查我所做的是不是正确的、因为此练习需要用户决定一些输入。
该教程显示(第页的 9-19、第6点):
按照本实验练习的目标中所述、编辑 cla_9.c 来执行 CLA 操作。 将 RAMLS0、RAMLS1、RAMLS2和 RAMLS4存储块设置为 CPU 和 CLA 之间共享的存储器块。 这就是我所做的(在 CLA_9.c 上):
//--内存配置--主 CPU 和 CLA 选择 MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1; // 0=CPU 1=CPU 和 CLA //设置 RAMLS0、RAMLS1、RAMLS2和 RAMLS4 MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1; // 0=CPU 1=CPU 1=CPU 和 CLA //内存块作为 CPU 和 CLA MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1; // 0=CPU 1=CPU 和 CLA MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 0; // 0=CPU 1=CPU 和 CLA MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1; // 0=CPU 1=CPU 和 CLA MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 0; // 0=CPU 1=CPU 1=CPU 和 CLA
将 RAMLS4存储器块配置为映射到 CLA 程序存储器空间。 将 RAMLS0、RAMLS1和 RAMLS2存储块配置为映射到 CLA 数据存储器空间。 请注意、RAMLS0内存块将用于 CLA C 编译器暂存区。
//--内存配置-- CLA 数据内存和 CLA 程序内存选择 MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;// 0 = CLA 数据存储器1=CLA 程序存储器 MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;// 0 = CLA 数据存储器1 = CLA 程序存储器 MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 0;// 0 = CLA 数据存储器1 = CLA 程序存储器 MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 0;// 0 = CLA 数据存储器1 = CLA 程序存储器 MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 1;// 0 = CLA 数据存储器1 = CLA 程序存储器配置要映射到 CLA 程序存储器空间的 RAMLS4存储器块 MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 0;// 0 = CLA 数据存储器1 = CLA 程序存储器
将任务1外设中断源设定为 ADCAINT1并将其它任务外设中断源输入设定为"软件"(即无)。
//--选择任务中断源 /***** 每个任务的触发源(保留未列出的数字)**** / DmaClaSrcSelRegs.CLA1TASSKSRCSEL1.bit.task1 = 1;// 0 =无 8=ADCBINT3 16=ADCDINT1 32=XINT4 42=EPWM7INT 70=TINT2 78=ECAP4INT 95=SD1INT // 114=SPIRXINTC DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.task2 = 0;// 1=ADCAINT1 9=ADCBINT4 17=ADCDINT2 33=XINT5 43=EPWM8INT 71=MXEVTA 79=ECAP5INT 96=SD2INT DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK3 = 0;// 2=ADCAINT2 10=ADCBEVT 18=ADCDINT3 36=EPWM1INT 44=EPWM9INT 72=MREVTA 80=ECAP6INT 107=UPP1INT DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK4 = 0;// 3=ADCAINT3 11=ADCCINT1 19=ADCDINT4 37=EPWM2INT 45=EPWM10INT 73=MXEVTB 83=EQEP1INT 109=SPITXINTA DmaClaSrcSelRegs.CLA1TASSKSRCSEL2.bit.TASK5 = 0;// 4=ADCAINT4 12=ADCCINT2 20=ADCDEVT 38=EPWM3INT 46=EPWM11INT 74=MREVTB 84=EQEP2INT 110=SPIRXINTA DmaClaSrcSelRegs.CLA1TASKSRCSEL2.bit.TASK6 = 0;// 5=ADCAEVT 13=ADCCINT3 29=XINT1 39=EPWM4INT 47=EPWM12INT 75=ECAP1INT 85=EQEP3INT 111=SPITXINTB DmaClaSrcSelRegs.CLA1TASKSRCSEL2.bit.TASK7 = 0;// 6=ADCBINT1 14=ADCCINT4 30=XINT2 40=EPWM5INT 48=TINT0 76=ECAP2INT 87=HRCAP1INT 112=SPIRXINTB DmaClaSrcSelRegs.CLA1TASKSRCSEL2.bit.TASK8 = 0;// 7=ADCBINT2 15=ADCCEVT 31=XINT3 41=
启用 CLA 任务1中断。 启用 IACK 指令来触发任务、
//--启用使用软件启动任务(IACK) Cla1Regs.MCTL.bit.IACKE = 1; //启用 IACKE 使用软件启动任务
//--启用 CLA 任务中断
Cla1Regs.MIER 位。INT1=1; //启用 CLA 中断1 (并禁用中断8)
asm (" EDIS"); //禁用 EALLOW 受保护寄存器访问
然后启用任务8中断。
//--强制一次性初始化任务8 --零延迟缓冲器
Cla1Regs.MIER 位.INT8 = 1; //启用 CLA 中断8
asm (" IACK #0x0080"); // IACK - CLA 任务组指令
asm (" RPT #3 || NOP"); //等待至少4个周期
while (Cla1Regs.MIRUN.bit.INT8 = 1);//循环直到任务完成
在 Main_9.c 中、我注释掉了 InitDMA();并添加了 InitCla();如下所示:
void main (void) { //--- CPU 初始化 InitSysCtrl();//初始化 CPU (文件:sysctrl.c) InitGpio();//初始化共享 GPIO 引脚(文件:gpio.c) InitXbar ();//初始化输入、输出和 ePWM X-Bar (文件:Xbar.PIC.c) ;初始化文件:InitWatchdog (tchdog)//初始化 tchdog (tchdog) Watchdog.c) //--初始化 CLA (Leo) InitCla (); //--外设初始化 InitAdca ();//初始化 ADC-A (文件:ADC.c) InitDacb (); //初始化 DAC-B (文件:dac.c) InitEPwm ();//初始化 ePWM (文件:ePWM.c) InitECap ();//初始化 ECAP (文件:eap.c) //InitDma ();//初始化 DMA (文件:dma.c) ...
在 cla_9.c 中、我添加了以下代码、以便遵循第页上的第11条指令。 9-20 (修改 CLA_9.c 的末尾以执行以下操作:
-在 PIE 中启用“CLA1_1”中断(提示:使用 PieCtrlRegs 结构)
-在 IER 寄存器中启用相应的内核中断
)
//--启用 CLA 中断 EALLOW; IER |= M_INT11;//在 PIE 组#11中启用 CLA 任务1 PieCtrlRegs.PIEIER11.bit.INTx1 =1; //在 IER 中启用 INT11以启用 PIE 组11 EDIS; }// InitCla()结束
此外、这是属性窗口(我在"Linker command file"下拉菜单中使用了 Lab_9.cmd):
虽然这是我的项目中的文件列表(包含 F2837xD_Headers_nonBIOS_CPU1.cmd 和 Lab_9.cmd 是否正确?):
当我构建和调试 Lab9项目时、看起来 CLA1已断开连接
但是、当我运行该项目时、它看起来是正常工作的、因为缓冲区 AdcBufFilertering 和 AdcBuf 会不断更新:
图形还可以正确显示结果:
问题是我上面报告的代码修改是否正确、即我是否根据练习要求修改了代码? 此外、CPU1_CLA1在调试窗口中显示为"已断开连接"是否正确?
非常感谢你的帮助。
Leo