大家好、
我的客户面临一个问题、即在 他们的应用代码 中有时无法进入 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)函数中禁用和重新启用全局中断的情况、是否有任何建议?






