TI中文支持网
TI专业的中文技术问题搜集分享网站

C28346的eCAP中断

各位开发者:

    大家好。我使用C28346的eCAP1进行外部信号的上升沿捕捉,在GPIO24管脚上有一个20MHz的时钟信号,我在eCAP1的中断函数中进行计数。参考了TI提供的eCAP的例程,发现eCAP工作在One-shot模式下,我现在把其改成了连续模式,发现中断只执行一次就停止了,寄存器的配置如下:

   ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture interrupts
   ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags
   ECap1Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped
     // Configure peripheral registers
   ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;      //
   ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;        // Stop at 4 events
   ECap1Regs.ECCTL1.bit.CAP1POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP2POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP3POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP4POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CTRRST1 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST2 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST3 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST4 = 0;          // Difference operation
   ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;         // Enable sync in
   ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;        // Pass through
   // ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture units

   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
   ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable CAP1-CAP4 register loads
   ECap1Regs.ECEINT.bit.CEVT4 = 1;            // 4 events = interrupt

请教下原因是什么?该如何才能让eCAP工作在连续模式下进行中断?

shen liu:

问题解决了,在中断服务程序中添加:

ECap1Regs.ECCLR.bit.CEVT4 = 1; ECap1Regs.ECCLR.bit.INT = 1;

尴尬。。。

各位开发者:

    大家好。我使用C28346的eCAP1进行外部信号的上升沿捕捉,在GPIO24管脚上有一个20MHz的时钟信号,我在eCAP1的中断函数中进行计数。参考了TI提供的eCAP的例程,发现eCAP工作在One-shot模式下,我现在把其改成了连续模式,发现中断只执行一次就停止了,寄存器的配置如下:

   ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture interrupts
   ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags
   ECap1Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped
     // Configure peripheral registers
   ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;      //
   ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;        // Stop at 4 events
   ECap1Regs.ECCTL1.bit.CAP1POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP2POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP3POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP4POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CTRRST1 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST2 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST3 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST4 = 0;          // Difference operation
   ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;         // Enable sync in
   ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;        // Pass through
   // ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture units

   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
   ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable CAP1-CAP4 register loads
   ECap1Regs.ECEINT.bit.CEVT4 = 1;            // 4 events = interrupt

请教下原因是什么?该如何才能让eCAP工作在连续模式下进行中断?

Eric Ma:

回复 shen liu:

外设中断标志记得需要在中断中清除,同时清除PIE中断标志。

Eric

各位开发者:

    大家好。我使用C28346的eCAP1进行外部信号的上升沿捕捉,在GPIO24管脚上有一个20MHz的时钟信号,我在eCAP1的中断函数中进行计数。参考了TI提供的eCAP的例程,发现eCAP工作在One-shot模式下,我现在把其改成了连续模式,发现中断只执行一次就停止了,寄存器的配置如下:

   ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture interrupts
   ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags
   ECap1Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped
     // Configure peripheral registers
   ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;      //
   ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;        // Stop at 4 events
   ECap1Regs.ECCTL1.bit.CAP1POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP2POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP3POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP4POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CTRRST1 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST2 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST3 = 0;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST4 = 0;          // Difference operation
   ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;         // Enable sync in
   ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;        // Pass through
   // ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture units

   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
   ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable CAP1-CAP4 register loads
   ECap1Regs.ECEINT.bit.CEVT4 = 1;            // 4 events = interrupt

请教下原因是什么?该如何才能让eCAP工作在连续模式下进行中断?

shen liu:

回复 Eric Ma:

Eric Ma,你好,外设中断标志和PIE中断标志,我跟踪IFR寄存器和PIEIFR寄存器发现,是自动清除的,而且IER和PIEIER也会自动清除,这是什么原因啊?

赞(0)
未经允许不得转载:TI中文支持网 » C28346的eCAP中断
分享到: 更多 (0)