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