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.

[参考译文] TMS320F280039:CLA 触发源 CLA_TRIGGER_SDFM1DRINT1、2、3、4 不工作

Guru**** 2952510 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1643908/tms320f280039-cla-trigger-source-cla_trigger_sdfm1drint1-2-3-4-not-working

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

我打算由 CLA 处理 SDFM1 Filter1 的滤波结果。 因此、需要为 SDFM1 Filter1 的每个数据就绪中断触发 CLA 任务。 显然、设置正确触发源的命令应为:

CLA_setTriggerSource (CLA_TASK_1、CLA_TRIGGER_SDFM1DRINT1);
 
但是、即使我启用了 SDFM 中断、CLA 任务永远不会被触发:
 
SDFM_enableInterrupt (SDFM1_BASE、SDFM_FILTER_1、SDFM_DATA_FILTER_CONFIRMATH_INTERRUPT);
 
并且还复位中断标志以获得触发边沿:
 
SDFM_clearInterruptFlag (SDFM1_BASE、SDFM_FILTER_1_NEW_DATA_FLAG | SDFM_MAIN_INTERRUPT_FLAG );
 
顺便说一句、我发现中断有时被称为“数据就绪“、有时被称为“滤波器确认“、这非常令人困惑。 C2000ware 中应该有独特的命名约定。
 
选择此中断时、CLA 任务被正确触发:
 
CLA_setTriggerSource (CLA_TASK_1、CLA_TRIGGER_SDFM1DRINT1);
 
但是、这不是我想要的、因为我已经在调制器故障异常中使用此中断。
 
如何将 CLA 配置为仅在数据就绪中断而不是常规 SDFM1 中断时触发? 显然、CLA 被设计为能够区分这一点、因为您可以配置所有这些 SDFM1 中断:
 
  CLA_TRIGGER_SDFM1INT  = 95U、 //!< CLA 任务触发源为 SDFM1INT
  CLA_TRIGGER_SDFM1DRINT1 = 96U、 //!< CLA 任务触发源为 SDFM1DRINT1
  CLA_TRIGGER_SDFM1DRINT2 = 97U、 //!< CLA 任务触发源为 SDFM1DRINT2
  CLA_TRIGGER_SDFM1DRINT3 = 98U、 //!< CLA 任务触发信号源为 SDFM1DRINT3
  CLA_TRIGGER_SDFM1DRINT4 = 99U、 //!< CLA 任务触发信号源为 SDFM1DRINT4
 
但是、只有第一个 (CLA_TRIGGER_SDFM1INT) 可以正常工作。 我尝试了全部四个数据就绪中断、但它们未能触发 CLA。 如何解决该问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oliver:

    另一位客户尝试做类似的事情、让我找到相应的示例代码、然后返回给您。

    此致、

    Delaney  

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

    您好、Oliver:

    对延迟深表歉意。 这里所附的是我提到的项目。 请告诉我、这是否与您尝试执行的操作相同。

    e2e.ti.com/.../CLA_5F00_SDFM_5F00_example.zip

    此致、

    Delaney

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

    是的、我可以在示例工程的 syscfg 文件中看到 CLA 任务 1 触发条件设置为“CLA_TRIGGER_SDFM4DRINT“。 这意味着、在示例工程中、旨在使用类似的行为:CLA 任务 1 应在 SDFM4 滤波器 1 的每个数据就绪事件时触发。 它用于确认我在 syscfg 文件中正确配置了所有内容。 但仍然没有触发 CLA 任务。 只有触发条件 CLA_TRIGGER_SDFM1INT 正常工作。

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

    您好、Oliver:

    如果您尝试运行独立示例、您是否看到 CLA 任务被触发?

    另外、要检查功能、您要 __mdebugstop(); 在任务权限中添加一行? 常规断点在.cla 文件中不起作用。

    此致、

    Delaney

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

    我无法尝试独立式示例、因为它使用不同的微控制器、即 F28P65x。 在使用 F280039 的项目中、我要使用_mdebugstop ();来验证任务是否已触发。  如果我选择 SDFM1INT 作为触发器、则会在每个数据就绪事件时触发该事件、但如果我选择 SDFM1DRINT1、则不会触发该事件。 这很奇怪、因为我预计 SDFM1INT 仅在发生调制器故障等错误事件时触发。

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

    您好、Oliver:

    我看、让我传阅 SDFM 专家的评论。

    此致、

    Delaney

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

    您好、Oliver:

    我们将尽快与您联系!

    此致、

    Masoud

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

    您好、Oliver。

    这里的问题看起来可能是由系统控制 (SYSCTL) 寄存器默认值引起的。 技术参考手册中的第 290 页是指这个寄存器组、我认为它会影响通过哪个中断线馈送数据就绪中断:

    简而言之、这个“SDFM 类型“寄存器默认为 0 类、它结合了“与 SDFM 中断线路上的故障条件“(即 SDFM1INT)的数据就绪条件。 类型 1 导致 DR 条件“不生成 SDFMINT“、而是“生成单独的数据读取中断“(即 SDFM1DRINTx)。

    如果您使用 DriverLib 工程、则可以运行以下代码将 SDFM 类型切换为 1 类、现在 DR 中断线路应该会 在 DR 条件下生成中断:

    SysCtl_configureType(SYSCTL_SDFMTYPE, 1, 0);

    或者、您可以通过位字段命令在 SDFMTYPE 寄存器的第 0 位写入 1。

    此致、

    Ryan  

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

    我必须承认、这种提示听起来非常有前景、但遗憾的是、尽管这次我可以看到已设置了中断标志、但仍然没有触发中断。 无论我将该中断用作 CLA 任务的触发器、还是尝试直接用作 ISR、都不会触发该中断。 在后一种情况下、我甚至可以看到中断已在 PIE 模块中启用并触发 (INTx13 的标志在寄存器 PIEIER5 和 PIEFR5 中均为“1“、但从未触发 ISR。 手动清除 PIE 和 SDFM1 中的中断标志以强制上升沿没有任何帮助。 你对我有什么进一步的提示吗?   

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

    您好、Oliver。

    很高兴听到中断标志至少已被设置。 鉴于此情况正在发生、但未触发 CLA 任务、这现在可能更像是一个 CLA 配置问题。

    只需快速确认配置设置:

    1. 使用 cla_mapTaskVector() 函数将 CLA 任务函数映射到 CLA 任务中断向量 (MVECT1 - MVECT8)
    2. 使用 cla_enableTasks() 函数并选择相关的特定 CLA_TASKFLAG_x 或 CLA_TASKFLAG_ALL 来启用 CLA 任务和中断。 (这将设置 MIER 中断使能寄存器以允许 CLA 处理中断)

    在技术参考手册中的第 7.4.2 节、以及我们的一些 C2000WARE CLA 示例、是一些通常用于仔细检查您的配置和初始化 CLA 的过程的好资源、以便通过 DriverLib 函数进行精确实现。

    最后、检查 CLA 任务是否正确配置的另一种方法是遵循 TRM 中的第 7.4.3.2 节。 项目 3 提供了多种启动任务的方法、包括在器件运行时手动写入 MIFRC 寄存器、以尝试强制触发任务。 如果任务在此时拒绝触发、CLA 中可能存在错误配置、从而导致此问题、我们可以深入研究。

    请告诉我、这些解决方案中是否有任何一个解决了问题。

    此致、

    Ryan

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

    您好、Ryan、

    感谢您的帮助、问题现已解决。 我的 CLA 配置没有问题、这并不奇怪。  CLA 正常工作、 将 CLA 任务 1 触发器设置为 CLA_TRIGGER_SDFM1INT 并将 SDFMType 设置为“0“。

    但是、将 SDFMType 更改为“1“并使用 CLA_TRIGGER_SDFM1DRINT1 后、 我在激活 DR1 中断后遇到问题。 我始终在 Interrupt_DefaultHandler 中使用 vectID 64 结束、这表示已触发了虚假 EQEP1 中断、即使它从未启用过。 由于我根本没有使用 eQEP 模块、因此未正确注册此中断。 它恰好位于同一个 PIE 组 5 中。

    在不知道该虚假 eQEP1 中断的根本原因(因为我从未启用它)的情况下、我终于能够通过在启用全局中断 (EINT) 之前清除相应的中断标志 (IFR 寄存器中的 INT5) 来解决该问题。 现在、CLA 任务在每次数据就绪更新时触发。 幸运的是、虚假 eQEP1 中断在启动时发生一次。   

    关于参考手册的最后一点:我对 SDFM 中断的命名感到非常困惑。 显然、它有两个不同的名称:数据就绪和 数据确认。 所以我花了一段时间才知道两者都是一样的。