DSP28377D学习记录——(CLA配置)

前言

本项目基于TI官方例程进行学习

例程位于ti\c2000\C2000Ware_5_02_00_00\device_support\f2837xd\examples\cpu1

参考资料

TMS320F2837xD Dual-Core Microcontrollers Technical Reference Manual (第六章)

https://www.ti.com.cn/cn/lit/pdf/spruhm8?keyMatch=TMS320F2837xD%20Dual-Core%20Microcontrollers%20Technical%20Reference%20Manual

调试参考

CLA Hands On Workshop - Part 4 Debugging on the CLA | Video | TI.com

一、配置cmd文件

可直接调用ti\c2000\C2000Ware_5_02_00_00\device_support\f2837xd\common\cmd文件夹中的2837xD_RAM_CLA_lnk_cpu1.cmd文件

对cmd文件中涉及的有关CLA模块的内容稍加解释

1.文件开头定义

  定义 CLA 暂存器区域的大小

CLA_SCRATCHPAD_SIZE = 0x100;

2.MEMORY  PAGE 0中

  分配RAM用于CLA的程序空间

RAMLS4_5         : origin = 0x00A000,   length = 0x001000

3.MEMORY  PAGE 1中

(1)分配RAMLS0-5用于CLA的数据空间

RAMLS0          	: origin = 0x008000,   length = 0x000800
RAMLS1          	: origin = 0x008800,   length = 0x000800
RAMLS2      		: origin = 0x009000,   length = 0x000800
RAMLS3      		: origin = 0x009800,   length = 0x000800

(2)分配内存空间用于CLA与CPU交互

CLA1_MSGRAMLOW     : origin = 0x001480, length = 0x000080

CLA1_MSGRAMHIGH    : origin = 0x001500, length = 0x000080

4.SECTION

CLA1mathTables    : LOAD = FLASHL,             

                    RUN = RAMLS3,

                    LOAD_START(_Cla1mathTablesLoadStart),

                    LOAD_END(_Cla1mathTablesLoadEnd),

                    LOAD_SIZE(_Cla1mathTablesLoadSize),

                    RUN_START(_Cla1mathTablesRunStart),

                    PAGE = 1


Cla1Prog         : > RAMLS4_5, PAGE=0         //cla程序空间

CLADataLS0		: > RAMLS0, PAGE=1
CLADataLS1		: > RAMLS1, PAGE=1

Cla1ToCpuMsgRAM        : > CLA1_MSGRAMLOW,          PAGE = 1
CpuToCla1MsgRAM        : > CLA1_MSGRAMHIGH,         PAGE = 1

#ifdef CLA_C
   /* CLA C compiler sections */
   //
   // Must be allocated to memory the CLA has write access to
   //CLA存储临时数据
   CLAscratch       :
                     { *.obj(CLAscratch)
                     . += CLA_SCRATCHPAD_SIZE;
                     *.obj(CLAscratch_end) } >  RAMLS1,  PAGE = 1

   .scratchpad      : > RAMLS1,       PAGE = 1
   .bss_cla		    : > RAMLS1,       PAGE = 1
   .const_cla	    : > RAMLS1,       PAGE = 1
#endif //CLA_C

二、在工程项目的APP/CLA文件夹中创建include、lib、rom_symbol_libs文件夹

include中添加clamath.h

文件路径: ti\c2000\C2000Ware_2_01_00_00\libraries\math\CLAmath\c28\include

lib中添加cla1_math_library_datarom_fpu32.lib及cla1_math_library_fpu32.lib

文件路径: ti\c2000\C2000Ware_2_01_00_00\libraries\math\CLAmath\c28\lib

rom_symbol_lib中添加F2837xRevB_c1bootROM_CLADataROMSymbols_fpu32.lib

文件路径:ti\c2000\C2000Ware_2_01_00_00\libraries\boot_rom\f2837xd\rev0\rom_symbol_libs

三、修改项目属性

1.定义CLA_C=1

properties→Build→C2000 Linker→Advanced Options→Command File Prepocessing中定义CLA_C=1,如图所示

2.CPU1预定义

properties→Build→C2000 Compiler→Predefined Symbols中预定义CPU1,如图所示

四、创建cla_init.h头文件、cla_init.c初始化、cla_share.cla

cla_init.h

/*
 * cla_init.h
 *
 *  Created on: 2024年5月7日
 *      Author: cmy
 */

#ifndef APP_CLA_CLA_INIT_H_
#define APP_CLA_CLA_INIT_H_

//
// Included Files
//

#include <F28x_Project.h>
#include "F2837xD_Cla_defines.h"
#include <stdint.h>
#include <LED/LED.h>


#ifdef __cplusplus
extern "C" {
#endif


//
//Task 1 (C) Variables
//事件一交互变量
extern float fVal; //input
extern float fVal1; //
extern float fVal2; //input
extern float fResult;  //Estimated result

//
//Task 2 (C) Variables
//

//
//Task 3 (C) Variables
//

//
//Task 4 (C) Variables
//

//
//Task 5 (C) Variables
//

//
//Task 6 (C) Variables
//

//
//Task 7 (C) Variables
//

//
//Task 8 (C) Variables
//

//
//Common (C) Variables
//

//
// Function Prototypes
//
// The following are symbols defined in the CLA assembly code
// Including them in the shared header file makes them
// .global and the main CPU can make use of them.
//CLA事件
__interrupt void Cla1Task1();
__interrupt void Cla1Task2();
__interrupt void Cla1Task3();
__interrupt void Cla1Task4();
__interrupt void Cla1Task5();
__interrupt void Cla1Task6();
__interrupt void Cla1Task7();
__interrupt void Cla1Task8();


void CLA_init(void);
void CLA_configClaMemory(void);
void CLA_initCpu1Cla1(void);
void CLA_runTest(void);

#define WAITSTEP     asm(" RPT #255 || NOP")

//cla事件处理结束之后触发相应中断
__interrupt void cla1Isr1();
__interrupt void cla1Isr2();
__interrupt void cla1Isr3();
__interrupt void cla1Isr4();
__interrupt void cla1Isr5();
__interrupt void cla1Isr6();
__interrupt void cla1Isr7();
__interrupt void cla1Isr8();



#ifdef __cplusplus
}
#endif // extern "C"

#endif //end of _CLA_SQRT_SHARED_H_ definition

cla_init.c

/*
 * cla_init.c
 *
 *  Created on: 2024年5月7日
 *      Author: cmy
 */

#include <CLA/cla_init.h>


//
//Task 1 (C) Variables
// NOTE: Do not initialize the Message RAM variables globally, they will be
// reset during the message ram initialization phase in the CLA memory
// configuration routine
//将变量放置在指定的共享内存段中,以便两个模块访问
#ifdef __cplusplus
#pragma DATA_SECTION("CpuToCla1MsgRAM");
float fVal;
#pragma DATA_SECTION("Cla1ToCpuMsgRAM");
float fResult;
#else
#pragma DATA_SECTION(fVal,"CpuToCla1MsgRAM");
float fVal;
#pragma DATA_SECTION(fVal1,"CpuToCla1MsgRAM");
float fVal1;
#pragma DATA_SECTION(fVal2,"CpuToCla1MsgRAM");
float fVal2;
#pragma DATA_SECTION(fResult,"Cla1ToCpuMsgRAM");
float fResult;
#endif //__cplusplus
//float y[BUFFER_SIZE];

//
//Task 2 (C) Variables
//

//
//Task 3 (C) Variables
//

//
//Task 4 (C) Variables
//

//
//Task 5 (C) Variables
//

//
//Task 6 (C) Variables
//

//
//Task 7 (C) Variables
//

//
//Task 8 (C) Variables
//

//
//Common (C) Variables
//
uint16_t pass=0;
uint16_t fail=0;

void CLA_init(void)
{
    //EALLOW;

    CLA_configClaMemory();

    CLA_initCpu1Cla1();

    //EDIS;
}

void CLA_configClaMemory(void)
{
    extern uint32_t Cla1funcsRunStart, Cla1funcsLoadStart, Cla1funcsLoadSize;
    EALLOW;

#ifdef _FLASH
    //
    // Copy over code from FLASH to RAM
    //
    memcpy((uint32_t *)&Cla1funcsRunStart, (uint32_t *)&Cla1funcsLoadStart,
           (uint32_t)&Cla1funcsLoadSize);
#endif //_FLASH



    //
    // Initialize and wait for CLA1ToCPUMsgRAM
    //
    MemCfgRegs.MSGxINIT.bit.INIT_CLA1TOCPU = 1;//RAM初始化控制
    while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU != 1){};//=1 is done

    //
    // Initialize and wait for CPUToCLA1MsgRAM
    //
    MemCfgRegs.MSGxINIT.bit.INIT_CPUTOCLA1 = 1;
    while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1 != 1){};

    //
    // Select LS4RAM and LS5RAM to be the programming space for the CLA
    // First configure the CLA to be the master for LS4 and LS5 and then
    // set the space to be a program block
    //
    MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;//将存储器所有权分配给CLA
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 1;

    MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 1;



    //
    // Next configure LS0RAM and LS1RAM as data spaces for the CLA
    // First configure the CLA to be the master for LS0(1) and then
    // set the spaces to be code blocks
    //
    MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;

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


    EDIS;
}

void CLA_initCpu1Cla1(void)
{
    //
    // Compute all CLA task vectors
    // On Type-1 CLAs the MVECT registers accept full 16-bit task addresses as
    // opposed to offsets used on older Type-0 CLAs
    //
    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触发源设置:软件触发
    //DmaClaSrcSelRegs.CLA1TASKSRCSEL1.all=0;
    //DmaClaSrcSelRegs.CLA1TASKSRCSEL2.all=0;

    //
    // Enable the IACK instruction to start a task on CLA in software
    // for all  8 CLA tasks. Also, globally enable all 8 tasks (or a
    // subset of tasks) by writing to their respective bits in the
    // MIER register
    //
    Cla1Regs.MCTL.bit.IACKE = 1;
    Cla1Regs.MIER.all = 0x00FF;

    //
    // Configure the vectors for the end-of-task interrupt for all
    // 8 tasks
    //
    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;

    //
    // Enable CLA interrupts at the group and subgroup levels
    //
    PieCtrlRegs.PIEIER11.all = 0xFFFF;
    IER |= (M_INT11 );
}

void CLA_runTest(void)
{
    fVal = 45;

    Cla1ForceTask1andWait();
    //WAITSTEP;


#if 0
    Cla1ForceTask2andWait();
    WAITSTEP;

    Cla1ForceTask3andWait();
    WAITSTEP;

    Cla1ForceTask4andWait();
    WAITSTEP;

    Cla1ForceTask5andWait();
    WAITSTEP;

    Cla1ForceTask6andWait();
    WAITSTEP;

    Cla1ForceTask7andWait();
    WAITSTEP;
#endif
}


//
// cla1Isr1 - CLA1 ISR 1
//
__interrupt void cla1Isr1 ()
{
    //
    // Acknowledge the end-of-task interrupt for task 1
    //
    PieCtrlRegs.PIEACK.all = M_INT11;

    LED1_TOGGLE;

    //
    // Uncomment to halt debugger and stop here
    //
//    asm(" ESTOP0");
}

//
// cla1Isr1 - CLA1 ISR 2
//
__interrupt void cla1Isr2 ()
{
    asm(" ESTOP0");
}

//
// cla1Isr1 - CLA1 ISR 3
//
__interrupt void cla1Isr3 ()
{
    asm(" ESTOP0");
}

//
// cla1Isr1 - CLA1 ISR 4
//
__interrupt void cla1Isr4 ()
{
    asm(" ESTOP0");
}

//
// cla1Isr1 - CLA1 ISR 5
//
__interrupt void cla1Isr5 ()
{
    asm(" ESTOP0");
}

//
// cla1Isr1 - CLA1 ISR 6
//
__interrupt void cla1Isr6 ()
{
    asm(" ESTOP0");
}

//
// cla1Isr1 - CLA1 ISR 7
//
__interrupt void cla1Isr7 ()
{
    asm(" ESTOP0");
}

//
// cla1Isr1 - CLA1 ISR 8
//
__interrupt void cla1Isr8 ()
{
    //
    // Acknowledge the end-of-task interrupt for task 8
    //
    PieCtrlRegs.PIEACK.all = M_INT11;

    //
    // Uncomment to halt debugger and stop here
    //
//    asm(" ESTOP0");
}

//
// End of file
//

cla_share.cla


#include <CLA/cla_init.h>
#include "CLAmath.h"


extern float fVal;
extern float fResult;

__interrupt void Cla1Task1 ( void )
{
    //__mdebugstop();
    fResult = CLAsin(fVal);
    //__mdebugstop();


}

interrupt void Cla1Task2 ( void )
{
    //fResult = CLAdiv_inline(fVal1, fVal2);

}

interrupt void Cla1Task3 ( void )
{

}

interrupt void Cla1Task4 ( void )
{

}

interrupt void Cla1Task5 ( void )
{

}

interrupt void Cla1Task6 ( void )
{

}

interrupt void Cla1Task7 ( void )
{

}

interrupt void Cla1Task8 ( void )
{

}

五、CLA调试步骤

1.进入Debug模式

2.连接CPU1

3.连接CLA1

4.选中CPU1,选择Run->load->load Program,下载.out文件

5.选中CLA1,选择Run->load->load Symbols,下载.out文件

6.选中CPU1,开始运行程序

六、注意事项

1.在.cla文件中无法使用断点进行程序调试,只能使用__mdebugstop();进行中断

2.CLA模块不支持中断嵌套,所以尽量用CLA本身自带的8个任务中断;

3.CLA不支持函数指针的调用,尽量避免在CLA中调用函数指针;

4.CLA中用到sin、cos等三角函数运算时,尽量用其CLA自带的数学库

### 回答1: PSPICE 17.2 是一种用于电子电路仿真和分析的软件工具。下面是一份简单的 PSpice 17.2 使用初级教程: 1. 安装和启动:首先,你需要下载并安装 PSpice 17.2 软件。安装完成后,双击图标启动软件。 2. 创建电路:在软件界面上,选择“文件”>“新建”,然后在电路编辑器中创建你的电路。你可以从元件库中选择组件,并将其拖放到画布上。连接元件的引脚以构建电路。 3. 设置元件参数:双击元件以打开元件参数设置对话框。在对话框中,设置元件的值、名称和其他参数。对于电阻、电容等基本元件,可以直接输入数值。 4. 设置仿真配置:选择“仿真”>“设置和校验”,然后在仿真设置对话框中选择仿真的类型和参数。你可以选择直流分析、交流分析、暂态分析等。设置仿真参数后,点击“确定”。 5. 运行仿真:选择“仿真”>“运行”来启动仿真。在仿真过程中,软件将模拟电路的响应,并将结果输出到仿真波形窗口中。 6. 查看仿真结果:在仿真波形窗口中,你可以查看各个元件的电流、电压等参数随时间变化的波形。你还可以对波形进行放大、缩小、平移等操作,以更详细地分析电路的性能。 7. 保存和导出结果:在仿真过程中,你可以选择将结果保存为文件或导出为其他格式,如图像文件或数据文件。 以上是 PSpice 17.2 使用初级教程的基本步骤。随着实践的深入,你可以进一步了解复杂电路的建模和分析方法,并尝试更高级的功能和技术。 ### 回答2: PSPICE 17.2是一款电子电路仿真软件,用于对电路进行分析和验证。以下是PSPICE 17.2的使用初级教程: 1. 下载和安装:在官方网站上下载PSPICE 17.2并进行安装。 2. 组件库:打开PSPICE软件后,点击“Capture CIS”图标,进入组件库界面。选择适当的电子元件,如电阻、电容、二极管等,将它们拖放到画布上。 3. 电路连接:在画布上拖放所需元件后,使用导线工具连接它们。点击导线图标,选择合适的连接方式,并将其拖动到适当的端口上。 4. 参数设定:双击元件,弹出元件属性对话框。在这里设置元件的数值,例如电阻的阻值、电容的电容值等。 5. 电源设置:在画布上点击右键,选择“Power Sources”,然后选择适当的电源,如直流电源或交流电源。设置电源的电压或电流数值。 6. 仿真设置:点击画布上方的“PSpice”选项,选择“Edit Simulation Profile”打开仿真配置对话框。在仿真配置中,设置仿真参数,如仿真类型(直流、交流、脉冲等)、仿真时间等。 7. 仿真运行:在仿真配置对话框中点击“Run”按钮,开始进行电路仿真运行。仿真完成后,可以查看并分析仿真结果,如电流、电压、功率等。 8. 结果分析:通过菜单栏中的“PSpice>Probe”选项,打开特定信号的仿真结果。通过选择信号节点,可以显示该信号的波形、幅值和频谱等信息。 9. 数据输出:仿真结束后,可以通过“PSpice>Results”菜单栏选项,导出仿真结果到文本文件,以供后续分析。 10. 误差调整:如果仿真结果与预期不符,可以检查电路连接、元件参数等以找出问题。根据需要进行调整,重新运行仿真以验证改进效果。 以上就是PSPICE 17.2使用初级教程的简要介绍。在使用过程中,请参考软件的帮助文件和官方文档,以获取更详细的指导和解决方法。任何新的软件都需要不断的实践和尝试,希望这个教程能对你有所帮助。 ### 回答3: PSPICE 17.2是一款常用的电路仿真软件,用于电路设计和分析。下面是一个简要的PSPICE 17.2的初级教程: 1. 下载和安装:首先,从官方网站下载PSPICE 17.2,并按照安装向导进行安装。安装完成后,打开软件。 2. 创建新工程:在PSPICE 主界面上,点击“File”菜单,然后选择“New Project”来创建一个新的工程。给工程起一个适当的名字,并选择工程的存储位置。 3. 添加电路元件:在工程界面上,点击“Place”图标,然后选择不同的元件来构建你的电路。你可以从库中选择各种电子元件,如电阻、电容、电感等,并将它们拖放到工程界面上。 4. 连接元件:选择“Wire”图标,然后点击元件的引脚来连接它们。确保连接顺序正确,以保证电路的正确性。 5. 设置元件参数:对于每个添加的元件,你需要设置它们的参数。右键点击元件,选择“Edit Propertiess”,然后在弹出的窗口中输入适当的参数值。 6. 添加电源:在电路中添加电源,以提供电路所需的电能。选择“Place”图标,然后选择合适的电源元件并将其拖放到电路中。同样,设置电源的参数值。 7. 设置仿真配置:在工程界面上,点击“PSpice”菜单,然后选择“Edit Simulation Profile”来设置仿真配置参数。你可以选择仿真类型、仿真时间和仿真步长等。 8. 运行仿真:点击“PSpice”菜单,选择“Run”来运行仿真。PSPICE将自动运行仿真并显示结果。 9. 分析和优化:根据仿真结果,可以分析和优化电路的性能。你可以观察电流、电压和功率等参数,以评估电路的性能,并根据需要进行调整。 10. 保存和导出结果:在分析和优化完成后,可以保存你的工程并导出结果。点击“File”菜单,选择“Save Project”来保存工程,然后选择“Outut”菜单,选择“Export”来导出结果。 以上是PSPICE 17.2的初级教程的简要介绍。通过以上步骤,你可以开始使用PSPICE 17.2进行电路设计和仿真。在实践中不断探索和学习,你将成为一个熟练的PSPICE用户。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值