/*
* 目的:测试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的中断结构里还有个全局中断标志位,你还要把那个全局中断的给复位了