本文主要是介绍4. CLA(可编程控制律加速器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
4.1 CLA介绍
CLA 是一款独立的 32 位浮点处理器,运行速度与主CPU 相同。该 CLA 对外设触发器作出响应,并与主 C28x CPU 同时执行代码。这种并行处理功能可以有效地将实时控制系统的计算性能提高一倍。通过利用 CLA 为时间关键型功能提供服务,主 C28x CPU 可以自由地执行其他任务,如通信和诊断。
4.2 触发机制
CLA程序代码可包含多大8个任务或中断服务程序,每个任务有两种触发机制,主CPU触发和外设中断信号触发。
主CPU触发:C28x CPU通过IACK指令来触发任务执行,可以通过主CPU软件控制。
外设中断触发:来自连接到共享总线的外设的多达256个可能的触发源,CLA在共享总线上承担次要所有权。
4.3 CLA与CPU的消息RAM
CLA和CPU之间有两个内存块用于数据共享和通信。消息RAM总是映射到CPU和CLA内存空间,并且只允许数据访问;不能执行任何程序获取。
CLA to CPU Message RAM:CLA可以使用这个块将数据传递给CPU。该块可由CLA读取和写入。该块可由CPU读取,但CPU的写入被忽略。
CPU to CLA Message RAM:CPU可以使用该块向CLA传递数据和消息。这个消息RAM是CPU可读可写的。CLA可以执行读取,但CLA的写入将被忽略
4.4 CLA配置过程
4.4.1 CMD文件
4.3小节中讲到两个消息RAM,需要配置RAM作为CLA与主CPU进行数据通讯的RAM空间,CLA1_MSGRAMLOW和CLA1_MSGRAMHIGH用于存放交互数据。将两个块放在CMD文件的page1中。
CLA1_MSGRAMLOW : origin = 0x001200, length = 0x000080
CLA1_MSGRAMHIGH : origin = 0x001280, length = 0x000080
到SECTION块为CLA块分配地址,对应空间为PAGE中分配的CLA空间。
Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, PAGE = 1
CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, PAGE = 1
RAMLS0和RAMLS1作为CLA的代码存储空间和数据存放空间。
Cla1Data : > RAMLS0, PAGE=1
Cla1Prog : LOAD = FLASH_APP,
RUN = RAMLS1,
LOAD_START(_Cla1funcsLoadStart),
LOAD_END(_Cla1funcsLoadEnd),
RUN_START(_Cla1funcsRunStart),
LOAD_SIZE(_Cla1funcsLoadSize),
PAGE = 0, ALIGN(4)
CLAscratch :
{ *.obj(CLAscratch)
. += CLA_SCRATCHPAD_SIZE;
*.obj(CLAscratch_end) } > RAMLS0, PAGE = 1
.scratchpad : > RAMLS0, PAGE = 1
bss_cla : > RAMLS0, PAGE = 1
const_cla : LOAD = FLASH_APP,
RUN = RAMLS1,
RUN_START(_Cla1ConstRunStart),
LOAD_START(_Cla1ConstLoadStart),
LOAD_SIZE(_Cla1ConstLoadSize),
PAGE = 0
4.4.2 程序配置步骤
(1)使能CLA的时钟,此为系统初始化函数,使能所有外设时钟。
InitSysCtrl();
(2)初始化CLA:
//开始RAM初始化
MemCfgRegs.MSGxINIT.bit.INIT_CLA1TOCPU = 1;
while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU != 1){};
MemCfgRegs.MSGxINIT.bit.INIT_CPUTOCLA1 = 1;
while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1 != 1){};
//初始化LS0和LS1并选择两个作为CLA和CPU的共享RAM
MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
(3)配置CLA每个任务的向量地址,将程序代码搬移到CLA的RAM中运行。
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);
/*数据的初始化工作和函数需要在程序启动后主动运行一次,因此在配置CLA时,使能CLA应答IACK,并且强行执行一次CLA任务。*/
Cla1Regs.MCTL.bit.IACKE = 1; //Enable the IACK instruction
Cla1Regs.MIER.all = (M_INT1 | M_INT8); //使能Task1、Task8
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;
PieCtrlRegs.PIEIER11.all = 0xFFFF;
IER |= (M_INT11 ); //PIE中断11组全部使能
EDIS;
(4)中断程序编写
__interrupt void cla1Isr1 ()
{
EPwm12Regs.ETCLR.bit.INT = 1; //清除中断标志,以便接收新的中断
PieCtrlRegs.PIEACK.all = M_INT11;
}
/*因为在程序中使能了Task1和8和PIE中断11组全部。CLA中断1清除标志位,在Task8中进行函数处理,我使用的是CPU触发,命令为Cla1ForceTask8(),放在定时器中断里,位置不限定,自己想放哪里放哪里*/
__interrupt void Cla1Task8 ( void )
{
Control_Task_RealTimeDone();//此处为自定义功能
}
4.4.3 CLA程序映射
注意CLA中使用的数据进行声明时,需要存放在CLA映射的RAM区域中。例如:
#pragma CODE_SECTION(Control_Task_RealTimeDone,"Cla1Prog");
void Control_Task_RealTimeDone(void)
{
//自定义功能
}
#pragma CODE_SECTION(Control_PWMControl,"Cla1Prog");
void Control_PWMControl(void)
{
//自定义功能
}
因为这一节涉及到CMD文件,下一节准备学习CMD文件。
这篇关于4. CLA(可编程控制律加速器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!