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.

[参考译文] TMS320F280041:F280041 ADC 中断溢出问题

Guru**** 2540610 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/750511/tms320f280041-f280041-adc-interrupt-overflow-issue

器件型号:TMS320F280041

大家好、香榭丽舍、

我写信给您,要求 OBC 客户提供有关 F280041 ADC 中断溢出问题的紧急支持。

 

F280041 OBC 平台已投入大规模生产并将很快升级、但是、他们遇到 了一个关键问题、即 ADC 中断将溢出并导致终端客户不再为其提供服务。

我们在他们的实验室中度过了一个周末、以确定根本原因并为他们找到解决方案、但现在我们仍然需要您的帮助来澄清根本原因、并帮助我们解释为什么根本原因不符合预期。   

请查找随附的问题摘要并提供您的建议、如果您需要更多信息来了解详情、请告知我们。

e2e.ti.com/.../F280041-ADC-Interrupt-Overflow-Issue-Summary.pdf

此致、

张卫健

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

    通常、如果清除 ADC 中的所有溢出标志、并确保 PIE 中的所有内容都已清除、则应该可以恢复为后续中断提供服务。 由于该文档指出、当 ISR 持续时间约为 ADC 触发周期的整数倍时、中断无法恢复、 我必须假设它们正在运行在竞争状态中、新的 ISR 进入会导致 ADCINT 标志在尝试清除溢出和标志后不久被置位。 这会导致退出 ISR、同时 ADCINT 标志仍处于挂起状态。 ADCINT 标志的后续设置会导致溢出而不是 ISR。

    您可以通过在 ISR 末尾添加一些代码来验证上述假设、以检查是否设置了任何 ADCINT 标志和/或 ADCINT 溢出标志。 我怀疑是在应用程序无法恢复的情况下。

    一种简单的解决方案可能是在您处于 ISR 内部时禁用到 ADC 的 CPU 定时器触发(始终执行此操作、或者在执行导致长 ISR 的操作时至少执行此操作)。 这将防止在您仍在 ISR 中时复位 ADCINT 标志的额外结果。 这还应实际上防止溢出首先发生。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Devin、

    感谢您的及时响应和建议。

    正如文档所描述的那样、我认为在 Tommy 回复另一篇帖子后、我们已经获得了一个解决方案、而现在我们想要了解当时发生的情况以及原因。

    根据 您的回复、有4个问题。

    1.客户没有清除 ISR 中的 ADCINT 溢出标志、但只要 ISR 持续时间不是 ADC 触发周期的整数倍、他们就可以再次为新的 ISR 提供服务、这是否是芯片上 PIE 的正常操作?

    如果是正常操作、那么为什么不在旧 ISR 之后立即执行、而是在 ADC 触发周期的整数倍的时间开始执行呢?

    如果没有 ADCINT 溢出、如果 ISR 持续时间是 ADC 触发周期的1倍、那么新的 ISR 也可能无法被处理、这有道理吗?

    4.当 ISR 持续时间是 ADC 触发周期的整数倍以使新 ISR 不再恢复时、CPU 和 PIE 如何工作?

    我们已经在 CCS 寄存器视图中检查了 ADCINT 标志和 ADCINTOVF 标志、并且知道它们都已设置。

    此致、

    张卫健

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

    您好 Ricky、

    如果当 CPU 从另一个 ISR 返回时一个标志挂起、CPU 应该立即处理来自 PIE 的中断。  换言之、处理 ISR 不是脉冲触发事件- 只要标志挂起、CPU 最终将返回到处理 ISR。  

    如果 ADCINT 标志和溢出标志未被清除、ADC 生成更多中断的唯一方法是如果连续运行模式被置位。  在这种情况下、传播到 PIE 并将 PIE 标志置为挂起的事件是一个脉冲。  可以设置 ADCINT 标志、但这对 PIE 没有影响。  仅当 SOC 结束且 ADCINT冲传播到 PIE 时、才会设置 PIE 挂起标志。  如果不是这种情况、ADC ISR 会在退出后立即继续重新进入、因为 ADCINT 标志始终置1、并且在连续 模式下永远不会被清除。   

    我强烈建议您清除 ADCINT 和 ADCINOVF 标志、至少用于调试(即使听起来您依赖 ADC 的连续 INT 模式来触发 PIE)。  通过这种方法、您可以确认继续发生 ADCINT 事件。  如果您可以确认这种情况、则问题出在 PIE 配置中(可能某个 PIE 启用标志或全局中断启用标志正在被清除)。   

    按照上一段最后一句的思路、在 ISR 或后台代码中的任何时刻、您要打开/关闭全局中断使能或 PIE 中断使能(也许是为了创建原子段)? 如果是这样、这可能是竞争条件的关键、导致系统最终处于无法处理 ISR 的状态。

    您还可以尝试我建议的权变措施(在 ISR 期间禁用 ADC SOC 触发器)、因为我认为它应对溢出/竞争情况非常稳健。

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

    Devin、

    感谢您的详细说明、我将要求客户根据您的建议进行一些测试、例如检查 ADCINTOVF 标志并清除它们、禁用 ADC SOC 触发器以及确认是否存在启用/禁用 PIE IER 和 PIEIER 寄存器的代码。

    我们已经确认 ADCINT 标志将在 ISR 结束时清除、似乎客户只启用了这一个 ADCINT、因此不应再在其后台或 ISR 中处理 PIE。

    如果在较长的 ISR 中不清除 ADCINTOVF、我们仍然无法理解为什么只要之前的 ISR 持续时间不是 ADC 触发周期的整数倍、就可以处理新的 ISR、 如上所述、如果未启用 ADCINT 的连续运行模式、则不应触发 ADCINT 并将其传播到 PIE。

    我们还知道、为 ADCINT 启用连续运行模式将有助于解决此问题、而客户在其原始代码中没有这样做、 因此、我们仍然需要了解 ISR 的运行方式是这样的-大多数都可以恢复、但只有在前一个 ISR 持续时间是 ADC 触发周期的整数倍时才能恢复。

    此致、

    张卫健

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

    您好 Ricky、

    整数倍数问题几乎肯定是竞态条件: 如果 ISR 持续时间是触发周期的某个整数倍数、这意味着 ISR 将在下一个 ISR 触发脉冲进入的同时结束。  在这种情况下、特定的清除/确认/启用/禁用时序会使器件处于未启用或未触发中断的状态。  我的问题旨在帮助您确定哪种特定设置受比赛影响。   

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

    Devin、

    我同意您的观点、整数乘法问题肯定是竞态条件、但是测试和观察代码绝对不会满足某些条件。 这些条件或事实包括:

    - ADCINTOVF 不在客户代码中被清除;

    -即使 之前的 ADCINT ISR 执行时间长于触发周期、在处理新 ISR 时也不会设置 ADCINTOVF;

    -客户代码中没有外设中断启用/禁用和 PIE 启用/禁用、除了需要 PIE 确认(我们知道在退出 ISR 时将处理 DINT/EINT 和 PIE IER、但这是由硬件或编译器处理的、 您还可以在我的原始帖子中列出的文档中找到客户在进入和退出 ISR 时的代码执行情况);

    感谢您提出问题、以确定以下两个问题的可能原因:

    -当执行时间是触发周期的整数乘法时,不能为新的 ISR 提供服务;

    -当执行时间超过触发周期但 不是 触发周期的整数乘法时,新的 ISR 可以在触发周期的整数乘法点进行处理;

    但是、我们在客户实验室中进行的实验似乎仍然无法确定根本原因、但相反、只要您正确配置 ISR 执行时间、就可以在实验套件中轻松地重新生成它、这似乎是我们器件内部的固有行为。

    在这种情况下、您是否会想到帮助我们在您的身边尝试它、并了解我们的芯片在这两种情况下的确切行为?

    感谢您花时间和精力解决此问题。

    此致、

    张卫健

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

    我认为我们已经回答了初始报告中的问题(1):在 ISR 期间、中断被禁用;由于连续模式未启用、ADC 中断标志溢出、因此不再生成 ISR (由于没有生成 ISR、ADC 标志永远不会被清除)。

    对于(2)从初次报告中删除:
    请参阅此处的正常中断操作: processors.wiki.ti.com/.../Interrupt_Nesting_on_C28x
    在 ISR 期间禁用 PIE、因此由于 ISR 正在执行、来自 ADC 的脉冲中断将丢失。 ISR 不会在前一个结束后立即恢复、因为在 PIE 中没有设置任何内容、因为它已被禁用。 来自 ADC 的下一个中断请求脉冲会通过、因为此时没有执行 ISR。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Devin、

    尽管 ISR 执行时间较长、并且在 ISR 中禁用或启用 PIE、ADCINTFLG 和 ADNINTOVF 标志的置位还是 ADC 模块内部的行为、对吧?

    但是、在您对下面问题1和2的陈述中、似乎并不相同:

    [引用用户="Devin Cottier"]
     
    我认为我们已经回答了初始报告中的问题(1):在 ISR 期间、中断被禁用;由于连续模式未启用、ADC 中断标志溢出、因此不再生成 ISR (由于没有生成 ISR、ADC 标志永远不会被清除)。

    [/报价]

    您在这里提到"将设置 ADNINTOVF 标志"。

    [引用用户="Devin Cottier"]
     
    对于(2)从初次报告中删除:
    请参阅此处的正常中断操作: processors.wiki.ti.com/.../Interrupt_Nesting_on_C28x
    在 ISR 期间禁用 PIE、因此由于 ISR 正在执行、来自 ADC 的脉冲中断将丢失。 ISR 不会在前一个结束后立即恢复、因为在 PIE 中没有设置任何内容、因为它已被禁用。 来自 ADC 的下一个中断请求脉冲会通过、因为此时没有执行 ISR。

    [/报价]

    此时 ADC 中断标志不会溢出、因此可以设置新的 ADCINTFLG 并通过脉冲?

    我仍然坚持认为这些奇怪的行为不够清楚、我们应该在工作台上进行一些测试、看看如何发生以及发生原因、因为这与客户应用程序代码无关、 但是、这只是一个时序问题、这会导致 PIE 像这样工作、我们应该能够在实验套件中重新生成它。

    此致、

    张卫健

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

    我的理解是、在情况2中启用了连续模式、但在情况1中未启用。 在这两种情况下、ADCINT 都将溢出、但在第2种情况下、脉冲仍可以传播到 PIE。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Devin、

    否、遗憾的是、以下两种情况都处于相同的条件下、这在我的原始文章中的"背景和问题描述-基本配置"部分中进行了明确描述(仅在"建议和解决方案"部分中提到了连续模式):

    -当执行时间是触发周期的整数乘法时,不能为新的 ISR 提供服务;

    -当执行时间超过触发周期但 不是 触发周期的整数乘法时,新的 ISR 可以在触发周期的整数乘法点进行处理;

    请帮助您挖掘此处的差异吗?

    此致、

    张卫健

    连续模式

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

    我正在将此问题提交给 PIE 专家。 希望很快更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Devin、

    非常感谢您的跟进、并期待您的回应。

    此致、

    张卫健

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

    Devin、

    希望你有一个美好的假期

    您认为我们现在可以对此问题进行更新吗?

    此致、

    张卫健

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

    Devin、

    我们是否可以在本周之前收到更新?

    客户仍在承受最终客户的压力、因此他们在推动我们更加努力、而我们需要在下周与他们会面、并解释我们的芯片的行为方式和原因。

    提前感谢团队的大力支持。

    此致、

    张卫健

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

    您好 Ricky、

    很抱歉耽误你的回答。 基本上、我们正在关注以下两个问题:

    [引用]-当执行时间是触发周期的整数乘法时、无法为新 ISR 提供服务;[/引用]

    您是否在设置时尝试过此操作、或者这是客户尝试的操作。 我实际上看不到与 PIE 在 ISR 执行时间方面的任何关系。 我有点同意 Devin 的说法,这是一种种族状况。 如果在 ISR 结束时清除 ADCINTFLG 和 ADCINTOVF 标志、这是编写 ISR 的正确方法、那么就不应该看到这个问题。  如果不这样做、我们可能会出现意外行为。

    [引用]-当执行时间超过触发周期但 不 是触发周期的整数乘法时、可以在触发周期的整数乘法点为新 ISR 提供服务;[/引用]

    是否可以提供示例代码来重现此问题(使用 NOP 更好)?

    此致、

    Vivek Singh

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

    Vivek、

    感谢您的回答。

    我没有在笔记本电脑或 EVM 中尝试过它。

    客户确实清除了 ADCINTFLG 位、但未清除出现此问题的原始代码中的 ADCINTOVF 标志、而现在我们需要了解原因和情况。

    此外、当我们根据上述设置进行下一个测试时、即清除 ADCINTFLG 和 ADCINTOVF 标志、它 没有发生任何变化-问题仍然存在。

    只有当您启用 ADC 连续模式时、ISR 才不会丢失、这不取决于两个标志的操作、即无论您是否清除 ADCINTOVF 标志、都可以始终为 ISR 提供服务。

    我要求客户提供一个示例代码、他给我发送了一个示例代码、但它被安全阻止。 我将尝试在收到其他方式的邮件后将其发布、或要求客户直接将其发布在此处。

    此致、

    张卫健

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

    Vivek、

    示例代码随附于 FYI、如有任何问题、请告知我。

    您可以在 ISR 中修改变量 g_u16Test 以更改 ISR 执行时间。

    作为基于客户测试的参考、当其值等于80、163、246和330时、ISR 执行时间 分别对应于触发周期(12.5us)的1倍、2倍、3倍和4倍、并且新的 ISR 将丢失。

    此处添加了 GPIO33来标记进入或退出新 ISR 的位置。 设置为1意味着输入、清除为0意味着退出。

    e2e.ti.com/.../VAILD6043C2U39_5F00_App_5F00_INTTEST.7z

    此致、

    张卫健

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

    Vivek、

    很抱歉推送、您认为我们可以在这2天内收到更新吗?

    客户等待解释很长时间、需要与他们的最终客户讨论、因此我们非常感谢您的帮助。

    此致、

    张卫健

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

    您好 Ricky、

    感谢您提供代码。 这有助于我们解决该问题。 正如预期的那样、这仅是因为竞态条件。 我们将与设计一起检查一些实现细节、但看起来好像在 ADC INT 标志被清除时同时发生了另一个 EOC 事件(AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;)、那么标志保持被置位、并且溢出标志也被置位(这是预期的)。 由于该标志已经被置位、ADC 不会生成新的中断、因此您永远不会看到代码再次进入 ISR。

    有几种方法可以解决此问题-

    1. 使用 ADC 的连续模式。 我假设您使用了它、它解决了问题。
    2. 在清除 ADC 中断和溢出标志前、禁用 ADC 中断(AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;)。 清除标志后再次使能中断、这将避免竞争条件(设置和清除标志)。

    在我从设计团队获得更多的澄清后、我将向您进一步提供最新信息。

    此致、

    Vivek Singh

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

    Vivek、

    感谢您的确认、下面是我的一些评论:

    我们已经有了解决这个问题的解决方案,就像您和 Devin 提到的那样,使用 ADC 连续模式并清除 ADCINTOVF 标志;

    2.客户只想了解2种情况的根本原因:

    a. 执行时间是触发周期的整数乘法时、为什么会错过 INT?

    b. 当执行时间不是触发周期的整数乘法时、为什么 INT 不会丢失?

    我们期待设计团队提供有关此问题的更多详细信息、并感谢您采取后续行动、尽快解决此问题。

    此致、

    张卫健

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

    Ricky、

    正如我提到过的、设置标志和清除标志时会在同一周期发生问题、因此这将在特定时间发生、从而解释了这两个问题。 设计团队已确认设置的优先级高于清除、因此标志不会被清除、并且不会生成新中断。

    Vivek Singh

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

    Vivek、

    好的、感谢您的确认。

    我已将该帖子转发给我的客户、如果他们有其他问题、我将告知您。

    我现在将关闭此帖子、再次感谢您的回复。

    此致、

    张卫健