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

📄 initial.c

📁 一个很全面的TMS320F2812的最小系统的工程
💻 C
📖 第 1 页 / 共 3 页
字号:
{

	asm("  EALLOW");
	
/* Configure eCAN RX and TX pins for eCAN transmissions using eCAN regs*/  
    
	ECanaRegs.CANMC.bit.CCR = 1 ;            // Set CCR = 1
    
	while(ECanaRegs.CANES.bit.CCE != 1 ) {}   // Wait for CCE bit to be set..


	ECanaRegs.CANTIOC.bit.TXFUNC = 1;
	ECanaRegs.CANRIOC.bit.RXFUNC = 1;   

/* Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31) */
									// HECC mode also enables time-stamping feature
	ECanaRegs.CANMC.bit.SCB = 1;		
	
	ECanaRegs.CANBTC.bit.BRPREG = 9;
	ECanaRegs.CANBTC.bit.TSEG2REG = 2;
	ECanaRegs.CANBTC.bit.TSEG1REG = 10;  
	
	ECanaRegs.CANMC.bit.CCR = 0 ;             // Set CCR = 0
	while(ECanaRegs.CANES.bit.CCE == !0 ) {}   // Wait for CCE bit to be cleared..
			
	while(ECanaRegs.CANBTC.bit.TSEG2REG ==0 || ECanaRegs.CANBTC.bit.TSEG1REG == 0){}
	
	

/* Initialize all bits of 'Master Control Field' to zero */
// Some bits of MCF register come up in an unknown state. For proper operation,
// all bits (including reserved bits) of MCF must be initialized to zero
 
    ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;

// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
//	as a matter of precaution. 

/* Clear all TAn bits */      
	
	ECanaRegs.CANTA.all	= 0xFFFFFFFF;

/* Clear all RMPn bits */      
	
	ECanaRegs.CANRMP.all = 0xFFFFFFFF;
	
/* Clear all interrupt flag bits */      
	
	ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
	ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
	
/* Configure bit timing parameters */

//	ECanaRegs.CANMC.bit.CCR = 1 ;            // Set CCR = 1
//    
//    while(ECanaRegs.CANES.bit.CCE != 1 ) {}   // Wait for CCE bit to be set..
//    
//    ECanaRegs.CANBTC.bit.BRPREG = 9;
//    ECanaRegs.CANBTC.bit.TSEG2REG = 2;
//    ECanaRegs.CANBTC.bit.TSEG1REG = 10;  
//    
//    ECanaRegs.CANMC.bit.CCR = 0 ;             // Set CCR = 0
//    while(ECanaRegs.CANES.bit.CCE == !0 ) {}   // Wait for CCE bit to be cleared..
	
/* Disable all Mailboxes  */
	
 	ECanaRegs.CANME.all = 0;		// Required before writing the MSGIDs
	
}

/*-----------------------------------------------------------------------------
Name:	sADCalibration

Function:	AD calibration

Execute frequency:	only once after power on reset

-----------------------------------------------------------------------------*/
void   sADCalibration(void)
{
	unsigned long  wChannelSum[16];
		 long  Ltemp=27951104;
	unsigned int   wSampleCnt;
	volatile unsigned int  *wP1;
		 int    k;
		 /*int 	wREF125A;
		 int 	wREF250A;*/
		 int 	wREF125B;
		 int 	wREF250B;
	
	//static int wInvVoltMidPointValueSet;		//030327 hanson
	//static int wInvDcVoltMidPointValueSet;	//030327 hanson
	
	wP1=(volatile unsigned int   *)0x7108;		//pointer to Result 0
		
	hoAD_SW1=1;
	hoAD_SW2=0;
	
	DelayUs(20000);
	DelayUs(20000);	
	DelayUs(20000);
	DelayUs(20000);	
						
	DelayUs(312);                   		// Delay 10us
	for(k=0;k<16;k++) wChannelSum[k]=0;		//clear buffer
	for(wSampleCnt=0;wSampleCnt<32;wSampleCnt++)
	{
		AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;		//Start AD convert
		
		asm(" RPT #110 || NOP");
		while(AdcRegs.ADCST.bit.SEQ1_BSY==1);	//wait convert 
		asm(" RPT #110 || NOP");
		for(k=0;k<16;k++)
		{
			wChannelSum[k]+=(*(wP1+k))>>4;	//read & sum AD result
		}
		AdcRegs.ADCTRL2.bit.RST_SEQ1=1;		//reset to AD channel 0

	}
	
	wREF125A=(int)((long)wChannelSum[6]>>5);
	wREF250A=(int)((long)wChannelSum[7]>>5);
	
	wREF125B=(int)((long)wChannelSum[14]>>5);
	wREF250B=(int)((long)wChannelSum[15]>>5);
	
	
	//wADCCoefB=wREF250A;
	wADCCoefA=(int)(Ltemp/(long)(wREF250A-wREF125A));
	wADCCoefB=(int)(Ltemp/(long)(wREF250B-wREF125B));	
	
	wADCOffsetA=2*wREF125A-wREF250A;
	wADCOffsetB=2*wREF125B-wREF250B;
		
	hoAD_SW1=1;
	hoAD_SW2=1;
	
	DelayUs(312);                   		// Delay 10us
	for(k=0;k<16;k++) wChannelSum[k]=0;		//clear buffer
	for(wSampleCnt=0;wSampleCnt<32;wSampleCnt++)
	{
		AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;		//Start AD convert
	
		while(AdcRegs.ADCST.bit.SEQ1_BSY==1);	//wait convert 
		asm(" RPT #110 || NOP");
		for(k=0;k<16;k++)
		{
			wChannelSum[k]+=(*(wP1+k))>>4;	//read & sum AD result
		}
		AdcRegs.ADCTRL2.bit.RST_SEQ1=1;		//reset to AD channel 0

	}
	
	//ac signal channel calibration
	wR_IsP_Bias=(int)((long)wChannelSum[3]>>5);
	wR_IsN_Bias=(int)((long)wChannelSum[4]>>5);
	wS_IsP_Bias=(int)((long)wChannelSum[5]>>5);
	wS_IsN_Bias=(int)((long)wChannelSum[8]>>5);
	wT_IsP_Bias=(int)((long)wChannelSum[9]>>5);
	wT_IsN_Bias=(int)((long)wChannelSum[10]>>5);
		
	hoAD_SW1=0;	
	hoAD_SW2=1;
	DelayUs(312);                   		// Delay 10us
	for(k=0;k<16;k++) wChannelSum[k]=0;		//clear buffer
	for(wSampleCnt=0;wSampleCnt<32;wSampleCnt++)
	{
		AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;		//Start AD convert
	
		while(AdcRegs.ADCST.bit.SEQ1_BSY==1);	//wait convert 
		asm(" RPT #110 || NOP");
		for(k=0;k<16;k++)
		{
			wChannelSum[k]+=(*(wP1+k))>>4;	//read & sum AD result
		}

		AdcRegs.ADCTRL2.bit.RST_SEQ1=1;		//reset to AD channel 0
		
		DelayUs(625);                   	// Delay 20us
	}
	
	//ac signal channel calibration
	
	wRInvVoltSampleMidPoint=(int)(wChannelSum[0]>>5);               
	wSInvVoltSampleMidPoint=(int)(wChannelSum[1]>>5);               
	wTInvVoltSampleMidPoint=(int)(wChannelSum[2]>>5);               
	wRInvLCurrSampleMidPoint=(int)(wChannelSum[3]>>5);               
	wSInvLCurrSampleMidPoint=(int)(wChannelSum[4]>>5);               
	wTInvLCurrSampleMidPoint=(int)(wChannelSum[5]>>5);               
	wSInvDcVoltSampleMidPoint=(int)(wChannelSum[6]>>5);               
	wRInvDcVoltSampleMidPoint=(int)(wChannelSum[7]>>5);               
	wRLoadCurrentSampleMidPoint=(int)(wChannelSum[8]>>5);		
	wSLoadCurrentSampleMidPoint=(int)(wChannelSum[9]>>5);		
	wTLoadCurrentSampleMidPoint=(int)(wChannelSum[10]>>5);		
	wTInvDcVoltSampleMidPoint=(int)(wChannelSum[15]>>5);               
}

/*********************************************************************
* Function: DelayUs()                                                *
* Description: Implements a time delay.                              *
* DSP: TMS320F2812                                                   *
* Last Modified: 06/28/02                                            *
* Include files: none                                                *
* Function Prototype: void DelayUs(volatile Uint16)                  *
* Useage: DelayUs(Usec);                                             *
* Input Parameters: Uint16 Usec = time delay in microseconds         *
* Return Value: none                                                 *
* Notes: The execution time of this routine is rough, based upon a   *
*        150MHz CPUCLK.  It has been tested using all optimization   *
*        levels of the compiler to give approximately a 1us inner    *
*        loop.                                                       *   
*********************************************************************/
void DelayUs( volatile unsigned int Usec )
{
    while( Usec-- )					// 1us loop at 150MHz CPUCLK
	{
		asm(" RPT #139 || NOP");
	}

} // end DelayUs()


INT16U swGetUpsInputModule(void)
{
	return(wInputModule);	
}

INT16U swGetUpsOutputModule(void)
{
	return(wOutputModule);	
}


void	sSysFreqInit(void)
{
	INT16U wSysFreqDetectCnt=90;
	INT16U wSysFreqChkTime=30;
	INT16U wInputPeriod;
	
	while(wSysFreqChkTime>0)
	{
		if(swGetSinePoint()<4)
		{
			wInputPeriod=swGetLinePeriodNew();
			wSysFreqChkTime--;
			if(wInputPeriod>=cPeriod55Hz && wInputPeriod<cPeriod40Hz)
				wSysFreqDetectCnt--;	//50Hz
			if(wInputPeriod<cPeriod55Hz && wInputPeriod>cPeriod70Hz)
				wSysFreqDetectCnt++;	//60Hz
			while(swGetSinePoint()<300){}
		}	
	}
	if(swGetEEConvertMode()==true)
	{
		if(swGetEepromInverterPS()==cDSPPeriod50Hz)
		{
			sSet50HzParameter();
			sSetEepromInverterPS(cFreq50Hz);			
		}
		else if(swGetEepromInverterPS()==cDSPPeriod60Hz)
		{
			sSet60HzParameter();	
			sSetEepromInverterPS(cFreq60Hz);
		}
	}
	else if(wSysFreqDetectCnt<80) // 50Hz system
	{
		sSet50HzParameter();
		
		sSetEepromBypassFHLoss(cFreq70Hz);
		sSetEepromBypassFLLoss(cFreq40Hz);
		sSetEepromBypassFHBack(cFreq69Hz5);
		sSetEepromBypassFLBack(cFreq40Hz5);

		sSetEepromLineFHLoss(cFreq70Hz);
		sSetEepromLineFLLoss(cFreq40Hz);
		sSetEepromLineFHBack(cFreq69Hz5);
		sSetEepromLineFLBack(cFreq40Hz5);
		
		sSetEepromBypassFreeRunHLoss(cFreq54Hz);
		sSetEepromBypassFreeRunLLoss(cFreq46Hz);
		sSetEepromBypassFreeRunHBack(cFreq53Hz5);
		sSetEepromBypassFreeRunLBack(cFreq46Hz5);

		sSetEepromLineFreqRunHLoss(cFreq54Hz);
		sSetEepromLineFreqRunLLoss(cFreq46Hz);
		sSetEepromLineFreqRunHBack(cFreq53Hz5);
		sSetEepromLineFreqRunLBack(cFreq46Hz5);
		
		sSetEepromInverterPS(cFreq50Hz);
	}
	else if(wSysFreqDetectCnt>100)	// 60Hz system
	{
		sSet60HzParameter();

		sSetEepromBypassFHLoss(cFreq70Hz);
		sSetEepromBypassFLLoss(cFreq40Hz);
		sSetEepromBypassFHBack(cFreq69Hz5);
		sSetEepromBypassFLBack(cFreq40Hz5);

		sSetEepromLineFHLoss(cFreq70Hz);
		sSetEepromLineFLLoss(cFreq40Hz);
		sSetEepromLineFHBack(cFreq69Hz5);
		sSetEepromLineFLBack(cFreq40Hz5);

		sSetEepromBypassFreeRunHLoss(cFreq64Hz);
		sSetEepromBypassFreeRunLLoss(cFreq56Hz);
		sSetEepromBypassFreeRunHBack(cFreq63Hz5);
		sSetEepromBypassFreeRunLBack(cFreq56Hz5);

		sSetEepromLineFreqRunHLoss(cFreq64Hz);
		sSetEepromLineFreqRunLLoss(cFreq56Hz);
		sSetEepromLineFreqRunHBack(cFreq63Hz5);
		sSetEepromLineFreqRunLBack(cFreq56Hz5);

		sSetEepromInverterPS(cFreq60Hz);
	}
	else
	{
		if(swGetEepromInverterPS()==cDSPPeriod50Hz)
		{
			sSetEepromInverterPS(cFreq50Hz);
			sSet50HzParameter();
			sSetEepromBypassFHLoss(cFreq70Hz);
			sSetEepromBypassFLLoss(cFreq40Hz);
			sSetEepromBypassFHBack(cFreq69Hz5);
			sSetEepromBypassFLBack(cFreq40Hz5);
	
			sSetEepromLineFHLoss(cFreq70Hz);
			sSetEepromLineFLLoss(cFreq40Hz);
			sSetEepromLineFHBack(cFreq69Hz5);
			sSetEepromLineFLBack(cFreq40Hz5);
			sSetEepromBypassFreeRunHLoss(cFreq54Hz);
			sSetEepromBypassFreeRunLLoss(cFreq46Hz);
			sSetEepromBypassFreeRunHBack(cFreq53Hz5);
			sSetEepromBypassFreeRunLBack(cFreq46Hz5);
	
			sSetEepromLineFreqRunHLoss(cFreq54Hz);
			sSetEepromLineFreqRunLLoss(cFreq46Hz);
			sSetEepromLineFreqRunHBack(cFreq53Hz5);
			sSetEepromLineFreqRunLBack(cFreq46Hz5);
		}
		else if(swGetEepromInverterPS()==cDSPPeriod60Hz)
		{
			sSetEepromInverterPS(cFreq60Hz);
			sSet60HzParameter();	
			sSetEepromBypassFHLoss(cFreq70Hz);
			sSetEepromBypassFLLoss(cFreq40Hz);
			sSetEepromBypassFHBack(cFreq69Hz5);
			sSetEepromBypassFLBack(cFreq40Hz5);
	
			sSetEepromLineFHLoss(cFreq70Hz);
			sSetEepromLineFLLoss(cFreq40Hz);
			sSetEepromLineFHBack(cFreq69Hz5);
			sSetEepromLineFLBack(cFreq40Hz5);

			sSetEepromBypassFreeRunHLoss(cFreq64Hz);
			sSetEepromBypassFreeRunLLoss(cFreq56Hz);
			sSetEepromBypassFreeRunHBack(cFreq63Hz5);
			sSetEepromBypassFreeRunLBack(cFreq56Hz5);
	
			sSetEepromLineFreqRunHLoss(cFreq64Hz);
			sSetEepromLineFreqRunLLoss(cFreq56Hz);
			sSetEepromLineFreqRunHBack(cFreq63Hz5);
			sSetEepromLineFreqRunLBack(cFreq56Hz5);
		}
	}
}

void	sInitEXTIO(void)
{
	setLocRecg();
	clearPChgVoltBit();
	clearNChgVoltBit();
	clearChgOffBit();
}

INT16S swGetwADCOffsetA()
{
	return wADCOffsetA;	
}

INT16S swGetwADCCoefA()
{
	return wADCCoefA;
}

INT16S swGetwREF125A()
{
	return wREF125A;	
}

INT16S swGetwREF250A()
{
	return wREF250A;
}

⌨️ 快捷键说明

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