This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

输出占空比可变的PWM波形,为什么程序总是进不到中断里面?



  输出占空比可变的PWM波形,程序无错误,但是输出的波形占空比保持不变,检查了一下原因,程序进不到中断里面,但是在怎么找原因也没找到?求助各位大神!

主函数

#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
Uint32 intcount;
int increase;
int decrease;
//interrupt void myT1PINT(void);
void main(void)
{
/*初始化系统*/
InitSysCtrl();

/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;

/*初始化PIE控制寄存器*/
InitPieCtrl();

/*初始化PIE矢量表*/
InitPieVectTable();

/*初始化EV*/
InitEv();
InitGpio();

intcount=0;
increase=0;
decrease=1;

PieCtrl.PIEIER2.bit.INTx4=1;
IER|=M_INT2;
EINT;
ERTM;
EvaRegs.T1CON.bit.TENABLE=1; //使能定时器T1计数操作


while(1)
{

}

}

系统初始化

#include "DSP28_Device.h"


void InitSysCtrl(void)
{
Uint16 i;
EALLOW;


SysCtrlRegs.WDCR= 0x0068; //禁止看门狗模块

// Initalize PLL
SysCtrlRegs.PLLCR = 0xA;
// Wait for PLL to lock
for(i= 0; i< 5000; i++){} //延时,使得PLL模块能够完成初始化操作

// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
SysCtrlRegs.HISPCP.all = 0x0001; //HSPCLK=150MHZ/2=75MHz
SysCtrlRegs.LOSPCP.all = 0x0002; //LSPCLK=150MHZ/4=37.5MHz
// Peripheral clock enables set for the selected peripherals.
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; //使能EVA的时钟
// SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; //使能EVB的时钟
// SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;
// SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;

EDIS;

}

void KickDog(void)

{
EALLOW;
SysCtrlRegs.WDKEY = 0x0055;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
}

GPIO设置

#include "DSP28_Device.h"

EALLOW;

GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1;

EDIS;

}

EVA设置

#include "DSP28_Device.h"


void InitEv(void)
{
//EVA模块
EvaRegs.T1CON.bit.TMODE = 1; //连续增模式
EvaRegs.T1CON.bit.TPS = 1; //T1CLK=HSPCLK/2=37.5MHz
EvaRegs.T1CON.bit.TENABLE = 0; //暂时禁止T1计数
EvaRegs.T1CON.bit.TCLKS10 = 0; //使用内部时钟T1CLK
EvaRegs.T1CON.bit.TECMPR = 1; //使能定时器比较操作

EvaRegs.T1PR =0x493E; //1KHz的PWM,周期为1ms

EvaRegs.T1CNT =0;

EvaRegs.COMCONA.bit.CENABLE =1; //使能比较单元的比较操作
EvaRegs.COMCONA.bit.FCOMPOE =1; //全比较输出,PWM1~6引脚均由相应的比较逻辑驱动
EvaRegs.COMCONA.bit.CLD =2; //立即中断
//死去时间为:2.1333us
EvaRegs.DBTCONA.bit.DBT =10; //死区定时器周期,m=10
EvaRegs.DBTCONA.bit.EDBT1 =1; //死区定时器1使能位

EvaRegs.DBTCONA.bit.DBTPS =4; //死区定时器预定标因子Tab=37.5MHz/16=2.34MHz
EvaRegs.ACTR.all =0x0666; //设定引脚PWM1~6的动作属性,PWM1、3、5为低电平,PWM2、4、6为低电平
EvaRegs.CMPR1 =0x41EB; //PWM1占空比为40%
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1;


}

中断设置

#include "DSP28_Device.h"

extern Uint32 intcount;
extern int increase;
extern int decrease;
interrupt void T1PINT_ISR(void) // EV-A
{

if(intcount>=1000)
{
if((increase==1)&&(decrease==0))
{
EvaRegs.CMPR1=EvaRegs.CMPR1+938;
if(EvaRegs.CMPR1>=0x41EB)
{
EvaRegs.CMPR1=0x41EB;
increase=0;
decrease=1;
}
}

if((increase==0)&&(decrease==1))
{
EvaRegs.CMPR1=EvaRegs.CMPR1-938;
if(EvaRegs.CMPR1<=0x0753)
{
EvaRegs.CMPR1=0x0753;
increase=1;
decrease=0;
}
}

intcount=0;
}
PieCtrl.PIEACK.all=PIEACK_GROUP1;
EvaRegs.EVAIFRA.bit.T1PINT=1;
EINT;
}