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

F2808 ECap的上升沿中断无法捕捉到

我的程序如下,使用GPIO24/25/26作为ECap输入捕获,进行ECap1/2/3通道的设置,发现只有ECap1/2可以捕捉到上升沿中断和下降沿中断,ECap3只能捕捉下降沿中断,上升沿中断不进入中断函数。用示波器测引脚,电平是正确的。不知道有没有人遇到这个问题。

代码如下:

/* ***********************************************************************
* Ecap端口配置
* Hall_1 -> CAP1 -> GPIO24
* Hall_2 -> CAP2 -> GPIO25
* Hall_3 -> CAP3 -> GPIO26
* ***********************************************************************/
void InitEcapGpio()
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0; //设置为上拉
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1; //设置为ECAP引脚
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO24 = 0; //设置为输入模式
GpioCtrlRegs.GPADIR.bit.GPIO25 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO26 = 0;
EDIS;
}

/* ***********************************************************************
* Ecap寄存器设置
* 捕获上升沿以及下降沿
* ***********************************************************************/
void InitECapture()
{
//ECAP1 Config
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; // 0:Operate in continuous mode;1:One-shot
ECap1Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events,在第一次中断事件中响应
ECap1Regs.ECCTL1.bit.CAP1POL = 1; // Rising edge
ECap1Regs.ECCTL1.bit.CAP2POL = 0; // falling edge
ECap1Regs.ECCTL1.bit.CTRRST1 = 0; // 禁止重新计数
ECap1Regs.ECCTL1.bit.CTRRST2 = 0; // 禁止重新计数
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // Enable sync in
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2; // 旁路时钟
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // 使能捕获单元 Enable capture units

ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
ECap1Regs.ECCTL1.bit.PRESCALE = 0; // 不分频
ECap1Regs.ECCTL2.bit.CAP_APWM = 0; // 运行在CAP模式下
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // 开启计数器
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap1Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
//ECAP2 Config
ECap2Regs.ECEINT.all = 0x0000; // 禁止所有捕获中断Disable all capture interrupts
ECap2Regs.ECCLR.all = 0xFFFF; // 清除所有中断标志Clear all CAP interrupt flags
ECap2Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads
ECap2Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped
// Configure peripheral registers
ECap2Regs.ECCTL2.bit.CAP_APWM = 0; // 运行在CAP模式下
ECap2Regs.ECCTL2.bit.CONT_ONESHT = 0; // 0:Operate in continuous mode;1:One-shot
ECap2Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events,在第一次中断事件中响应
ECap2Regs.ECCTL1.bit.CAP1POL = 1; // Rising edge
ECap2Regs.ECCTL1.bit.CAP2POL = 0; // falling edge
ECap2Regs.ECCTL1.bit.CTRRST1 = 0; // 禁止重新计数
ECap2Regs.ECCTL1.bit.CTRRST2 = 0; // 禁止重新计数
ECap2Regs.ECCTL2.bit.SYNCI_EN = 0; // Enable sync in
ECap2Regs.ECCTL2.bit.SYNCO_SEL = 2; // 旁路时钟
ECap2Regs.ECCTL1.bit.CAPLDEN = 1; // 使能捕获单元 Enable capture units

ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
ECap2Regs.ECCTL1.bit.PRESCALE = 0; // 不分频
ECap2Regs.ECCTL2.bit.TSCTRSTOP = 0;
ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1; // 开启计数器
ECap2Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap2Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
//ECAP3 Config
ECap3Regs.ECEINT.all = 0x0000; // 禁止所有捕获中断Disable all capture interrupts
ECap3Regs.ECCLR.all = 0xFFFF; // 清除所有中断标志Clear all CAP interrupt flags
ECap3Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads
ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped
// Configure peripheral registers
ECap3Regs.ECCTL2.bit.CONT_ONESHT = 0; // 0:Operate in continuous mode;1:One-shot
ECap3Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events,在第一次中断事件中响应
ECap3Regs.ECCTL1.bit.CAP1POL = 1; // Rising edge
ECap3Regs.ECCTL1.bit.CAP2POL = 0; // falling edge
ECap3Regs.ECCTL1.bit.CTRRST1 = 0; // 禁止重新计数
ECap3Regs.ECCTL1.bit.CTRRST2 = 0; // 禁止重新计数
ECap3Regs.ECCTL2.bit.SYNCI_EN = 0; // Enable sync in
ECap3Regs.ECCTL2.bit.SYNCO_SEL = 2; // 旁路时钟
ECap3Regs.ECCTL1.bit.CAPLDEN = 1; // 使能捕获单元 Enable capture units

ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
ECap3Regs.ECCTL1.bit.PRESCALE = 0; // 不分频
ECap3Regs.ECCTL2.bit.CAP_APWM = 0; // 运行在CAP模式下
ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0; ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1; // 开启计数器
ECap3Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap3Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
}

interrupt void ecap3_isr()
{
HallSensorRead();

//清除中断标志
ECap3Regs.ECCLR.bit.CEVT1 = 1;
ECap3Regs.ECCLR.bit.INT = 1; //清除全局中断标志
ECap3Regs.ECCTL2.bit.REARM = 1; //One-Shot Re-Arming Control,
// Acknowledge this interrupt to receive more interrupts from group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}

赞(0)
未经允许不得转载:TI中文支持网 » F2808 ECap的上升沿中断无法捕捉到
分享到: 更多 (0)