Other Parts Discussed in Thread: F29H859TU-Q1
器件型号: F29H859TU-Q1
您好的团队、
我向我的客户询问这个问题。
我们的 TRM 中说明了建议的中断处理过程、表明它应该在从 ISR 返回之前清除中断标志

在我们的 PWM、ADC 和其他外设中断演示中、它应该在退出 ISR 之前清除 INT 标志

但不能清除计时器中断标志

您能解释一下吗? 谢谢
BRS
Shuqing
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.
Other Parts Discussed in Thread: F29H859TU-Q1
器件型号: F29H859TU-Q1
您好的团队、
我向我的客户询问这个问题。
我们的 TRM 中说明了建议的中断处理过程、表明它应该在从 ISR 返回之前清除中断标志

在我们的 PWM、ADC 和其他外设中断演示中、它应该在退出 ISR 之前清除 INT 标志

但不能清除计时器中断标志

您能解释一下吗? 谢谢
BRS
Shuqing
尊敬的 Shuqing:
F29H859TU-Q1 上的 CPU 计时器使用硬件自动清除机制 — 当中断控制器在进入 ISR 时确认中断时、计时器溢出标志会自动清除。 这就是为什么与 PWM、ADC 和其他外设演示不同、计时器演示代码不包含显式标志清除代码[1]。
这是 硬件设计差异、而不是为了疏忽演示代码。
|
在一起
|
标志清除
|
原因
|
|---|---|---|
|
CPU 计时器
|
自动(硬件)
|
溢出标志在中断确认时自动清除
|
|
PWM (ePWM)
|
手动(软件)
|
跳闸/事件标志持续存在、直到通过 TZCLR 寄存器明确清除[2]
|
|
挑战
|
手动(软件)
|
事件标志需要软件设置清除位;如果两者同时发生、则硬件具有优先级[3]
|
|
LIN
|
手动(软件)
|
必须清除 SCIFLR 标志、验证其是否已清除、然后清除全局中断[4]
|
对于 ADC 等外设,标志会被锁存 — 这些标志保持设置状态,直到软件明确将其清除。 如果您不清除它们、则不会再生成该类型的中断[3]。 相比之下、CPU 计时器在硬件中自动处理此操作、从而简化了 ISR 实现。
也就是说、DriverLib 确实 提供了 CPUTimer_clearOverflowFlag() 是否需要手动清除[1]。 通用 C29x 中断编码器模板仍包含注释、 // Ensure to clear all interrupt flags 以此提醒需要它的外设[5]。
对于生产代码、遵循 TRM 建议的中断处理序列仍然是一种很好的做法。 虽然 CPU 计时器自动清除其标志、但显式调用 CPUTimer_clearOverflowFlag() 不会增加任何危害、并使代码自记录并与其他外设 ISR 保持一致。
为了帮助完善这项建议、了解以下信息会有所帮助:
资源:
此致、
Zackary Fleenor
尊敬的 Shuqing:
在 CPU 计时器模块的 TCR(计时器控制寄存器)字段说明中可以找到相关的 TRM 语句。 具体而言、 F29H85x TRM 的表 2-578 中的 TIF(计时器溢出标志)位说明指出:
“TIF 不会自动清除、无需清除即可启用下一个计时器中断。“ [1]
我需要澄清前一个答复中的一些重要内容。 TRM 没有 以所述方式描述“硬件自动清除“机制。 相反、TRM 中记录的实际行为是:
|
方面
|
TRM 说什么
|
|---|---|
|
自动清除?
|
否—“不自动清除 TIF “[1]
|
|
下一个中断需要?
|
否—“无需清除即可启用下一个计时器中断“[1]
|
|
如何手动清除
|
将 1 写入 TIF 位(R/W1C 类型)[1]
|
因此、计时器演示代码 不清除中断标志的原因不是 因为它会自动清除、而是因为 清除它并不是计时器生成后续中断的必要条件。 该标志是一个状态指示器、在您明确将其清除之前一直存在、但与 PWM/ADC 标志不同、保持该标志置位 不 会阻止未来的计时器中断[1]。
这是关键的硬件设计差异:对于 ePWM 和 ADC 等外设、必须清除中断标志、否则外设不会产生另一个中断。 对于 CPU 计时器、中断机制独立于 TIF 标志状态运行。
您可以在 CPU 计时器一章中找到这一点、特别是:
CPUTimer_clearOverflowFlag() 如果客户希望出于状态跟踪目的清除 TIF、则可以使用 DriverLib 函数、但它在功能上是可选的、以生成中断。
为了帮助进一步完善这一点、了解以下内容会有所帮助:
此致、
Zackary Fleenor