/*
* 目的:测试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; //清中断标志
}
根据EQep1Regs.QUPRD=1500000;// 100us知道设置的EQEP1_INT的中断周期是100us。
请问:在该程序中怎么去验证它的中断中期是100us??谢谢
HeiHei:
看您在中断处理程序中对gpio25做了处理 你可以通过示波器看一下gpio25的输出波形 看是否和你设置的一致
/*
* 目的:测试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; //清中断标志
}
根据EQep1Regs.QUPRD=1500000;// 100us知道设置的EQEP1_INT的中断周期是100us。
请问:在该程序中怎么去验证它的中断中期是100us??谢谢
songtao huang:
回复 HeiHei:
你好!我做了测试,eqep1_int中断服务函数中count每增加1,消耗的时钟个数是56个,那就是56*6.67ns=373.52ns。但是我设置的是100us,难道不是每100us增加一次吗?
不知道我的理解出错在哪里?希望您指出?
如果有更简单的方法去验证中断的周期,望指点,谢谢
/*
* 目的:测试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; //清中断标志
}
根据EQep1Regs.QUPRD=1500000;// 100us知道设置的EQEP1_INT的中断周期是100us。
请问:在该程序中怎么去验证它的中断中期是100us??谢谢
HeiHei:
回复 songtao huang:
最简单的 你每进一次中断,将gpio25取反一下(toggle),然后示波器看gpio25的输出波形。还有一中方法就是在中断程序里第一条指令打个断点,使能ccs的clock功能,看每进一次中断用了多少clock
/*
* 目的:测试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; //清中断标志
}
根据EQep1Regs.QUPRD=1500000;// 100us知道设置的EQEP1_INT的中断周期是100us。
请问:在该程序中怎么去验证它的中断中期是100us??谢谢
songtao huang:
回复 songtao huang:
结果正常,是20ms。程序是我注释错了,不好意思