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.

[参考译文] CCS/TMS320F28377S:TMS320F28377S

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

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/967942/ccs-tms320f28377s-tms320f28377s

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

工具/软件:Code Composer Studio

大家好、我正在调试 CLA_fir32_cpu01示例。 我遵循以下说明:
 我没有执行以下步骤:
  • 启动调试会话后、调试视图(CCS 内的窗口)将包含 C28x 和 CLA 的条目
我有一个常规视图、其中没有 CLA 条目
  • 单击 CLA 会更改 CCS 中所有窗口的上下文以反映 CLA 数据。
我应该单击哪个 CLA 实体、fir。cla 文件(这是我拥有的唯一一个具有 CLA 的实体)?
  • 从调试角度连接到 CLA 内核可实现单步执行
通过单击"Debug Probe/CPU1_CLA1即可完成此操作
·       从 Target 菜单选项中将程序符号载入 CLA 以开始调试
无法访问图片中的任何目标菜单
调试 CLA 代码
1.    在 CLA 代码中插入断点
·       _mdebugstop()内在函数是 CLA 断点。 它会将指令 MDEBUGSTOP 放置在汇编的该位置。
·       如果未连接到 CLA 内核(即禁用单步执行)、则内在函数的行为为 MNOP (无操作)
断点被插入到第82行的 cla_fir32_cpu01示例中。

2.     启动任务:CLA 将执行代码、直到 MDEBUGSTOP 位于 D2中

当我单击"Run"时、会显示此错误消息
CPU1_CLA1:无法运行目标 CPU:(错误-2060 @ 0x0)在器件运行时无法完成请求的操作。 停止器件、然后重试此操作。 (仿真包9.2.0.1.00046)

谢谢、Vadim
大家好、我正在调试 CLA_fir32_cpu01示例。 我遵循以下说明:
 我没有执行以下步骤:
  • 启动调试会话后、调试视图(CCS 内的窗口)将包含 C28x 和 CLA 的条目
我有一个单一视图、没有 CLA 条目
  • 单击 CLA 会更改 CCS 中所有窗口的上下文以反映 CLA 数据。
我应该单击哪个实体、归档?
  • 从调试角度连接到 CLA 内核可实现单步执行
通过单击"Debug Probe/CPU1_CLA1即可完成此操作
·       从 Target 菜单选项中将程序符号载入 CLA 以开始调试
无法看到任何目标菜单
调试 CLA 代码
1.    在 CLA 代码中插入断点
·       _mdebugstop()内在函数是 CLA 断点。 它会将指令 MDEBUGSTOP 放置在汇编的该位置。
·       如果未连接到 CLA 内核(即禁用单步执行)、则内在函数的行为为 MNOP (无操作)
断点被插入到第82行的 cla_fir32_cpu01示例中。

2.     启动任务:CLA 将执行代码、直到 MDEBUGSTOP 位于 D2中

当我单击"Run"时、会显示此错误消息
CPU1_CLA1:无法运行目标 CPU:(错误-2060 @ 0x0)在器件运行时无法完成请求的操作。 停止器件、然后重试此操作。 (仿真包9.2.0.1.00046)
谢谢、Vadim

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

    [引用 user="Vadim"]

    • 启动调试会话后、调试视图(CCS 内的窗口)将包含 C28x 和 CLA 的条目
    我有一个常规视图、其中没有 CLA 条目

    [/报价]

    Vadim、

    您能否提供"Debug"窗口的屏幕截图?  如果没有 CLA 条目、则调试配置不正确。  它应与以下内容类似:

    [引用 user="Vadim"]

    • 单击 CLA 会更改 CCS 中所有窗口的上下文以反映 CLA 数据。
    我应该单击哪个实体、归档?

    [/报价]

    该指令指的是 Debug 窗口中的 CLA 条目(请参阅上面的屏幕截图-第2条和第4条目- CPU1_CLA1和 CPU2_CLA1 -对应于器件上的 CLA 实例)。  当您单击 Debug 窗口中的一个条目时、CCS 将更改所有窗口以反映您选择的 CPU。

    [引用 user="Vadim"]

    从 Target 菜单选项中将程序符号载入 CLA 以开始调试
    无法看到任何目标菜单

    [/报价]

    这应该是从运行菜单中选择的(即运行->加载->加载符号)。   

    此致

    Lori

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

    [引用 user="Vadim"]

    2.     启动任务:CLA 将执行代码、直到 MDEBUGSTOP 位于 D2中

    当我单击"Run"时、会显示此错误消息
    CPU1_CLA1:无法运行目标 CPU:(错误-2060 @ 0x0)在器件运行时无法完成请求的操作。 停止器件、然后重试此操作。 (仿真包9.2.0.1.00046)

    [/报价]

    CLA 任务通过触发任务启动。  只有当任务已经被触发并且已经在一个调试断点处停止时、"run"按钮才起作用。  

    请参阅此常见问题解答: https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/faq.html#what-can-trigger-a-task-also-referred-to-as-an-isr

    您可能还会发现 CLA 技术讲座很有帮助- CLA 指南的入门页面中提供了一个链接:

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/getting_started.html

    此致

    Lori

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

    您好、Lori、

    感谢您的支持! 我在寻求帮助之前仔细阅读了这些文件。 您可以看到我在问题中复制了其中的说明。 如何从调试窗口执行这两个步骤

    1. 启动任务:CLA 将执行代码、直到 MDEBUGSTOP 位于 D2中

    2. 单步执行或运行到下一个断点:单步执行一次移动一个周期的 CLA 流水线

    这是我点击运行按钮后的屏幕。

    谢谢 Vadim

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

    Vadim、

    从屏幕截图中、CLA 任务尚未触发;它处于空闲状态。  如果 CLA 处于空闲状态、"run"按钮将不适用于 CLA。  一旦 CLA 被触发并在一个 MDEBUGSTOP 上停止、"run"按钮将起作用。   

    对于 TI 示例、您需要首先运行 C28x 代码。  这将配置器件、外设、进而触发 CLA 任务。  触发源可以是外设中断、也可以是 C28x CPU 本身。

    请参阅此常见问题解答: https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/faq.html#what-can-trigger-a-task-also-referred-to-as-an-isr

    我建议您参加 CLA 技术讲座。  它详细介绍了 CLA 的调试。  

    此致

    Lori

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

    您好、Lori、

    我正是这样做的、按照本视频的分步操作:

    https://training.ti.com/cla-hands-workshop-part-4-debugging-cla?context=1137755-1139642-1128649

    在我点击"run"后、我出现错误、在视频中、它在 _mdebugstop()处停止;在视频 377D 中、我有377S。 我比较了两个源文件、其中的 CLA 触发是相同的。

    您可以为377S 下载此示例、运行并检查它吗? 还有另一个 CLA_ADC_fir32_cpu01示例 使用硬件触发 CLA  

    Cla1Regs.MCTL.bit.IACKE = 1;
    Cla1Regs.MIER =(M_INT8 | M_INT7);

    此示例对我来说很好。 我有2个问题:  

    1.为什么在研讨会中377D 起作用、而在源代码资源管理器中377S 不在类似示例中?

    2.如何在调试会话中启动不触发硬件的 CLA 任务? '触发可能来自外设中断或来自 C28x CPU 本身。'

    谢谢 Vadim

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

    抱歉、在我之前的帖子中、我是指该寄存器为 CLA_ADC_FIR32_cpu01中的 CLA 设置硬件中断  

    //
    //将 adca.1设置为任务7的触发器
    //
    DmaClaSrcSelRegs.CLA1TASSKSRCSEL2.bit.TASK7=1;

     当前示例中的此行应该是:void CLA_initCpu1Cla1 (void) 通过主 CPU 启动 CLA 吗?

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

    谢谢 Vadim

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

    [引用 user="Vadim"]我在视频 377D 中有377S。

    [引用 user="Vadim"]1. 为什么在技术讲座中377D 起作用、而377S 不在源代码资源管理器的类似示例中?

    Vadim、

    如果您使用的是 F28377S LaunchPad、则它与 F28377D Launchpad 之间存在一些引脚差异。  这可能会说明车间无法正常工作以满足您的设置的原因。

    [引用 user="Vadim"]2. 如何在调试会话中启动不触发硬件的 CLA 任务? "触发器可能来自外设中断或 C28x CPU 本身。"

    [引用 user="Vadim"]还有另一个用 硬件触发 CLA_adc_fir32_cpu01的示例 [/quot]

    在示例 cla_fir32_cpu01中- CLA 任务由 C28x 使用 IACK 指令启动。  我们的示例中有一个宏可执行此操作,该示例在 CLA_RunTest()函数中调用它。  请参阅下面的屏幕截图。   此常见问题解答也可能对您有所帮助: https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/debugging.html#why-can-t-i-force-a-task-using-software-iack

    注意-此示例不依赖于 ADC、因此引脚分配无关紧要、并且应该在任一器件的 LaunchPad 上工作。

    此致

    Lori

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

    [引用 user="Vadim"]

    为 CLA_ADC_FIR32_cpu01中的 CLA 设置硬件中断   

    //
    //将 adca.1设置为任务7的触发器
    //
    DmaClaSrcSelRegs.CLA1TASSKSRCSEL2.bit.TASK7=1;

    [/报价]

    Vadim、

    器件的寄存器记录在技术参考手册中、可从产品文件夹(即 https://www.ti.com/product/TMS320F28377S)下载该手册。  有关源列表、请参阅表6.3.4 CLA 任务和中断矢量。  在本例中、1对应 于 ADCAINT1。  该中断将触发 CLA。  

    [引用 user="Vadim"] 当前示例中的此行是否应该:void CLA_initCpu1Cla1 (void) 通过主 CPU 启动 CLA?

    这会调用一个初始化 CLA 外设(即中断矢量等)的函数

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

    这使得 IACK 指令能够启动一个任务-请参考我之前的帖子以了解这方面的一个示例。  

    此致

    Lori

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

    您好、Lori、

    我尝试了硬件和软件中断、但看起来它们都不起作用。 请听我说。

    谢谢 Vadim

    ***** 主要*****

    //
    //包含的文件
    //
    #include "F28x_Project.h"
    #include "math.h"


    //
    //定义
    //

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


    //
    //全局
    //
    UINT16 TBPRD = 400;


    // :将 CLA 变量分配给它们各自的内存空间
    //-输入/输出变量应该进入 Cla1ToCpuMsgRam/CpuToCla1MsgRam
    //-.cla 文件中的全局变量自动放置在".bss_cla"中、因此
    //不需要手动放置。
    //-.cla 文件中的常量也是如此;它们被放置在中
    //".const_cla"段、但您需要将其加载到闪存中、然后复制
    //在运行时连接到 RAM
    //-您可以手动将共享变量放置在用户定义的段中,例如 Cla1DataRam0、
    //允许 C28x 也访问它们
    //任务1 (C)变量

    #pragma DATA_SECTION (xn、"CpuToCla1MsgRAM")
    浮点 xn;//输入数据

    #pragma DATA_SECTION (yn、"Cla1ToCpuMsgRAM")
    float yn;//filtered data

    // :CLA 只能在 RAM 之外运行,也就是说它的程序和数据空间受到限制
    //到 RAM。 根据器件的不同、CLA 可被配置为访问整个较低的部分
    // 64K RAM (F2837x)或其 prorgam 和数据空间仅限于某些 RAM
    //(F2806x、F2803x、F2805x 程序-> RAML3、数据-> RAML0、1、/2)
    //-在独立模式中、您必须将 CLA 代码和常量加载到闪存中、然后复制
    //这些在运行时转移到 RAM 中
    //-链接器为"Cla1Prog"和".const_cla"段定义放置变量
    //-为了在 memcpy()中使用这些变量,我们需要告诉 C 编译器这一点
    //这些变量由外部声明(由链接器)。 我们使用"extern "存储
    //限定符来实现它

    //
    //函数原型
    //
    _interrupt void Cla1Task1();
    _interrupt void Cla1Task2();
    _interrupt void Cla1Task3 ();
    _interrupt void Cla1Task4();
    _interrupt void Cla1Task5();
    _interrupt void Cla1Task6 ();
    _interrupt void Cla1Task7 ();
    _interrupt void Cla1Task8 ();

    _interrupt void cla1Isr1();
    _interrupt void cla1Isr2();
    _interrupt void cla1Isr3 ();
    _interrupt void cla1Isr4 ();
    _interrupt void cla1Isr5 ();
    _interrupt void cla1Isr6 ();
    _interrupt void cla1Isr7 ();
    _interrupt void cla1Isr8 ();

    void configureDACb (void);
    void ConfigureADCA (void);
    void ConfigureEPwm2 (void);
    void SetupADCAEpwm (uint16通道);
    //步骤3:在 initcla()中设置 CLA 及其内存资源
    // configCLAMemory()
    //-有关更多步骤,请参见 initCLA()和 configCLAMemory()
    //-在此处添加任务结束1原型
    void CLA_configClaMemory (void);
    void CLA_initCpu1Cla1 (void);

    //
    //主函
    //
    void main (void)

    InitSysCtrl();
    SetupADCAEpwm (0);
    ConfigureADCA();
    configureDACb();
    配置 EPwm2();
    EALLOW;
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
    EDIS;
    Dint;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    //
    //设置 CLA、外设和中断服务例程
    //
    //! 设置 CLA、ADC 和 ePWM
    //

    CLA_configClaMemory();
    cla_initCpu1Cla1();


    // :我们希望任务1在 PIE 中触发任务结束中断
    //因此我们创建了一个任务结束中断服务例程,然后我们创建了
    //将其分配给 PieVectTable (请参阅 TRM、表1-118)
    //-为该特定中断启用 PIE 组和子组
    PieVectTable.CLA1_1_INT =&cla1Isr1;
    PieCtrlRegs.PIEIER11.bit.INTx1 = 0x01;
    IER |=(M_INT11);

    EDIS;
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM

    //
    //循环无限地进行转换
    //
    操作

    } while (1);


    //
    // cla_configClaMemory -配置 CLA 存储器段
    //
    空 CLA_configClaMemory (空)

    extern uint32_t Cla1funcsRunStart、Cla1funcsLoadStart、Cla1funcsLoadSize;
    EALLOW;

    #ifdef _flash
    //
    //将代码从闪存复制到 RAM
    //
    memcpy (((uint32_t *)&Cla1funcsRunStart、(uint32_t *)&Cla1funcsLoadStart、
    (uint32_t)和 Cla1funcsLoadSize);
    #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){};

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

    //
    //接下来将 LS0RAM 和 LS1RAM 配置为 CLA 的数据空间
    //首先将 CLA 配置为 LS0 (1)的主器件、然后
    //将空格设置为代码块
    //
    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;

    //
    // cla_initCpu1Cla1 -初始化 CLA1任务矢量和任务中断结束
    //
    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;


    //
    //为所有的任务结束中断配置向量
    // 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;

    //
    //将 ADCAINT1设置为任务1的触发器,将 ADCBINT1设置为任务2的6
    //
    DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.task1 = CLA_TRIG_ADCAINT1;
    Cla1Regs.MIF.all = M_INT1;
    //
    //在组和子组级别启用 CLA 中断
    //

    // :启用软件强制并运行任务8一次
    //- MCTL 寄存器允许软件触发任务
    //参见 TRM 5.7.2.9
    //-使用软件组运行任何一次性任务。 "F2806x_CLA_defins.h"
    //有一些有用的宏函数来强制执行每个任务
    Cla1Regs.MCTL.bit.IACKE = 1;
    EDIS;
    Cla1ForceTask8andWait();

    //
    // cla1Isr1 - CLA1 ISR 1.
    //
    _interrupt void cla1Isr1 ()

    //
    //确认任务1的任务结束中断
    //
    DacbRegs.DACVALs.all = xn;
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
    PieCtrlRegs.PIEACX.ALL =(PIEACK_Group1 | PIEACK_group11);
    //
    //取消注释以停止调试器并在此处停止
    //
    // 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 ()

    //
    //确认任务8的任务结束中断
    //
    PieCtrlRegs.PIEACK.ALL = M_INT11;

    //
    //取消注释以停止调试器并在此处停止
    //
    // asm (" ESTOP0");

    void configureDACb()

    EALLOW;
    DacbRegs.DACCTL.bit.DACREFSEL = 1;
    DacbRegs.DACOUTEN.bit.DACOUTEN = 1;
    DacbRegs.DACVALS.ALL = 0;

    DELAY_US (10);//缓冲 DAC 加电延迟

    EDIS;

    空配置 ADCA (空)

    EALLOW;

    //
    //写入配置
    //
    AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
    AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

    //
    //将脉冲位置设置为晚期
    //
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

    //
    //为 ADC 加电
    //
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //
    //延迟1ms 以允许 ADC 加电时间
    //
    DELAY_US (1000);

    EDIS;

    void SetupADCAEpwm (uint16通道)

    uint16 acqps;

    //
    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
    //
    if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

    acqps = 14;//75ns
    // acqps = 4;//75ns

    否则、//分辨率为16位

    acqps = 63;//320ns

    //
    //选择要转换的通道和转换结束标志
    //
    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x7;// ePWM2 SOCA/C 上的触发
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
    // AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//连续中断
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
    EDIS;

    空配置 EPwm2 (空)

    EALLOW;
    //假设 ePWM 时钟已启用
    EPwm2Regs.ETSEL.bit.SOCAEN = 1;//禁用组上的 SOC
    EPwm2Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
    EPwm2Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
    EPwm2Regs.CMPA.bit.CMPA = TBPRD/2;//将比较值设置为2048个计数
    EPwm2Regs.TBPRD = TBPRD;//将周期设置为4096个计数
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//开始计数器
    EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR;//清除 PWM2A 导通周期
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV=0;

    EDIS;

    CLA****

    extern float xn;//Sample 输入
    extern float yn;//Sample 输出

    //仅对所有 CLA 任务全局变量

    中断空 Cla1Task1 (空)

    //局部变量

    //代码
    _mdebugstop();
    YN = xn+5;

    中断空 Cla1Task2 (空)
    {}
    中断空 Cla1Task3 (空)
    {}
    中断空 Cla1Task4 (空)
    {}
    中断空 Cla1Task5 (空)
    {}
    中断空 Cla1Task6 (空)
    {}
    中断空 Cla1Task7 (空)
    {}
    中断空 Cla1Task8 (空)

    _mdebugstop();
    YN=0;

    //
    //文件结束
    //

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

    Vadim、

    我无法查看您查找问题的所有代码。  TI 在 C2000Ware 中提供了许多示例、您可以将该项目与之进行比较。

    我注意到的一件事是 ADC 在 main ()内设置得非常早、而 CLA 在以后设置。  CLA 任务是边沿触发的、因此如果 CLA 不是先配置的、中断可能会丢失。  

    请参阅以下有关边沿触发 CLA 任务的常见问题解答:

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/debugging.html#my-cla-task-never-starts

    此致

    Lori

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

    您好、Lori、

    我将查看它。 同时、如何在调试 CLA 和 C28xxCPU 之间切换? 我修改了您建议的示例

    for (;;)

    II++;
    CLA_RunTest();

    当 CLA 未被连接时、我可以在 CLA_run Test()上设定一个断点并停止执行。

    当我连接 CLA 目标并运行时、我可以在  CLA 文件中的每个__mdebugstop()处停止执行;

    如果我断开 CLA 并切换到 CPU、我就不能再在 CLA_RunTest()处的断点处停止执行。 是否有办法在 CLA 和 CPU 调试之间切换 并将所有数据保持在同一会话中?

    谢谢 Vadim

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

    [引用 user="Vadim"]如果我断开 CLA 并切换到 CPU,则无法再在 CLA_RunTest()处的断点停止执行。

    Vadim、  

    这听起来很奇怪。  CLA 断开连接时、您仍应能够在 C28x 代码中的断点处停止。  

    -洛里

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

    您好、Lori、

    请给我举一个在 Resource Explorer 中使用 CLA 外设触发的示例吗? 我只能找到一个"cla_adc_fir32_cpu01" 、其中包含用于 CLA 的.asm 文件。

    谢谢 Vadim

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

    我会看-我认为还有更多。  让我检查一下。  与此同时、您是否在 CLA 设置之后尝试移动 ADC 设置?

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

    您好、Lori、

    我尝试了、它工作正常、而不是我将 CLA 放回、它也工作正常。 我正在加快 CLA 的速度、并且可以将软件调用与 claTask 和硬件中断调用进行比较。 如果我使用来自 ADC_int 的软件调用 claTask、我没有问题。 当我从 ADC 触发时:DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.task1 = 1; DmaClaSrcSelRegs.CLA1TASSKSRCSEL1.bit.task1 = 6; 我第一次运行时,它会以该消息停止

    "在地址"0xa024"处中断、没有可用的调试信息、或者在程序代码之外。"

    我再次点击"Run"、它将继续运行、不会停止。 当我启用 CLA 调试并且只有 __mdebugstop();在任务内,我可以在任务1和任务2中停止这两个 ADC 中断都工作,但是如果我在任务1中添加了一些用于{}循环的代码并开始单步执行,我会收到以下消息:

    "PU1_CLA1:不能单步执行目标程序:(错误-2060 @ 0x0)在器件运行时无法完成请求的操作。 停止器件、然后重试此操作。 (仿真包9.2.0.1.00046)"

    谢谢 Vadim

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

    很棒!  听到它的工作效果很好。

    [引用 user="Vadim"]"在地址"0xa024"处或程序代码之外中断、但没有可用的调试信息。"

    如果这是一个 CLA 地址并且 CLA 被暂停、它应该显示调试信息、如果符号被载入 CLA 调试。

    [引用 user="Vadim"]我再次点击"run"、它将继续运行、而不会停止。 当我启用 CLA 调试并且只有 __mdebugstop();在任务内,我可以在任务1和任务2中停止这两个 ADC 中断都工作,但是如果我在任务1中添加了一些用于{}循环的代码并开始单步执行,我会收到以下消息:

    "PU1_CLA1:不能单步执行目标程序:(错误-2060 @ 0x0)在器件运行时无法完成请求的操作。 停止器件、然后重试此操作。 (仿真包9.2.0.1.00046)"

    如果 CLA 被触发并在_mdebugstop()处停止 、那么您应该能够从_mdebugstop()单步执行并通过 for 循环。   

    但是、我怀疑 CLA 处于空闲状态、而不是在_mdebugstop 处停止。  错误消息中的@0x0表示 MPC 处于复位状态、并且在 CLA 程序空间内没有停止。  如果 CLA 处于空闲状态(下面的情况3)、则运行/恢复不起作用。

    1. 如果 CLA 处于一个断点(mdebugstop)、那么可使用"run/resume"按钮来启动执行。  
    2. 如果 CLA 在一条指令上被暂停(即在一个断点处停止、并且你是单步执行指令)、那么可使用运行/恢复按钮来开始执行。
    3. 如果 CLA 处于空闲状态(即在 MSTOP)指令中、则 无法 使用 RUN/RESUME 按钮启动 CLA。  只有来自 C28x 的触发(外设中断)或软件强制才能启动/重新启动 CLA。  这是一个任务被触发前和 CLA 达到一个 MSTOP 指令时的情况。