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

EQEP1_INT中断怎么只能触发一次?求大神指教

/*
* 目的:测试EQEP1_INT的中断是不是由EQEP1产生,以及是怎么产生的?
*
*/
#include "DSP2833x_Examples.h"
#include "DSP2833x_Device.h"

//函数声明
interrupt void eqep1_int(void);
void InitEqep1();
void Initeqep1Gpio();
void InitGpio();

int count=0;
int i=0;
int ii=0;

void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;

Initeqep1Gpio();
InitEqep1();
InitGpio();
InitPieVectTable();

EALLOW;
PieVectTable.EQEP1_INT=&eqep1_int;
EDIS;

PieCtrlRegs.PIEIER5.bit.INTx1=1;

IER |=M_INT5; //cpu级
EINT; //enable global interrupt INTM
ERTM; //enable global realtime interrupt DBGM

for(;;)
{ i=i+1;
}
}

void InitEqep1(void)

{
ii=ii+1;
EQep1Regs.QUPRD=1500000;// 100us

EQep1Regs.QEPCTL.bit.FREE_SOFT=1; //配置仿真器挂起模式
EQep1Regs.QEPCTL.bit.PCRM=01; //位置计数器计到最大值时复位
EQep1Regs.QEPCTL.bit.UTE=1; //使能单位定时器
EQep1Regs.QEPCTL.bit.QCLM=1; //单位时间到,锁存相应计数器值
EQep1Regs.QPOSCNT=0; //配置位置计数器初始值
EQep1Regs.QEPCTL.bit.SWI=1; //软件强制初始化位置计数器
EQep1Regs.QPOSMAX=4095; //配置最大位置计数器
EQep1Regs.QEPCTL.bit.QPEN=1; //使能位置计数器
EQep1Regs.QDECCTL.bit.QSRC=0; //正交计数模式
EQep1Regs.QEINT.bit.UTO=1;

}

void InitGpio()
{
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO25=1; //output
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0; //IO
GpioCtrlRegs.GPAPUD.bit.GPIO25=0; //上拉
EDIS;

}

interrupt void eqep1_int(void)
{
count=count+1;
if (count<=100)
{
GpioDataRegs.GPADAT.bit.GPIO25=1;
}
else
{ GpioDataRegs.GPADAT.bit.GPIO25=0;
count=0;
}
PieCtrlRegs.PIEACK.all=0x0FFF;
EQep1Regs.QCLR.bit.UTO=1; //清中断标志

}

EQEP1_INT的中断源是什么?单位超时事件和单位位置事件吗?

为什么我的中断就执行一次,count始终等于1?

真心求大神指导,谢谢

mangui zhang:

我以前遇到过的情况是 最终发现外设模块的时钟没有使能

/*
* 目的:测试EQEP1_INT的中断是不是由EQEP1产生,以及是怎么产生的?
*
*/
#include "DSP2833x_Examples.h"
#include "DSP2833x_Device.h"

//函数声明
interrupt void eqep1_int(void);
void InitEqep1();
void Initeqep1Gpio();
void InitGpio();

int count=0;
int i=0;
int ii=0;

void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;

Initeqep1Gpio();
InitEqep1();
InitGpio();
InitPieVectTable();

EALLOW;
PieVectTable.EQEP1_INT=&eqep1_int;
EDIS;

PieCtrlRegs.PIEIER5.bit.INTx1=1;

IER |=M_INT5; //cpu级
EINT; //enable global interrupt INTM
ERTM; //enable global realtime interrupt DBGM

for(;;)
{ i=i+1;
}
}

void InitEqep1(void)

{
ii=ii+1;
EQep1Regs.QUPRD=1500000;// 100us

EQep1Regs.QEPCTL.bit.FREE_SOFT=1; //配置仿真器挂起模式
EQep1Regs.QEPCTL.bit.PCRM=01; //位置计数器计到最大值时复位
EQep1Regs.QEPCTL.bit.UTE=1; //使能单位定时器
EQep1Regs.QEPCTL.bit.QCLM=1; //单位时间到,锁存相应计数器值
EQep1Regs.QPOSCNT=0; //配置位置计数器初始值
EQep1Regs.QEPCTL.bit.SWI=1; //软件强制初始化位置计数器
EQep1Regs.QPOSMAX=4095; //配置最大位置计数器
EQep1Regs.QEPCTL.bit.QPEN=1; //使能位置计数器
EQep1Regs.QDECCTL.bit.QSRC=0; //正交计数模式
EQep1Regs.QEINT.bit.UTO=1;

}

void InitGpio()
{
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO25=1; //output
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0; //IO
GpioCtrlRegs.GPAPUD.bit.GPIO25=0; //上拉
EDIS;

}

interrupt void eqep1_int(void)
{
count=count+1;
if (count<=100)
{
GpioDataRegs.GPADAT.bit.GPIO25=1;
}
else
{ GpioDataRegs.GPADAT.bit.GPIO25=0;
count=0;
}
PieCtrlRegs.PIEACK.all=0x0FFF;
EQep1Regs.QCLR.bit.UTO=1; //清中断标志

}

EQEP1_INT的中断源是什么?单位超时事件和单位位置事件吗?

为什么我的中断就执行一次,count始终等于1?

真心求大神指导,谢谢

user5215494:妈的,调试了一晚上,终于找到原因了,eQEP的中断结构里还有个全局中断标志位,你还要把那个全局中断的给复位了

赞(0)
未经允许不得转载:TI中文支持网 » EQEP1_INT中断怎么只能触发一次?求大神指教
分享到: 更多 (0)