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

📄 errrecwave.c

📁 基于c的电动机保护程序
💻 C
字号:
#include "nucleus.h"
#include "fix_dsp.h"
#include "flash_extr.h"

extern NU_MEMORY_POOL  System_Memory;
extern int AfterBrake_count;
extern NU_SEMAPHORE   Semaphore;
extern void Errwav_Write2Flash_new(void);
extern int ErrRecWave_flag;
extern int testerrwave;
extern NU_TASK			GUI_TASK;
void init_Errwav_Write2Flash(void);

typedef struct
{
	float 
		IA,
		IB,
		IC,
		I0,
		Ua,
		Ub,
		Uc;	
}Data_BackUp_Struct;


#define Data_BackUp_GroupNum 4
#define Data_BackUp_SampleNum 20

Data_BackUp_Struct Data_BackUp[Data_BackUp_GroupNum * Data_BackUp_SampleNum];

Data_BackUp_Struct * Data_BackUp_Add;
int Data_BackUp_Group ;
int Data_BackUp_Sample ;
void ErrRecWave_Initial()
{/*
	Data_BackUp_Struct * Data_BackUp_Add;
	void *pointer;
	int datesize;
	
	Data_BackUp_Group = 0;
	Data_BackUp_Sample = 0;
	datesize = sizeof(Data_BackUp);
	Data_BackUp_Add = (Data_BackUp_Struct *)NU_Allocate_Memory(&System_Memory, &pointer, datesize, NU_NO_SUSPEND);                     
   */ 
   U32 ErrwaveBlock ;
   
   NU_Create_Semaphore(&Semaphore, "sem", 0, NU_FIFO);
   
   //NU_Release_Semaphore(&Semaphore);
   //ErrRecWave_flag = 1;
   
	ErrwaveBlock = *((U32 *)0x200A0000);
	
	//NU_Release_Semaphore(&Semaphore);
	if( (ErrwaveBlock != ERRWAV_Block_1) || (ErrwaveBlock != ERRWAV_Block_2))
	{
		 init_Errwav_Write2Flash(); //记录数据号和数据地址等
	}
   
   
}
int sampleNum = 0; //记录的是哪一组数据
int cycleFlag = 0; //数据存满了80个  开始循环
void Data_BackUp_Process(Data_In  datatemp)
{
	Data_BackUp[sampleNum].IA = datatemp. IA ;	
	Data_BackUp[sampleNum].IB = datatemp. IB ;
	Data_BackUp[sampleNum].IC = datatemp. IC ;
	Data_BackUp[sampleNum].I0 = datatemp. I0 ;
	Data_BackUp[sampleNum].Ua = datatemp. Ua ;
	Data_BackUp[sampleNum].Ub = datatemp. Ub ;
	Data_BackUp[sampleNum].Uc = datatemp. Uc ;
	
	sampleNum++;
	
	if(sampleNum == 80)
	{
		cycleFlag = 1;
	}
	
	sampleNum %= 80;
	
	
	/*
	int addtemp = 0
	addtemp = Data_BackUp_Group * Data_BackUp_SampleNum + Data_BackUp_Sample ;
	
	Data_BackUp[addtemp].IA = datatemp. IA ;	
	Data_BackUp[addtemp].IB = datatemp. IB ;
	Data_BackUp[addtemp].IC = datatemp. IC ;
	Data_BackUp[addtemp].I0 = datatemp. I0 ;
	Data_BackUp[addtemp].Ua = datatemp. Ua ;
	Data_BackUp[addtemp].Ub = datatemp. Ub ;
	Data_BackUp[addtemp].Uc = datatemp. Uc ;
	
	
	Data_BackUp_Sample++;//一个周波中的某采样
	if( Data_BackUp_SampleNum == Data_BackUp_Sample )
	{
		Data_BackUp_Group = ( (Data_BackUp_Sample++) % Data_BackUp_GroupNum );
		Data_BackUp_Sample = 0;
	}
	*/
		
}




/*------------------------------------------------------------------*/

/*
	int dataRecNum = 0;
void Errwav_Write2Flash(void)
{
	unsigned long data_addr = *(unsigned long *)0x1fff0620;
	unsigned long curdata_num = *(unsigned long *)0x1fff0624;
	unsigned long data_backupTempAdd = 0x1fff1000;
	int i = 0;
	int j = 0;
	int stat;
	int datahead_needbackup = 0;       //第一块中需要备份的数据大小,单位为字节
	int datanext_needbackup = 0;		//最后一块中需要备份的数据大小,单位为字节
	int block_NeedErase = 0;
	int Data_BackUp_Group_Temp = 0;
	 
	unsigned long dataRec_HeadAdd ;
	unsigned long dataRec_NextAdd ;
	unsigned long dataRecBlock_HeadAdd;       //数据头所在的块的头地址
	unsigned long dataRecBlock_NextHeadAdd;	 //下一个数据头所在的块的头地址
	
	dataRec_HeadAdd = ERRWAV_DATA2FLASHADDR + 0x8340*dataRecNum;      //数据记录的首地址
	dataRec_NextAdd = dataRec_HeadAdd + 0x8340;                      //下一个记录的首地址
	dataRecBlock_HeadAdd = dataRec_HeadAdd - (dataRec_HeadAdd % ERASEBLOCKSIZE);  //数据头所在的块的头地址
	dataRecBlock_NextHeadAdd = dataRec_NextAdd - (dataRec_NextAdd % ERASEBLOCKSIZE);  //数据头所在的块的头地址
	
	datahead_needbackup = dataRec_HeadAdd - dataRecBlock_HeadAdd;
	datanext_needbackup = dataRecBlock_NextHeadAdd + ERASEBLOCKSIZE - dataRecBlock_NextHeadAdd;
	
	while(1)
	{
	
	NU_Obtain_Semaphore(&Semaphore, NU_SUSPEND);
	//**************************记录当前最新录波数据的记录号**********************
	
	     /  /**************************备份最后一块的录波数据**********************
	
	do
	{
		stat = NorFlash_read( ERRWAV_RECNUMADD + i * WordLen , data_backupTempAdd + i * WordLen );
	}while(stat &&  (i<(0x100 * 2)) );
	data_backupTempAdd +=  0x100;
	
	
   NorFlash_unlock( ERRWAV_RECNUMADD );
	NorFlash_bolckerase( ERRWAV_RECNUMADD  );
	
	
				/**************************写回备返妮最后一块的录波数据**********************
	do
	{
		stat = NorFlash_write( ERRWAV_RECNUMADD  + i * WordLen, 0x1fff1000 + i * WordLen);
		
		i++;
	}while(stat &&  (i<(0x100 * 2)) );
	
				
					/*************写入最新数据位置************
	do
	{
		stat = NorFlash_write( 0x201A4104 + i * WordLen, ((U32)&dataRecNum) + i * WordLen);/*写入最新数据位置*
		
		
	}while(stat &&  (i< 2) );
	

	//*----------------------------------------------------------------------------------*

	
	
	//**************************备份块中将被擦除的有用数据**********************
	
		/******备份第一块中的有用数据*****
	
	if( !(datahead_needbackup = dataRec_HeadAdd % ERASEBLOCKSIZE))
	{
		do
		{
			stat = NorFlash_read( dataRecBlock_HeadAdd + i * WordLen , data_backupTempAdd + i * WordLen );
		}while(stat &&  (i<(datahead_needbackup * 2)) );
		data_backupTempAdd = data_backupTempAdd + datahead_needbackup;
	
	}
	
			/******备份最后一块中的有用数据*****
	
	if( !(datanext_needbackup = dataRec_NextAdd % ERASEBLOCKSIZE))
	{
		do
		{
			stat = NorFlash_read( dataRec_NextAdd + i * WordLen , data_backupTempAdd + i * WordLen );
		}while(stat &&  (i<(datanext_needbackup)) );
	
	}
	
	
	/*----------------------------------------------------------------------------------*/
	
	/**************************擦除块**********************
	
	if( (dataRec_NextAdd % ERASEBLOCKSIZE) < 0x340 )  //五块放不满全部数据
	{
		block_NeedErase = 6;
	}
	else 
	{
		block_NeedErase = 5;
	}
	
	for(i = 0; i<block_NeedErase; i++) 
  	 	{	
  	 		NorFlash_unlock( dataRecBlock_HeadAdd + i*ERASEBLOCKSIZE );
			NorFlash_bolckerase( dataRecBlock_HeadAdd + i*ERASEBLOCKSIZE );
		}
	/*----------------------------------------------------------------------------------*/
	
	/*************************写入数据**********************/
						
						
						/*************************将备份数据写回第一块**********************
	
	if( datahead_needbackup != 0 )
	{
		data_backupTempAdd = 0x1fff1100;
		do
		{
			stat = NorFlash_write( dataRecBlock_HeadAdd + i * WordLen, data_backupTempAdd + i * WordLen);/*写入最新数据位置*
			
			i++;
		}while(stat &&  (i<(datahead_needbackup * 2)) );
		data_backupTempAdd = data_backupTempAdd + datahead_needbackup;
	}	
	
					/*************************写入录波数据**********************
	
	
	Data_BackUp_Group_Temp = Data_BackUp_Group;
	i = 0;
	j = 0;
	
	if( Data_BackUp_Group != 0 )
	{
		do
		{
			
			stat = NorFlash_write( dataRec_HeadAdd + i * WordLen, ((U32)&Data_BackUp[Data_BackUp_Group_Temp * Data_BackUp_SampleNum]) + j * WordLen);
			j++;
			if( (i / 14) == (Data_BackUp_GroupNum - Data_BackUp_Group) )
			{	
				Data_BackUp_Group_Temp = 0;
				j = 0;
			}
			
		}while(stat &&  (i<(8340 * 2)) );
	
	}
	else
	{
		do
		{
			
			stat = NorFlash_write( dataRec_HeadAdd + i * WordLen, ((U32)&Data_BackUp[0]) + i * WordLen);
			
			i++;
			
		}while(stat &&  (i<(8340 * 2)) );	
	}
	
/*----------------------------------------------------------------------------------*
			/*************************将备份数据写回最后一块**********************
	i = 0;					
	if( datanext_needbackup != 0 )
	{
		do
		{
			stat = NorFlash_write( dataRec_NextAdd + i * WordLen, data_backupTempAdd + i * WordLen);/*写入最新数据位置*
			
			i++;
		}while(stat &&  (i<(datanext_needbackup * 2)) );
	}	
	
	
	dataRecNum = (dataRecNum++)%20;
	
	
	Errwav_Write2Flash_new();
	
	
	NorFlash_Normal(NorHead );
		//time2 = NU_Retrieve_Clock();
	AfterBrake_count = 0;
	//Semaphore = 0;
	
}	
	
}

*/

/*------------------------------------------------------------------*/



void Errwav_Write2Flash(void)
{
	int i;
	int stat;
	int dataToRec = 0;
    U32 ErrwaveBlock = 0;
	int ErrwaveNum = 0;
	int ErrwaveCycleFlag = 0;
	int ErrwaveReadIndex = 0;
	
		
	
	

	ErrwaveBlock = *((U32 *)0x2000a000);
	ErrwaveNum   = *((int *)0x2000a004);
	ErrwaveCycleFlag = *((int *)0x2000a008);
	
	
	
	NorFlash_unlock( 0x2000A000    );
	NorFlash_bolckerase( 0x2000A000  );

	//记录故障录波索引
		
	if( 20 == ErrwaveNum )	
	{
		i=0;
		
		if( ErrwaveBlock == ERRWAV_Block_1 )
		{
			ErrwaveBlock = ERRWAV_Block_2;
		}
		else
		{
			ErrwaveBlock = ERRWAV_Block_1;
		}
		
		do
		{
			stat = NorFlash_write(0x2000A000  + i * WordLen, ((U32)&ErrwaveBlock) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
	
		
		//将故障录波号记下来 初始化完无记录  为 0
		i=0;
		ErrwaveNum = 1;
		do
		{
			stat = NorFlash_write(0x2000A000  + i * WordLen, ((U32)&ErrwaveNum) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
		
		//将数据循环标志记下来 当前没有循环  为 0
		i=0;
		ErrwaveCycleFlag = 1;
		do
		{
			stat = NorFlash_write(0x2000A000  + i * WordLen, ((U32)&ErrwaveCycleFlag) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
	}
	else
	{
		i=0;
		dataToRec = ErrwaveBlock;
		
		do
		{
			stat = NorFlash_write(0x2000A000  + i * WordLen, ((U32)&dataToRec) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
	
		
		//将故障录波号记下来 
		i=0;
		dataToRec = ErrwaveNum+1;
		do
		{
			stat = NorFlash_write(0x2000A004  + i * WordLen, ((U32)&dataToRec) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
		
		//将数据循环标志记下来 
		i=0;
		dataToRec = ErrwaveCycleFlag;
		do
		{
			stat = NorFlash_write(0x2000A008  + i * WordLen, ((U32)&dataToRec) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
	
	}
	
	
	//记录故障录波数据
	
	ErrwaveReadIndex = sampleNum;
	
	i=0;
		
	do
	{
		stat = NorFlash_write(ErrwaveBlock+sizeof_oneCycle*ErrwaveNum  + i * WordLen, ((U32)&Data_BackUp[ErrwaveReadIndex].IA) + i * WordLen);
		i++;
		ErrwaveReadIndex = (ErrwaveReadIndex++)%80;
	}while(stat && (i < sizeof_oneCycle*2));
	
	
	
	
	
	ErrRecWave_flag = 0;
	AfterBrake_count = 0;
	

	
		
	  /***********************在第一页写入最新记录号(1~20)  *********************/
		
		//dataRecNum = (dataRecNum++)%20 + (dataRecNum++)/20 ;
		
		/*
		dataRecNum = (int *)ERRWAV_DATA2FLASHADDR;
		dataRecNum++;
		if(21 == dataRecNum)
		{
			dataRecNum = 1;
		}
  	 	NorFlash_unlock( ERRWAV_DATA2FLASHADDR    );
		NorFlash_bolckerase( ERRWAV_DATA2FLASHADDR  );
		i=0;
		do
		{
			stat = NorFlash_write(ERRWAV_DATA2FLASHADDR  + i * WordLen, ((U32)&dataRecNum) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
	
		/***********************写入录波数据 *********************/
		
		/*NorFlash_unlock(ERRWAV_DATA2FLASHADDR + dataRecNum*ERASEBLOCKSIZE   );
		NorFlash_bolckerase(ERRWAV_DATA2FLASHADDR + dataRecNum*ERASEBLOCKSIZE  );
		
		i = 0;
		do
		{
			stat = NorFlash_write(ERRWAV_DATA2FLASHADDR + dataRecNum*ERASEBLOCKSIZE + i * WordLen, ((U32)&Data_BackUp[0]) + i * WordLen);
			i++;		
		}while(stat && (i < 1680*2));
		
		
	*/
	
	
}



/********************************************************************
 *					鏁呴殰褰曟尝瀛樺叆flash          add on 07-1-13 by Steny
 ********************************************************************/
void Errwav_Write2Flash_old(void)
{
	unsigned long data_addr = *(unsigned long *)0x1fff0620;
	unsigned long curdata_num = *(unsigned long *)0x1fff0624;
	int i = 0;
	int stat;
	//static U32 time1,time2;
	while(1)
	{	/* 需要擦除100K*/
		NU_Obtain_Semaphore(&Semaphore, NU_SUSPEND);
		//time1 = NU_Retrieve_Clock();
		
		
		
		
		
		for(i = 0; i<EraseBlockCount; i++) 
  	 	{	
  	 		NorFlash_unlock(ERRWAV_DATA2FLASHADDR - 4 + i*ERASEBLOCKSIZE );
			NorFlash_bolckerase(ERRWAV_DATA2FLASHADDR - 4 + i*ERASEBLOCKSIZE );
		}
		i = 0;
		do
		{
			stat = NorFlash_write(ERRWAV_DATA2FLASHADDR - 4+i * WordLen, (U32)&curdata_num + i * WordLen);/*写入最新数据位置*/
			i++;
		}while(stat && (i < 2));
		i = 0;
		do
		{
			stat = NorFlash_write(ERRWAV_DATA2FLASHADDR + i * WordLen, data_addr + i * WordLen);
			i++;		
		}while(stat && (i < Data_BackUp_SampleNum * Data_BackUp_GroupNum*2));
		
		NorFlash_Normal(NorHead );
		//time2 = NU_Retrieve_Clock();
		AfterBrake_count = 0;
	}
}


void init_Errwav_Write2Flash(void)
{
	int i = 0;
	int dataToRec = 0;
	int stat = 0;
	
		NorFlash_unlock( 0x2000A000    );
		NorFlash_bolckerase( 0x2000A000  );
		
		NorFlash_unlock( 0x200B0000    );
		NorFlash_bolckerase( 0x200B0000  );
		
		NorFlash_unlock( 0x200C0000    );
		NorFlash_bolckerase( 0x200C0000  );
	
	
		//将第一块的地址存下来
		i=0;
		dataToRec = ERRWAV_Block_1;
		do
		{
			stat = NorFlash_write(0x2000A000  + i * WordLen, ((U32)&dataToRec) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
	
		
		//将故障录波号记下来 当前为 1号
		i=0;
		dataToRec = 1;
		do
		{
			stat = NorFlash_write(0x2000A004  + i * WordLen, ((U32)&dataToRec) + i * WordLen);
			i++;		
		}while(stat && (i < 2));
		
		//将数据循环标志记下来 当前没有循环  为 0
		i=0;
		dataToRec = 0;
		do
		{
			stat = NorFlash_write(0x2000A008  + i * WordLen, ((U32)&dataToRec) + i * WordLen);
			i++;		
		}while(stat && (i < 2));

}


⌨️ 快捷键说明

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