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.

[参考译文] TMS320F28075:无法进入 ADC 中断的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/873771/tms320f28075-issue-of-not-be-able-to-enter-adc-interrupt

器件型号:TMS320F28075

大家好、

我的客户面临一个问题、即在 他们的应用代码 中有时无法进入 ADC 中断。 以下是该问题的详细信息:

ADC 每42us 触发一次、然后在 ADC 采样完成后进入 ADC 中断。 在其主代码中、将有一个 while (1)函 数、用于启用全局中断3ms 并禁用中断6ms、因此在禁用全局中断的6ms 中、将不会有 ADC 中断。 但在3ms 的周期内、将有 ADC 中断、

在中断中、将有用于清除中断标志的代码。

 开始 时一切正常、但 当运行 代码 几秒钟时、代码将永远不会再次进入 ADC 中断、ADC 采样和在主函数中运行的代码都正常、 我们从 CCS 窗口中看到 ADC 中断标志未被清除。 如果在 CCS 窗口中手动清除 ADC 中断,则可以访问 ADC 中断几秒钟,但在这几秒钟之后,再也不会再次进入 ADC 中断。

我们使用 GPIO 切换来确切地查看发生了什么以及是否存在任何冲突。 如下所示、黄色波形显示了启用中断的时间。 绿色显示是否发生 ADC 中断。 在正常情况下、开始 时的波形如下:

然后、我们在开始出现问题时捕获波形、如下所示:

我们还捕获了以下问题的先前波形:

虽然在正常情况下、中断每42us 触发一次、但我们猜在问题发生时几乎同时有两个中断请求。 当第一个中断发生时、输入中断服务代码、将有代码 清除中断标志。 但是、在第二个中断发生且该中断标志未清除的同时、 代码将永远不会再次进入中断服务代码。

为了验证这一点、我们在中断中添加了一个行代码以清除中断标志、如下所示、因此有两个行代码用于清除中断标志两次、

它可以正常工作、问题得到解决。  

问题是,我们猜到的是什么,以及解释上述现象的任何原则?  对于需要在 while (1)函数中禁用和重新启用全局中断的情况、是否有任何建议?

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

    您好!

    我认为出现这个问题是因为当执行仍在 ISR 中并且仅在 ISR 开始时清除标志时、会生成另一个 ADC 中断。 当执行仍在 ISR 中时、ADC 标志会再次置1、因此不会接收到进一步的中断、因为该标志不会被清除。 您也可以通过检查 ADCINTOVF 寄存器来确认这一点。

    为了接收更多的中断、ADC 中断标志清除和 PIE 确认应该被放置在 ISR 代码的末尾。 尝试在 ADCINTFLGCLR 语句之前放置上面显示的 ePWM 特定代码和任何其他特定于定制应用的代码、并检查问题是否已解决。

    谢谢

    Vasudha

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

    Vasudha、您好!

    感谢您的回复、客户在 ISR 代码末尾清除 ADC 中断标志并确认 PIE、仍然存在此问题、只有在中断中清除 ADC 中断标志两次才能解决此问题。

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

    强、

    我同意 Vasudha 关于这一问题的潜在根本原因。  我建议客户启用 ADCINTSEL#n#寄存器中与有问题的 ADCINT 相对应的 INTxCONT 位。  这将允许 INT 继续传播到 PIE 块、即使 INT#FLG 未及时清除也是如此。

    然后、客户可以使用 ADCSOCOVF1寄存器来查看是否已发出 INT、然后客户才有机会清除该标志。  即使发生这种情况、也可以防止不产生更多 ADC 输入的情况、正如您和客户所注意到的、这会使系统处于不稳定状态。

    让我们知道上述内容是否已经解决了主要问题、如果我们需要了解不及时清除 INT 的原因、我们可以帮助进行更多调试。

    最棒的

    Matthew

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

    您好、Matthew、

    感谢您从我发布的波形中输入、是的、其根本原因似乎是因为当执行仍在 ISR 中时会生成另一个 ADC 中断、并且仅在 ISR 开始时清除标志。

    但这无法解释客户为何使用 ADCINTFLGCLR 两次清除标志、这样可以解决此问题? 这两个清除标志代码都在 ISR 开始时完成、并且在 ISR 中执行时仍有可能产生另一个 ADC 中断。

    客户在 ISR 结束时清除标志未解决此问题。

    客户更关心根本原因、而不是如何解决此问题、是否有任何其他中断机制或原则来解释此问题?


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

    您好!

    我认为这个问题仅是由中断溢出引起的。 如果发生中断溢出情况、应在 ISR 中使用以下序列来接收更多中断。

    //
    // adca1_ISR -在 ISR 中读取 ADC 缓冲
    区//
    中断 void adca1_ISR (void)
    {
    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;
    if (results_buffer_size <= resultsIndex)
    {
    resultsIndex = 0;
    bufferFull = 1;
    }
    
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
    
    //
    //检查是否发生了溢出
    //
    if (1 = AdcaRegs.ADCINTOVF.bit.ADCINT1)
    {
    AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;//清除 INT1溢出标志
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
    }
    
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
    } 

    有关更多详细信息、请参阅以下 e2e 帖子。 请参阅以下文章中发布的勘误表文档。

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/814884?tisearch=e2e-sitesearch&keymatch=ADC%20interrupt%20overflow

    我认为这就是客户代码工作的原因、因为它会清除两次 int 标志。

    谢谢

    Vasudha