📄 errrecwave1.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 + -