⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 evtimer1.c

📁 用tms320c2812实现的高精度频率计
💻 C
字号:

#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
unsigned int Led_Flag;
#define	  SetData	GpioDataRegs.GPFDAT.bit.GPIOF0 = 1
#define	  ClrData   GpioDataRegs.GPFDAT.bit.GPIOF0 = 0
#define	  SetClk	GpioDataRegs.GPFDAT.bit.GPIOF2 = 1
#define	  ClrClk	GpioDataRegs.GPFDAT.bit.GPIOF2 = 0
unsigned  int  *LedReg  = (unsigned int *)0x23FF;    //LED 控制寄存器
unsigned  int  *Led8Lock = (unsigned int *)0x25FF;
const	Uint16	LedCode[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF};
const	Uint16	SpiCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
unsigned short rise = 0;
unsigned long sprd =0;
double prd_dat =0.0;
unsigned  int capnum1;
unsigned  int capnum2;
unsigned  int capnum41=0;
unsigned  int capnum42=0;
unsigned  int capnum51=0;
unsigned  int capnum52=0;
unsigned  int capnum;
unsigned long pwth = 0;
unsigned long time2count = 0;
float pinlvf[5];
double fnum=0;
unsigned int temp1;
//unsigned int ffnum=0;
extern unsigned long frequence=0; 
void display(long fre);
void display_p(long fre);
void	SendData(Uint16	data);
unsigned long fre_num=0;
unsigned int fre_ys=0;
double lowprd = 0;
unsigned long tempfre =0;
unsigned int noonehz =0,frenoone = 0;
unsigned short flagnoone =0;
double temppw = 0;
// Prototype statements for functions found within this file.
interrupt void eva_timer1_isr(void);
interrupt void eva_timer2_isr(void);
interrupt void evb_timer3_isr(void);
interrupt void evb_timer4_isr(void);
unsigned int disflag=0;
interrupt void ISRTimer0(void);
interrupt void ISRTimer1(void);
interrupt void ISRTimer2(void);

interrupt void CAP6(void);
interrupt void CAP5(void);
interrupt void CAP4(void);

// Global counts used in this example
Uint32	EvaTimer1InterruptCount;
Uint32  EvaTimer2InterruptCount;
Uint32	EvbTimer3InterruptCount;
Uint32  EvbTimer4InterruptCount;

Uint16	LedCount = 0;
Uint16	SpiCount = 0;

void main(void)
{

	/*初始化系统*/
	InitSysCtrl();

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	/*初始化PIE*/
	InitPieCtrl();

	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	
	/*初始化外设*/
    InitPeripherals();

    
	InitGpio();
	InitXIntrupt();
	
	
	EALLOW;	// This is needed to write to EALLOW protected registers
	PieVectTable.T1PINT = &eva_timer1_isr;
	PieVectTable.T2PINT = &eva_timer2_isr;
	PieVectTable.T3PINT = &evb_timer3_isr;
	PieVectTable.T4PINT = &evb_timer4_isr;
	PieVectTable.TINT0 = &ISRTimer0;
	PieVectTable.XINT13 = &ISRTimer1;
	
	PieVectTable.CAPINT6=&CAP6;
	PieVectTable.CAPINT5=&CAP5;
	PieVectTable.CAPINT4=&CAP4;
	EDIS;   // This is needed to disable write to EALLOW protected registers


	/*设置CPU*/
	ConfigCpuTimer(&CpuTimer0, 120, 1001320);	
 	StartCpuTimer0();
 	ConfigCpuTimer(&CpuTimer2, 120, 20000000);	
 	ConfigCpuTimer(&CpuTimer1, 120, 30000000);	
 //	StartCpuTimer1();
 	 PieCtrl.PIEIER1.bit.INTx7=1;
    // Enable PIE group 2 interrupt 4 for T1PINT
     PieCtrl.PIEIER2.all = M_INT4;
   //  Enable PIE group 3 interrupt 1 for T2PINT
  //  PieCtrl.PIEIER3.all = M_INT1;    
    // Enable PIE group 4 interrupt 4 for T3PINT
    //PieCtrl.PIEIER4.all = M_INT4;
    // Enable PIE group 5 interrupt 1 for T4PINT
    // PieCtrl.PIEIER5.all = M_INT1;
     //Enable PIE group 5 interrupt 7 for CAP6
//	 PieCtrl.PIEIER5.bit.INTx7=1;   //使能CAP6中断
	 PieCtrl.PIEIER5.bit.INTx6=1;   //使能CAP5中断
 	 PieCtrl.PIEIER5.bit.INTx5=1;   //使能CAP4中断
    /*开中断*/
	
    // Enable CPU INT2 for T1PINT, INT3 for T2PINT, INT4 for T3PINT
    // and INT5 for T4PINT:
//	IER |= (M_INT2 | M_INT3 | M_INT4 | M_INT5);

	IER |= (M_INT1);
	IER |= (M_INT2);
//	IER |= (M_INT4);
	IER |= M_INT5;  
	IER |= M_INT13;                //开中断13  
    // Enable global Interrupts and higher priority real-time debug events:
	
	
	lcd_init();
	clrram();
	Smenu();
	
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM

// Step 6. IDLE loop. Just sit and loop forever:	
	for(;;)
	if(disflag == 1)
		{
	//	DINT;
		tempfre = fre_num*50+fre_ys;
		if(lowprd<10)
			{
			lowprd = ((double)(1200000000.0/(3600000000-sprd)));
			tempfre = (long)(lowprd*1000000);
			}
			temppw = (long)((double)((240000000-time2count)*tempfre*360.0/(double)(120000000.0)));//(360*(240000000-time2count)*1.0/(double)(120000000.0))/(double)(1.0/tempfre);
	/*	if(flagnoone == 0)
			tempfre = fre_num*50+fre_ys;
		else
		{	
		//	if(flagnoone == 1)
				tempfre = (long)((100.0/(float)(fre_ys)));
				flagnoone =0;
		//	else
		//		tempfre = 0;
		//	flagnoone =0;
		}		*/
//		DINT;
		display(tempfre);
		display_p((long)(((1.0/(double)(tempfre))*100000000.0)+0.5));
		display_pw((long)((temppw*1000000)+0.5));
	//	EINT;
	//	disflag = 0;
		delay(100);
		
		}
} 	


// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:	
	// If local ISRs are used, reassign vector addresses in vector table as
    // shown in Step 5

interrupt void eva_timer1_isr(void)
{
	EvaTimer1InterruptCount++;

    // Enable more interrupts from this timer
	EvaRegs.EVAIMRA.bit.T1PINT = 1;
	frequence++;
//	frenoone = noonehz;
//	noonehz =0 ;
//	flagnoone =1;
	// Note: To be safe, use a mask value to write to the entire
	// EVAIFRA register.  Writing to one bit will cause a read-modify-write
	// operation that may have the result of writing 1's to clear 
	// bits other then those intended. 
    EvaRegs.EVAIFRA.all = BIT7;
	// Acknowledge interrupt to recieve more interrupts from PIE group 2
	PieCtrl.PIEACK.all = PIEACK_GROUP2;
//	*LedReg = LedCode[LedCount];
//	LedCount++;
//	if (LedCount>=8)	LedCount = 0;	
}

interrupt void eva_timer2_isr(void)
{
	EvaTimer2InterruptCount++;

    // Enable more interrupts from this timer
	EvaRegs.EVAIMRB.bit.T2PINT = 1;
	
	// Note: To be safe, use a mask value to write to the entire
	// EVAIFRB register.  Writing to one bit will cause a read-modify-write
	// operation that may have the result of writing 1's to clear 
	// bits other then those intended. 
    EvaRegs.EVAIFRB.all = BIT0;
	
	// Acknowledge interrupt to recieve more interrupts from PIE group 3
	PieCtrl.PIEACK.all = PIEACK_GROUP3;
//	SendData(SpiCode[SpiCount]);
//	SpiCount++;
//	if	(SpiCount>=16)	SpiCount = 0;
}

interrupt void evb_timer3_isr(void)
{
	EvbTimer3InterruptCount++;
//	ffnum++;
	// Note: To be safe, use a mask value to write to the entire
	// EVBIFRA register.  Writing to one bit will cause a read-modify-write
	// operation that may have the result of writing 1's to clear 
	// bits other then those intended. 
    EvbRegs.EVBIFRA.all = BIT7;	
	
	// Acknowledge interrupt to recieve more interrupts from PIE group 4
	PieCtrl.PIEACK.all = PIEACK_GROUP4;

}

interrupt void evb_timer4_isr(void)
{
	EvbTimer4InterruptCount++;
//	ffnum++;
	// Note: To be safe, use a mask value to write to the entire
	// EVBIFRB register.  Writing to one bit will cause a read-modify-write
	// operation that may have the result of writing 1's to clear 
	// bits other then those intended. 
    EvbRegs.EVBIFRB.all = BIT0;	
	
	// Acknowledge interrupt to recieve more interrupts from PIE group 5
	PieCtrl.PIEACK.all = PIEACK_GROUP5;

}


interrupt void ISRTimer2(void)
{
	CpuTimer2.InterruptCount++;
	if(Led_Flag == 1)
	{
	//	*LedReg = 0xAA;
		Led_Flag = 0;
	}
	else
	{
	//	*LedReg = 0x55;
		Led_Flag = 1;
	}
	
	frequence =0;
}


interrupt void ISRTimer1(void)
{
	CpuTimer2.InterruptCount++;
	if(Led_Flag == 1)
	{
	//	*LedReg = 0xAA;
		Led_Flag = 0;
	}
	else
	{
	//	*LedReg = 0x55;
		Led_Flag = 1;
	}
	
	frequence =0;
}


interrupt void ISRTimer0(void)
{
	PieCtrl.PIEACK.bit.ACK7=1;
	fre_num = frequence;
	fre_ys = EvaRegs.T1CNT;
	//noonehz++;
	if(fre_ys != 0)
		EvaRegs.T1CNT = 0;
	/*if((fre_ys ==1)&&(noonehz >1))
		{
			fre_ys = noonehz;
			noonehz =0;
			flagnoone =1;
			EvaRegs.T1CNT =0;
		}*/
	
	disflag=1;
//	*LedReg = LedCode[LedCount];
//	LedCount++;
//	if (LedCount>=8)	LedCount=0;
	
	frequence =0;
	
}


interrupt void CAP6(void)
{      
       unsigned int temp;
       EvbRegs.EVBIFRC.bit.CAP6INT=1;// 清捕获中断1标志位
    if( EvbRegs.CAPFIFOB.bit.CAP6FIFO==3)
        {
        	capnum1=EvbRegs.CAP6FIFO;  
          	capnum2=EvbRegs.CAP6FIFO;
 /*        if(capnum2 > capnum1)
              temp = capnum2-capnum1;
         else
              temp = capnum2+(0xFFFF-capnum1);
       pinlvf[fnum++] =temp;
       if(fnum>4) fnum=0;//取5个数值后回零
       f= 1875000.0/(float)temp;*/
         }
    PieCtrl.PIEACK.bit.ACK5 = 1;//开外设中断应答     
          
}


interrupt void CAP5(void)
{      
       unsigned int temp,tempcapedge =0;
       EvbRegs.EVBIFRC.bit.CAP6INT=1;// 清捕获中断1标志位

      	  
      	  StartCpuTimer2();
      	  ReloadCpuTimer2();
//      	  capnum51=EvbRegs.CAP5FIFO;
//          capnum52=EvbRegs.CAP5FIFO;
      	  if(rise==0)
      	  	{
      	  	ReloadCpuTimer1();
      	  	StartCpuTimer1();
      	  	rise =1;
      	  	}
      	  else
      	  {
      	  //	ReloadCpuTimer1();
      	  	StopCpuTimer1();
      	  	sprd = ReadCpuTimer1Counter();
      	  	rise =0;
      	  //	prd_dat = (double)(240000000-sprd);
      	  }

		
 /*        if(capnum52 > capnum51)
              temp = capnum52-capnum51;
         else
              temp = capnum52+(0xFFFF-capnum51);
       pinlvf[fnum++] =temp;
       if(fnum>4) fnum=0;//取5个数值后回零
       f= 1875000.0/(float)temp;*/
//       ffnum =0;
       PieCtrl.PIEACK.bit.ACK5 = 1;//开外设中断应答     
          
}
//extern struct CPUTIMER_VARS CpuTimer2;
interrupt void CAP4(void)
{      
       unsigned int temp,tempcapedge =0;
       EvbRegs.EVBIFRC.bit.CAP6INT=1;// 清捕获中断1标志位
		CpuTimer2.RegsAddr = &CpuTimer2Regs;
      	  
//          capnum41=EvbRegs.CAP4FIFO;
//          capnum42=EvbRegs.CAP4FIFO;
         // capnum1=capnum2;
         StopCpuTimer2();
        // time2count=240000000-ReadCpuTimer2Counter();
		 time2count=ReadCpuTimer2Counter();
		
   	//	pwth = capnum41-capnum51+ffnum*65535;
      // f= 1875000.0/(float)temp;
//       ffnum=0;
       PieCtrl.PIEACK.bit.ACK5 = 1;//开外设中断应答     
          
}

void	Delay(Uint16  data)
{
	Uint16	i;
	for (i=0;i<data;i++) { ; }	
}	
void	SendData(Uint16 data)
{
	Uint16	i,Temp;
	Temp = 0x80;
	for	(i=0;i<8;i++)
		{
			if ((data & Temp)==0)	ClrData;
			else	SetData;
			Temp >>= 1;
			ClrClk;
			Delay(10);
			SetClk;
		}
	*Led8Lock = 0xB7;
	Delay(10);	
	*Led8Lock = 0xBF;
	SetData;		
}		



//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -