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

📄 errrecwave1.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);


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


#define Data_BackUp_GroupNum 60
#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);                     
    
}

void Data_BackUp_Process(Data_In  datatemp)
{
	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 );
		}
	/*----------------------------------------------------------------------------------*/
	
	/*************************写入数据**********************/
						
						
	
	i = 0;					/*************************将备份数据写回第一块**********************/
	
	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_new(void)
{
	int i;
	int stat;
	
	
	//while(1)
	//{	/* 需要擦除100K*/
		NU_Obtain_Semaphore(&Semaphore, NU_SUSPEND);
		
		for(i = 0; i < 5; i++) 
  	 	{	
  	 		NorFlash_unlock(ERRWAV_DATA2FLASHADDR_new + dataRecNum*0xA000  + i*ERASEBLOCKSIZE );
			NorFlash_bolckerase(ERRWAV_DATA2FLASHADDR_new + dataRecNum*0xA000 + i*ERASEBLOCKSIZE );
		}
	
		
		
		i = 0;
		do
		{
			stat = NorFlash_write(ERRWAV_DATA2FLASHADDR_new + dataRecNum*0xA000 + i * WordLen, ((U32)&Data_BackUp[Data_BackUp_Group * Data_BackUp_SampleNum]) + i * WordLen);
			i++;		
		}while(stat && (i < 8340*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;
	}
}





⌨️ 快捷键说明

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