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.

这个程序里面,我有几个不解: 第一,在进入中断之前,为什么没有这条代码:PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; 因为dsp复位之后ACK寄存器是1,必须写1清零,才能相应P定时器中断; 第二,在进入中断之后,为什么没有清除标志位的代码:CpuTimer0Regs.TCR.bit.TIF = 1; // 写1清0 第三,我还想扩展问一下,看门狗定时器有标志位吗?

Other Parts Discussed in Thread: TMS320F2808

在TMS320f2808的定时器这个程序里面,我有几个不解:
第一,在进入中断之前,为什么没有这条代码:PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; 因为dsp复位之后ACK寄存器是1,必须写1清零,才能相应P定时器中断;
第二,在进入中断之后,为什么没有清除标志位的代码:CpuTimer0Regs.TCR.bit.TIF = 1; // 写1清0

第三,我还想扩展问一下,看门狗定时器有标志位吗?

  • 1、进入之前要是有这行代码,等于把事件清除了,以后就进入不了中断了。
    2、PIE中断和定时中断是不一样的。
    3、多读手册,你就是高手。
  • haibing,

               第一:手册中的复位后状态为1的说法有误,应该为0,所以不需要清零。你自己用2808测试一下就知道了。

               第二:关于CPU timer中断,手册中对它的TIE中断使能是这么描述的,The CPU-Timer interrupt is enabled. If the timer decrements to zero, and TIE is set, the timer asserts its interrupt request. 即只要中断使能,只要timer 将为0就可以产生中断。所以也不需要清零。

              第三:看门狗也有标志位。

          

  • 非常感谢老师您的回答。再请问3个问题:

    1.中断标志位(包括PIE级和CPU级的)不影响“中断是否能够进入中断”,故不需清零,标志位的作用只是判断是否进入中断的作用,只是有些是自动和手动清零的;

    2.进入CPU timer中断,标志位是自动清零的还是必须手动清零的?

    3.看门狗中断标志位是哪一个?它好像和其他中断标志位不一样,我看了它只有一个看门狗中断状态位:WDINTS(是SCSR寄存器的第二位)。

    期待中...

  • Haibing,

             1,  中断标志位会影响CPU是否响应中断请求,只不过CPU级别的标志它自动清除,PIE级别的标志位需要在ISR服务函数用PIEACK指令清除,外设级别需要在ISR服务函数清除。一般来讲,大多数中断如果你没清除标志位,后续的中断请求就响应不了。

             2, 但也有例外,像CPU timer定时器,你可以看user guide > system control and interrupts一章,关于这个中断,上面说明只要CPU timer降为0,就能进入中断。但是如果你不清除标志位,标志位会一直都为1、

            3, 你说的对,我确认了一下,看门狗只有这个状态位,只能查询看门狗中断信号的状态是否有效,而且看门狗中断也不需要清除中断标志。
            所以总结一下,一般我们处理中断,我们程序要做的就是清除外设级别中断标志,用PIEACK清除PIE级别标志,这个在许多外设,比如PWM,ADC,通信模块等。另外也有一些例外,比如像timer,看门狗等。可以多参考TI的例程,然后查一下user guide,慢慢的就熟悉这些应用。
  • 正有此疑惑,感谢回答

  • Eric Ma 说:

               第一:手册中的复位后状态为1的说法有误,应该为0,所以不需要清零。你自己用2808测试一下就知道了。

    我这段时间使用2812也一直在困惑这个,幸好被您提醒了!自己观察了一下Memory窗口发现真的reset后是全0。看来连官方Reference也不能一味相信了,好惆怅