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.

[参考译文] TMS320F2800157:时钟检测缺失测试问题

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370534/tms320f2800157-missing-clock-detection-test-issue

器件型号:TMS320F2800157
Thread 中讨论的其他器件:C2000WARE

工具与软件:

您好!

我正在实施"时钟丢失检测(MCD)"测试。 根据我看到的示例、此测试的正确过程包括:

  1. 完成初始化阶段、清除 NMI 标志、并将 NMI 向量重新映射到处理程序。
  2. 通过写入0MCLKOFFMCDCR寄存器中的位来启用时钟丢失检测(MCD)逻辑。
  3. 通过写入1OSCOFFMCDCR寄存器的位来模拟丢失的时钟。

执行这些步骤后、我等待 ISR、它会按预期触发。 然而、当将振荡器源配置为时INTOSC1、问题就会出现。 我通过0x2OSCCLKSRCSELCLKSRCCTL1寄存器中的字段进行写入来尝试执行该操作。 尽管如此、寄存器值仍然存在0x1、从而防止 PLL 锁定并导致测试失败。

非常感谢为解决这一问题而提出的任何见解或建议。

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

    尊敬的 AHashem:
    如果 MCLKCLR 位被写入(这是一个 W=1位)、MCDSTS 位被清零并且 OSCCLK 源由 OSCCLKSRCSEL 位决定。 写入 MCLKCLR 也会清零 MCDPCNT 和 MCDSCNT 计数器、让电路重新评估丢失时钟检测。 如果用户想在检测到时钟缺失后锁定 PLL、请将时钟源切换到 INTOSC1 (使用 OSCCLKSRCSEL 寄存器)、执行 MCLKCLR 并重新锁定 PLL。

    您是否只是在写入 OSCCLKSRCSEL 字段?  未 如示例代码中所述运行相同的重新锁定函数  

    您需要按照概述的正确步骤 来重新锁定 PLL
    TRM 中概述的设置系统 PLL 的建议顺序:

    1.通过清除 SYSPLLCTL1[PLLCLKEN]来旁路 PLL。 至少允许60条 NOP 指令使其生效。

    2.通过写入 SYSPLLCTL1.PLLEN = 0来为 PLL 断电、并允许至少60条 NOP 指令使其生效。

    3.通过写入 CLKSRCCTL1.OSCCLKSRCSEL 来选择基准时钟源(OSCCLK)。 至少允许300条 NOP 指令使其生效。

    4.将系统时钟分频器设置为/1、以通过清除 SYSCLKDIVSEL[PLLSYSCLKDIV]来确保获得最快的 PLL 配置。

    5.通过一次写入 SYSPLLMULT 中的32位值来同时设置 IMULT、REFDIV 和 ODIV。 这将自动启用 PLL。 确保倍频器和分频器的设置不违反器件数据表中定义的频率规格。

    6.通过轮询 LOCK 状态位变为高电平(SYSPLLSTS)等待 PLL 锁定。 LOCKS = 1)。

    7.将 DCC 配置为基准时钟为 OSCCLK、将被测量的时钟配置为 PLLRAWCLK、并验证 PLL 的频率。 如果频率超出范围、请勿启用 PLLRAWCLK 作为 SYSCLK、请停在此处并进行故障排除。 有关配置和用法的更多信息、请参阅第8章。

    8.通过设置 SYSPLLCTL1[PLLCLKEN]切换到 PLL 作为系统时钟  

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

    感谢您的详细答复。 我按照建议的过程重新锁定 PLL、并且 PLL 在测试后成功锁定。 不过、我会遇到在测试完成后触发未处理的 NMI 的问题。

    具体来说、NMI 映射到矢量表中的函数 ISR_NMI:
    PieVectTable。 NMI_INT =&ISR_NMI;


    执行测试并确认 PLL 已锁定后、软件进入 ISR_NMI 处理程序、原因我无法确定。 以下是我采取的步骤:

    测试完成后和初始清除所有 NMI 标志。
    重新映射了 NMI 向量。
    启用时钟丢失检测(MCD)。
    如何仿真丢失时钟。
    按照重新锁定 PLL 的序列操作、包括清零 MCLKCLR 位。
    对于导致此 NMI 未处理的原因、您有什么见解或建议吗? 我是否应该考虑其他步骤或注意事项来防止出现此问题?

    我调查了该问题、并在启用测试时发现了以下信息:

      EALLOW
      ClkCfgRegs.MCDCR.bit.MCLKOFF = 0/*关闭时钟丢失检测*/
      ClkCfgRegs.MCDCR.bit.OSCOFF = 1 /*关闭振荡器*/
      EDIS
    、NMI 在执行测试后稍后出现
    注意:
    当我观察 NMIFLG 寄存器时、我发现设置了 CLOCKFAIL 和 NMIINT 标志。
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有什么建议吗?

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

    您好!

    感谢您的耐心等待。

    我不完全了解问题以及您按照确切的顺序 来获取错误-  

    [报价 userid="597275" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370534/tms320f2800157-missing-clock-detection-test-issue/5236158 #5236158"]
    EALLOW
      ClkCfgRegs.MCDCR.bit.MCLKOFF = 0/*关闭时钟丢失检测*/
      ClkCfgRegs.MCDCR.bit.OSCOFF = 1 /*关闭振荡器*/
      EDIS
    、NMI 在执行测试后稍后出现
    [报价]

    如果您关闭 MCD、它不会在您关闭振荡器时触发时钟故障。 我希望您能理解这一点

    现在,在上述之后,当你想重新锁定 PLL 你需要按照下面的顺序, :  

    1) 1) 将振荡器源配置为 INTOSC1 -首先设置时钟源

    2) Re 连接缺少时钟检测时钟源以停止模拟时钟 故障- 因为您希望时钟重新连接、OSCOFF 位原有

    3) 3)在时钟故障后重置缺少时钟检测逻辑-写入 MCLKCR 以清除计数器并开始刷新

    4) 4)使用 INTOSC1作为时钟源和锁定 PLL 来设置 PLL 控制和时钟分频器

    您很可能错过了上面的第2步

    谢谢!
    Prarth

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

     Prarthan、您好!

    感谢您的回答、下面是我遵循的步骤:

    1. 启用全局中断:

      • 已通过设置启用全局中断NmiIntruptRegs.NMICFG.bit.NMIE = 1
    2. 关闭时钟丢失检测:

      • 已通过设置禁用缺少时钟检测逻辑ClkCfgRegs.MCDCR.bit.MCLKOFF = 0
    3. 关闭振荡器:

      • 通过设置关闭振荡器来模拟丢失时钟ClkCfgRegs.MCDCR.bit.OSCOFF = 1
    4. 设置 NMI 处理程序:

      • Re 通过设置PieVectTable.NMI_INT指向自定义 ISR 将 NMI 矢量映射到自定义处理程序。
      • 通过设置NmiIntruptRegs.NMIFLGCLR.all为当前标志、然后设置清除所有 NMI 标志NmiIntruptRegs.NMIFLGCLR.bit.NMIINT = 1
      • 已通过设置启用 NMI 全局中断SysCtl_enableNMIGlobalInterrupt()
    5. 仿真丢失时钟:

      • 关闭振荡器后、等待 NMI 触发。 使用一个标志mg_bNmiFlag来表示何时 NMI 处理程序被执行。
    6. 在 ISR 中处理 NMI:

      • 在 NMI 处理程序中、通过评估ClkCfgRegs.MCDCR.bit.MCLKSTS和来检查是否缺少时钟和时钟故障标志NmiIntruptRegs.NMIFLG.bit.CLOCKFAIL
      • 如果设置了这两个标志、则表示通过设置mg_bNmiFlag = trueNmiIntruptRegs.NMIFLGCLR.all和清除所有 NMI 标志(设置为当前标志和NmiIntruptRegs.NMIFLGCLR.bit.NMIINT = 1)来检测时钟故障。
    7. 重新配置时钟和 PLL:

      • 将时钟源重新配置为 INTOSC1、复位 MCD 逻辑、并重新锁定 PLL、如下所示:
        1. 通过设置将振荡器源配置为 INTOSC1ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 0x2
        2. 已通过设置重新连接缺少时钟检测时钟源ClkCfgRegs.MCDCR.bit.OSCOFF = 0
        3. 通过设置重置缺少时钟检测逻辑ClkCfgRegs.MCDCR.bit.MCLKCLR = 1
        4. 通过设置绕过 PLLClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 0 并通过设置将 PLL 断电ClkCfgRegs.SYSPLLCTL1.bit.PLLEN = 0
        5. 通过设置选择基准时钟源(OSCCLK)ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 0
        6. 通过设置ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = 0和将系统时钟分频器设置为/1ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV_LSB = 0
        7. 通过设置ClkCfgRegs.SYSPLLMULT.all适当的值来配置 PLL 倍频器和分频器。
        8. 已通过设置启用 PLLClkCfgRegs.SYSPLLCTL1.bit.PLLEN = 1 并等待它通过轮询锁定ClkCfgRegs.SYSPLLSTS.bit.LOCKS
        9. 一旦 PLL 锁定、通过设置启用 PLL 作为系统时钟源ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1

     我想我已经转换了 您提到的步骤2、当调试器卡在 ISR NMI 中时、还将从调试器截屏  

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

    您好!

    您是否尝试过 c2000ware 的软件示例:sysctl_ex1_missing_clock_detection

    您在执行示例时有何不同之处? 我会一对一地比较它们、然后试着找出缺失的东西  

    我尝试了示例、它能够按预期运行

    我有以下问题,从上面你提到的顺序:  

    1)为什么关闭 MCD?

    2)为什么要在步骤3中关闭振荡器、然后在步骤4中初始化 NMI 处理程序? 这毫无意义

    3) 3)在步骤5中、您在步骤2和3中已分别关闭了振荡器和 MCD。

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

    您好!

    我知道示例工作正常、尽管代码不起作用、但我认为我的做法与示例中所做的做法不同。  

    1)为什么关闭 MCD?

    在步骤2中、我不关闭 MCD、而是将0写入  ClkCfgRegs.MCDCR.bit.MCLKOFF = 0 to enable MCD as mentioned here:

    2)为什么要在步骤3中关闭振荡器、然后在步骤4中初始化 NMI 处理程序? 这毫无意义

    我在步骤3中关闭振荡器、如示例中所述、 启用 缺少时钟检测(MCD)逻辑后、它会模拟缺少时钟

    然后在步骤4中初始化 NMI 处理程序、这个步骤可在触发中断前在代码中的任一位置完成 、这步执行以下步骤:  

      EDIS;   
    PieVectTable。 NMI_INT =&NMI_Handler
      EDIS;
    但是、我刚刚启用了全局中断、就将其移动到了行中。

    3) 3)在步骤5中、您在步骤2和3中已分别关闭了振荡器和 MCD。

    我只是等待 NMI 发出、触发 NMI 后、我会设置名为  mg_bNmiFlag 的标志、指示已成功触发 NMI。  
    如果我们需要打电话进行讨论、请告知我。  
     

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

    您好!

    [报价 userid="597275" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370534/tms320f2800157-missing-clock-detection-test-issue/5241170 #5241170"]

    我在步骤3中关闭振荡器、如示例中所述、 启用 缺少时钟检测(MCD)逻辑后、它会模拟缺少时钟

    然后在步骤4中初始化 NMI 处理程序、这个步骤可在触发中断前在代码中的任一位置完成 、这步执行以下步骤:  

    [报价]

    在本示例中、我可以看到 NMI 初始化在 MCD 启用和振荡器关闭之前完成



    是否可以将第4步移到所有 MCD 代码之上?

    谢谢

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

     Prarthan、您好!

    我移动了它们,但行为仍然相同,一个未处理的 NMI 触发,使 SW 跳转到地址 "0x3fbc34".

    注意:当我第一次刷写和运行代码时、它不会跳转到这个指令、但当我复位并再次运行调试器时、它会跳转到这个地址 "0x3fbc34"  

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

    您好!

    请将压缩的项目发送给我。

    我将在这里尝试、并让您知道、 在没有实际尝试的情况下很难调试。

    谢谢。