Files
CHJ/user/Main/MainCore.c

699 lines
24 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
2026-03-20 21:19:04 +08:00
u16 systmeState ;
u16 UPGRADECammand ;
u16 CodeCRC ;
u16 jumpError ;
2026-03-20 21:16:58 +08:00
//******************************************************************************
// for internel modbus
2026-03-20 21:19:04 +08:00
u32 securityID; //
2026-03-20 21:16:58 +08:00
//*****************************************************************************
//for modbus >16bit register define
u32 flowRate,flowAccumulationInteger;
s32 GASPressure;
u64 flowAccumulationHex;
u32 minFlowRate,maxFlowRate,minAnalogOutput,maxAnalogOutput;
u32 alarmAcc,alarmUpperFlowRate,alarmLowerFlowRate;
u32 reverseFlowRateMin, reverseFlowRateMax;
2026-03-20 21:19:04 +08:00
u32 keyPassWord;
//*******************************************************************************
__SystemProcess_Union_TypeDef systemProcess;
2026-03-20 21:16:58 +08:00
__SystemState_Union_TypeDef currentMode;
__Hardware_Status_Bit_TypeDef HWState;
__Alarm_State_TypeDef systemAlarm;
//******************************************************************************
u16 curveMode;
u16 SysLcd, SysLoopChip;// currentSysState;
2026-03-20 21:19:04 +08:00
u16 testTypeCounter, MEMSErrorCounter;
2026-03-20 21:16:58 +08:00
u16 systemVoltage, batteryGrid;
u16 calibType;
// for code CRC
u16 APPCodeCRC;
u32 securityID;
u16 IDvalidTime, comCounter, comResetCounter, AutoOffsetCounter, timePeriod, autoTxdCounter, SysVolErrorCount;
u32 ModeExitTime;
2026-03-20 21:19:04 +08:00
u16 language;
2026-03-20 21:16:58 +08:00
__Display_Status_Bit_TypeDef displayMode;
2026-03-20 21:19:04 +08:00
u16 roughTestCounter, testCounter;
2026-03-20 21:16:58 +08:00
// for save data
u16 timeCompute;
//for system
u16 lastState, syatemHardState;
//------------------------------------------------------------------------------
// for display
u8 Dis1[15], timer[8];
u16 displayUpdate, displayCNT;
//u8 flowRateUnit, AccUnit;
//------------------------------------------------------------------------------
2026-03-20 21:19:04 +08:00
// for ADC Sampling
u16 reverseScale, zeroSuppression, calibFlowGain;
//------------------------------------------------------------------------------
2026-03-20 21:16:58 +08:00
// for flowRate
u32 currentFlowRate, factoryFlowRate;
//------------------------------------------------------------------------------
2026-03-20 21:19:04 +08:00
u16 calibTemperature;
2026-03-20 21:16:58 +08:00
//------------------------------------------------------------------------------
// for acc pulse output
2026-03-20 21:19:04 +08:00
u16 samplingInterval, samplingIntervalTarget, factoryInterval, responseTimeIndex;
2026-03-20 21:16:58 +08:00
u16 updatePulseTime;
//------------------------------------------------------------------------------
u16 tmpIA;
s32 tmpSLA, tmpSLB;
u32 tmpLA, tmpLB;
TypeWord tempWord;
TypeLong tempL;
TypeLongLong tempDev;
//------------------------------------------------------------------------------
const u8 ProductModel[12] = PRODUCT_MOD;
const u8 SoftVersion[12] = VERSION;
2026-03-20 21:19:04 +08:00
const u8 SoftBuildDate[10] = BUILD_MV;
2026-03-20 21:16:58 +08:00
const u8 PulseOutGain[] ={32,16,8,4,2,1}; //
const u8 FilterMax[] ={1, 2, 4, 8, 16, 32}; // filter depth
const u16 Timing[] ={BASE_125MS, BASE_250MS, BASE_500MS, BASE_1000MS, BASE_2000MS, BASE_4000MS};
2026-03-20 21:19:04 +08:00
const u16 TimeVaule[] ={4096, 8192, 16384, 32768, 65535}; //2048, 0.125s<EFBFBD><EFBFBD>0.25s, 0.5s, 1s, 2s, 4s
2026-03-20 21:16:58 +08:00
const u16 UpdateTimeVaule[] ={3000, 3850, 7372, 8192, 16384, 16384}; // 0.235s, 0.45s, 0.5s, 1s, 2s
const u16 FRUnitForHour[] ={28800, 14400, 7200, 3600, 1800, 900};
const u16 FRUnitForMinute[] ={480, 240, 120, 60, 30, 15};
//------------------------------------------------------------------------------
const u8 BuildDate[] = __DATE__; // "Oct 30 2010"
/******************************************************************************/
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
//******************************************************************************
void EnterUserMode(void)
{
2026-03-20 21:19:04 +08:00
currentMode.Bit.CalibMode = 0;
currentMode.Bit.IntCalibMode = 0;
2026-03-20 21:16:58 +08:00
currentMode.Bit.FactoryTestMode = 0;
2026-03-20 21:19:04 +08:00
currentMode.Bit.DebugMode = 0;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 0;
2026-03-20 21:16:58 +08:00
ModeExitTime = 0;
}
//******************************************************************************
void EnterCalibMode(void)
{
2026-03-20 21:19:04 +08:00
currentMode.Bit.CalibMode = 1;
currentMode.Bit.IntCalibMode = 1;
2026-03-20 21:16:58 +08:00
currentMode.Bit.FactoryTestMode = 0;
2026-03-20 21:19:04 +08:00
currentMode.Bit.DebugMode = 0;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
2026-03-20 21:16:58 +08:00
ModeExitTime = 0;
}
//******************************************************************************
void EnterZeroCalibMode(void)
{
2026-03-20 21:19:04 +08:00
currentMode.Bit.CalibMode = 1;
currentMode.Bit.IntCalibMode = 1;
currentMode.Bit.ZeroCalib = 1;
2026-03-20 21:16:58 +08:00
currentMode.Bit.FactoryTestMode = 0;
2026-03-20 21:19:04 +08:00
currentMode.Bit.DebugMode = 0;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
2026-03-20 21:16:58 +08:00
ModeExitTime = 0;
}
//******************************************************************************
void EnterBatteryMode(void)
{
2026-03-20 21:19:04 +08:00
currentMode.Bit.CalibMode = 0;
currentMode.Bit.IntCalibMode = 0;
2026-03-20 21:16:58 +08:00
currentMode.Bit.FactoryTestMode = 0;
2026-03-20 21:19:04 +08:00
currentMode.Bit.DebugMode = 0;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
2026-03-20 21:16:58 +08:00
ModeExitTime = 0;
2026-03-20 21:19:04 +08:00
currentMode.Bit.ExtPowerInput = 0;
2026-03-20 21:16:58 +08:00
}
//******************************************************************************
void EnterDebugMode(void)
{
currentMode.Bit.CalibMode = 0;
currentMode.Bit.IntCalibMode = 0;
currentMode.Bit.FactoryTestMode = 0;
currentMode.Bit.DebugMode = 1;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
currentMode.Bit.ExtPowerInput = 1;
ModeExitTime = 0;
}
//******************************************************************************
void EnterGcfTestMode(void)
{
currentMode.Bit.CalibMode = 0;
currentMode.Bit.FactoryTestMode = 0;
2026-03-20 21:19:04 +08:00
currentMode.Bit.DebugMode = 0;
2026-03-20 21:16:58 +08:00
currentMode.Bit.ExtPowerInput = 1;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
ModeExitTime = 0;
}
2026-03-20 21:19:04 +08:00
////******************************************************************************
void ManagePrimaryTimeInterval(void)
2026-03-20 21:16:58 +08:00
{
2026-03-20 21:19:04 +08:00
u32 currentPerPulse;
samplingIntervalTarget = factoryInterval;//
2026-03-20 21:16:58 +08:00
2026-03-20 21:19:04 +08:00
if(currentMode.Bit.CalibMode)
{
//currentPerPulse = (s16)calibUnitPerPuls;
sampleState.EnableRoughTest = 0;
HWState.EnableCheck = 1;
samplingIntervalTarget = (u16)EXT_POWER_PERIOD_TIME;
}
else
{
//currentPerPulse = (s16)factoryUnitPerPuls;
if(currentMode.Bit.ExtPowerInput)
{
HWState.EnableCheck = 1;
samplingIntervalTarget = (u16)EXT_POWER_PERIOD_TIME;
currentMode.Bit.TurnOffSystem = 0;
sampleState.EnableRoughTest = 0;
2026-03-20 21:16:58 +08:00
}
}
2026-03-20 21:19:04 +08:00
//---------------------------------------------------------------------------
#ifndef ENABLE_ACCPULSE
#pragma message("[undefined] ENABLE_ACCPULSE")
#elif(ENABLE_ACCPULSE)
currentPerPulse = InitPulseUnit(currentPerPulse);
if(currentPerPulse != unitPerPulse) lastRemaining = 0;
unitPerPulse = currentPerPulse;
#endif
//---------------------------------------------------------------------------
if((currentMode.Bit.DebugMode)||(currentMode.Bit.ZeroCalib))
{
sampleState.EnableRoughTest = 0;
testCounter = 5;
2026-03-20 21:16:58 +08:00
}
2026-03-20 21:19:04 +08:00
else if(MEMSErrorCounter != 0) testCounter = 2;
else testCounter = 60;
//if(samplingInterval < 3) sampleState.EnableRoughTest = 0;
2026-03-20 21:16:58 +08:00
}
2026-03-20 21:19:04 +08:00
u32 ReadParameterFromMemory(u16 parameterAdr, u16 parameterLen, u32 parameterDefault)
2026-03-20 21:16:58 +08:00
{
2026-03-20 21:19:04 +08:00
tempDev.DWord[0] = 0;
if(1) ReadParameterFromFlash(tempDev.Byte , parameterAdr , parameterLen , VENDER_PARAMS_PAGE);
else ReadMultiByteFromEEPROM(parameterAdr, tempDev.Byte, parameterLen, PARA_EEPROM);
2026-03-20 21:16:58 +08:00
2026-03-20 21:19:04 +08:00
parameterLen--;
if(tempDev.Byte[parameterLen] != CRC8(tempDev.Byte, parameterLen))
{
tempDev.DWord[0] = (u32)parameterDefault;
isReadParameterOK = 0;
}
else
{
tempDev.Byte[parameterLen] = 0;
isReadParameterOK = 1;
}
return tempDev.DWord[0];
2026-03-20 21:16:58 +08:00
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
/******************************************************************************/
void BackupParameterToFlash(void)
{
//FY WriteShortParameterToBuffer(UPGRADECammand, UPGRADE_APP, UPGRADE_APP_WIDTH);
//FY WriteShortParameterToBuffer(localAddress, SLAVER_ADDR, SLAVER_ADDR_WIDTH);
//WriteShortParameterToBuffer(baudRate, BAUD_RATE, BAUD_RATE_WIDTH);
2026-03-20 21:19:04 +08:00
// clear_WDT();
2026-03-20 21:16:58 +08:00
//
// disable_interrupts();
////FY WriteMultiByteToInfoSegment(PARAMETER_BASE, FlashBuf, PARA_LEN);
// enable_interrupts();
//FY ReadMultiByteFromInfoSegment(PARAMETER_BASE, FlashBuf, PARA_LEN);
}
//******************************************************************************
//ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2026-03-20 21:19:04 +08:00
u32 sn ;
2026-03-20 21:16:58 +08:00
void SystemParameterInit(void)
{
currentMode.Bit.ComModeOperate = 0;
2026-03-20 21:19:04 +08:00
//==============================================================================
2026-03-20 21:16:58 +08:00
// <20>ȶ<EFBFBD>ȡ<EFBFBD>ȣ<C2B6><C8A3>ж<EFBFBD>ģʽ
2026-03-20 21:19:04 +08:00
StaticTemperatureInit();
2026-03-20 21:16:58 +08:00
ManagePrimaryTimeInterval();
2026-03-20 21:19:04 +08:00
//==============================================================================
meterSN1 = ReadParameterFromMemory(SERIES_BASE+0*SENSOR_SN_WIDTH ,SENSOR_SN_WIDTH ,0);
meterSN2 = ReadParameterFromMemory(SERIES_BASE+1*SENSOR_SN_WIDTH ,SENSOR_SN_WIDTH ,0);
meterSN3 = ReadParameterFromMemory(SERIES_BASE+2*SENSOR_SN_WIDTH ,SENSOR_SN_WIDTH ,0);
meterSN4 = ReadParameterFromMemory(SERIES_BASE+3*SENSOR_SN_WIDTH ,SENSOR_SN_WIDTH ,0);
meterSN5 = ReadParameterFromMemory(SERIES_BASE+4*SENSOR_SN_WIDTH ,SENSOR_SN_WIDTH ,0);
meterSN6 = ReadParameterFromMemory(SERIES_BASE+5*SENSOR_SN_WIDTH ,SENSOR_SN_WIDTH ,0);
//==============================================================================
// for meter factor
MeterFactor = ReadParameterFromMemory(METER_FACTOR, METER_FACTOR_WIDTH, METER_PARAMETER_DEFAULT);
2026-03-20 21:16:58 +08:00
// for GDCF
2026-03-20 21:19:04 +08:00
GCFCoefA = (s32)ReadParameterFromMemory(GCF_A, GCF_A_WIDTH, (u32)GCF_A_DEFAULT);
GDCFactor = (u16)ReadParameterFromMemory(GCF_B, GCF_B_WIDTH, GCF_DEFAULT);
GCFCoefC = (s32)ReadParameterFromMemory(GCF_C, GCF_C_WIDTH, GCF_C_DEFAULT);
2026-03-20 21:16:58 +08:00
ComputeGCFFactor();
2026-03-20 21:19:04 +08:00
clear_WDT();
//offset Air & Gas
offsetAir = ReadParameterFromMemory(OFFSET_AIR ,OFFSET_AIR_WIDTH ,32768);
offsetGas = ReadParameterFromMemory(OFFSET_GAS ,OFFSET_GAS_WIDTH ,32768);
2026-03-20 21:16:58 +08:00
//------------------------------------------------------------------------------
2026-03-20 21:19:04 +08:00
offsetGCFX = (u16)ReadParameterFromMemory(OFFSET_GCFX, OFFSET_GCFX_WIDTH, 32768);
2026-03-20 21:16:58 +08:00
//------------------------------------------------------------------------------
2026-03-20 21:19:04 +08:00
factoryInterval = (u16)ReadParameterFromMemory(SAMPLE_PERIOD, SAMPLE_PERIOD_WIDTH, SAMPLE_PERIOD_DEFAULT);
2026-03-20 21:16:58 +08:00
samplingInterval = factoryInterval;
2026-03-20 21:19:04 +08:00
samplingTiming = SetupResponseTime(factoryInterval, SAMPLE_PERIOD_DEFAULT);
responseTimeIndex = (u16)ReadParameterFromMemory(RESPONSE_TIME, RESPONSE_TIME_WIDTH, RESPONSE_TIME_DEFAULT);
2026-03-20 21:16:58 +08:00
responseTime = SetupResponseTime(responseTimeIndex, RESPONSE_TIME_DEFAULT);
// for max current Loop flowrate
2026-03-20 21:19:04 +08:00
maxFlowRate = ReadParameterFromMemory(MAX_FLOW, MAX_FLOW_WIDTH, MAX_FR_DEFAULT);
minFlowRate = ReadParameterFromMemory(MIN_FLOW, MIN_FLOW_WIDTH, MIN_FR_DEFAULT); // V2004
// for read caluibration temperation
calibTemperature = (u16)ReadParameterFromMemory(CALIB_TEMPERATURE, CALIB_TEMPERATURE_WIDTH, TEMPRETURE_OFFSET);
// read
reverseScale = (u16)ReadParameterFromMemory(REVERSE_SCALE, REVERSE_SCALE_WIDTH, REVERSE_SCALE_DEFAULT);
// read display langauge unit
language = (u8)(u16)ReadParameterFromMemory(DIS_LANGUAGE, DIS_LANGUAGE_WIDTH, (u16)DIS_LANGUAGE_DEFAULT);
// read zero Suppression
zeroSuppression = (u16)ReadParameterFromMemory(ZERO_SUPPRESSION, ZERO_SUPPRESSION_WIDTH, ZERO_SUPPRESSION_DEFAULT);
clear_WDT();
2026-03-20 21:16:58 +08:00
//read uart DecimalPoint
2026-03-20 21:19:04 +08:00
uartDecimalPoint = (u16)ReadParameterFromMemory(COM_DECIMAL_POINT, COM_DECIMAL_POINT_WIDTH, COM_DECIMAL_POINT_DEFAULT);
2026-03-20 21:16:58 +08:00
//============================================================================
// for AUTO TXD DATA
2026-03-20 21:19:04 +08:00
timingTxdStart = (u16)ReadParameterFromMemory(TIMING_TXD_START, TIMING_TXD_START_WIDTH, TIMING_TXD_START_DEFAULT);
timingTxdLen = (u16)ReadParameterFromMemory(TIMING_TXD_LEN, TIMING_TXD_LEN_WIDTH, TIMING_TXD_LEN_DEFAULT);
timingTxdTime = (u16)ReadParameterFromMemory(TIMING_TXD_TIME, TIMING_TXD_TIME_WIDTH, TIMING_TXD_TIME_DEFAULT);
2026-03-20 21:16:58 +08:00
2026-03-20 21:19:04 +08:00
clear_WDT();
2026-03-20 21:16:58 +08:00
// key setup password
//============================================================================
#ifndef ENABLE_KEY_FUNCTION
#pragma message("[undefined] ENABLE_KEY_FUNCTION")
#elif(ENABLE_KEY_FUNCTION)
2026-03-20 21:19:04 +08:00
keyPassWord = ReadParameterFromMemory(KEY_PASSWORD, KEY_PASSWORD_WIDTH, KEY_PASSWORD_DEFAULT);
2026-03-20 21:16:58 +08:00
#endif
//============================================================================
UnitConverterInit();
//============================================================================
#ifndef ENABLE_ACCPULSE
#pragma message("[undefined] ENABLE_ACCPULSE")
#elif(ENABLE_ACCPULSE)
PulseParameterInit();
#endif
2026-03-20 21:19:04 +08:00
//============================================================================
// RHCircuitParameterInit();
2026-03-20 21:16:58 +08:00
//============================================================================
GasAnalysisParameterInit();
//============================================================================
SaveParameterInit();
2026-03-20 21:19:04 +08:00
//============================================================================
AdjustOffsetInit();
//============================================================================
#ifndef ENABLE_PLUG_IN_FLOWRATE
#pragma message("[undefined] ENABLE_PLUG_IN_FLOWRATE")
#elif(ENABLE_PLUG_IN_FLOWRATE)
PipeFlowRateComputeInit();
#endif
//============================================================================
#ifndef ENABLE_A_TYPE_FLOWRATE
#pragma message("[undefined] ENABLE_A_TYPE_FLOWRATE")
#elif(ENABLE_A_TYPE_FLOWRATE)
ATypeFlowRateInit();
#endif
2026-03-20 21:16:58 +08:00
//==============================================================================
// retrieve device coefficients
#ifndef ENABLE_DCOEF
#pragma message("[undefined] ENABLE_DCOEF")
#elif(ENABLE_DCOEF)
RetriveDevCoef();
#endif
//============================================================================
// for Tempreature correct
RetriveTACurve();
//==============================================================================
#ifndef REC_ACC_PER
#pragma message("[undefined] REC_ACC_PER")
#elif(REC_ACC_PER)
RetrieveLastAccumulation();
#endif
SetHistoryRecordTime();
// for modbus
InitUseBusParameter();
2026-03-20 21:19:04 +08:00
//==============================================================================
// for system hardware
#ifndef ENABLE_4_20MA_OUTPUT
#pragma message("[undefined] ENABLE_4_20MA_OUTPUT")
#elif(ENABLE_4_20MA_OUTPUT)
CurrentLoopInit();
#endif
//==============================================================================
#ifndef ENABLE_USE_EDM7791
#pragma message("[undefined] ENABLE_USE_EDM7791")
#elif(ENABLE_USE_EDM7791)
#ifndef ENABLE_EDM7791_ALL
#pragma message("[undefined] ENABLE_EDM7791_ALL")
#elif(ENABLE_EDM7791_ALL)
SysLcd = (u16)ReadParameterFromMemory(SYS_LCD, SYS_LCD_WIDTH, SYS_LCD_DEFAULT);
#else
#ifndef ENABLE_EMD779103D
#pragma message("[undefined] ENABLE_EMD779103D")
#elif(ENABLE_EMD779103D)
SysLcd = EDM779103D;
#endif
#ifndef ENABLE_EMD779106D
#pragma message("[undefined] ENABLE_EMD779106D")
#elif(ENABLE_EMD779106D)
SysLcd = EDM779106D;
#endif
#endif
#endif
2026-03-20 21:16:58 +08:00
//----------------------------------------------------------------------------
// V2004
#ifndef ENABLE_ALARM_ACC
#pragma message("[undefined] ENABLE_ALARM_ACC")
#elif(ENABLE_ALARM_ACC)
2026-03-20 21:19:04 +08:00
alarmAcc = ReadParameterFromMemory(ALARM_ACC, ALARM_ACC_WIDTH, ALARM_ACC_DEFAULT);
2026-03-20 21:16:58 +08:00
#endif
//----------------------------------------------------------------------------
2026-03-20 21:19:04 +08:00
#ifndef ENABLE_OFFSET_CORRECT
#pragma message("[undefined] ENABLE_OFFSET_CORRECT")
#elif(ENABLE_OFFSET_CORRECT)
ComputeOffsetDriftInit();
#endif
//----------------------------------------------------------------------------
2026-03-20 21:16:58 +08:00
#ifndef ENABLE_LEAK_DETECT
#pragma message("[undefined] ENABLE_LEAK_DETECT")
#elif(ENABLE_LEAK_DETECT)
2026-03-20 21:19:04 +08:00
minLeakFlowRate = (u16)ReadParameterFromMemory(MIN_LEAK_FLOW, MIN_LEAK_FLOW_WIDTH, MIN_LEAK_FLOW_DEFAULT);
maxLeakFlowRate = (u16)ReadParameterFromMemory(MAX_LEAK_FLOW, MAX_LEAK_FLOW_WIDTH, MAX_LEAK_FLOW_DEFAULT);
leakDetectTime = (u16)ReadParameterFromMemory(LEAK_TIME, LEAK_TIME_WIDTH, LEAK_TIME_DEFAULT);
2026-03-20 21:16:58 +08:00
#endif
2026-03-20 21:19:04 +08:00
//------------------------------------------------------------------------------
#ifndef ENABLE_FLOW_GAIN
#pragma message("[undefined] ENABLE_FLOW_GAIN")
#elif(ENABLE_FLOW_GAIN)
calibFlowGain = (u16)ReadParameterFromMemory(FLOW_GAIN, FLOW_GAIN_WIDTH, FLOW_GAIN_DEFAULT);
if(JudgeFlowRateGain(calibFlowGain)) calibFlowGain = FLOW_GAIN_DEFAULT;
2026-03-20 21:16:58 +08:00
#endif
}
//******************************************************************************
// Auto-check
void SystemHardWareAutoCheck(void)
{
u8 rand;
systemAlarm.Word = 0;
for(rand = 0; rand < 6; rand++) Dis1[rand] = 0;
// 1) check CRYSTAL
// if(AutoCheckCrystal())
// {
// Dis1[CHK_CRYSTAL] = 1;
// systemAlarm.Bit.CrystalAlarm = 1;
// }
// 2) Check calib memory
rand = ReadByteFromEEPROM(0, PARA_EEPROM);
rand++;
WriteByteToEEPROM(0, rand, PARA_EEPROM);
if(rand != ReadByteFromEEPROM(0, PARA_EEPROM))
{
systemAlarm.Bit.EEPROMAlarm = 1;
Dis1[CHK_PARA] = 1;
}
// 3) Check data memory
rand = ReadByteFromEEPROM(0, DATA_EEPROM);
rand++;
WriteByteToEEPROM(0, rand, DATA_EEPROM);
if(rand != ReadByteFromEEPROM(0, DATA_EEPROM))
{
systemAlarm.Bit.EEPROMAlarm = 1;
Dis1[CHK_DATA] = 1;
}
// // 4) Check acc memory
// rand = ReadByteFromFRAM(0);
// rand++;
// WriteByteToFRAM(0, rand);
// if(rand != ReadByteFromFRAM(0))
// {
// systemAlarm.Bit.EEPROMAlarm = 1;
// Dis1[CHK_ACC] = 1;
// }
// 7) Check external RTC and read current time
2026-03-20 21:19:04 +08:00
//===========================================================================
#ifndef ENABLE_EXT_RTC
#pragma message("[undefined] ENABLE_EXT_RTC")
#elif(ENABLE_EXT_RTC)
if(ExtRTCDataRead(USR1) == 1) Dis1[CHK_RTC] = 0;
else if(TestExtRTCReady())
{
if(ExtRTCInit())
{
Dis1[CHK_RTC] = 1;
systemAlarm.Bit.RTC_ALARM = 1;
}
}
else Dis1[CHK_RTC] = 2;
if(Dis1[CHK_RTC] == 0) ExtRTCTimeRead(); // read IS1208 time
else ReadCurrentTime();
#else
// ReadCurrentTime();
#endif
2026-03-20 21:16:58 +08:00
//FY SetRTCCurrentTime(); // set time to MCU RTC
// 7)Check external temprature
#ifndef ENABLE_USE_MCP9808
#pragma message("[undefined] ENABLE_USE_MCP9808")
#elif(ENABLE_USE_MCP9808)
if(ReadWordRegister(MID) != 0x0054)
{
systemAlarm.Bit.TempAlarm = 1;
Dis1[CHK_TEMP] = 1;
}
#endif
}
//******************************************************************************
void SystemHardWareInit(void)
{
/*SPI Bus Init=========================================================================*/
//TurnOffAnalogCircuit();
/*IIC Bus Init=========================================================================*/
2026-03-20 21:19:04 +08:00
SI2C_Init();
2026-03-20 21:16:58 +08:00
/*Memory Init==========================================================================*/
EEPROMInit();
//if(REC_ACC_PER) FRAMInit();// Acc flowrate save enable bit
/*external tempreture Init============================================================*/
2026-03-20 21:19:04 +08:00
HWState.EnableTempTest= 1;
HWState.EnableTempInit=1;
WriteWordRegister(CONFIG, SHUT_DOWN);//<2F><><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
/*RTC Init=============================================================================*/
//FY SetRTCCalendarMode();
/*External RTC=========================================================================*/
#ifndef ENABLE_EXT_RTC
#pragma message("[undefined] ENABLE_EXT_RTC")
#elif(ENABLE_EXT_RTC)
if(TestExtRTCReady()) ExtRTCInit();
#endif
2026-03-20 21:16:58 +08:00
}
//******************************************************************************
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
void SystemInterfaceInit(void)
{
//uart init============================================================================
#ifndef ENABLE_USER_UART
#pragma message("[undefined] ENABLE_USER_UART")
#elif(ENABLE_USER_UART)
MainUartInit(baudRateVaule[baudRate]);
StartDMAForRxdMainUartData();
#endif
//iic init============================================================================
2026-03-20 21:19:04 +08:00
// #ifndef ENABLE_USER_I2C
// #pragma message("[undefined] ENABLE_USER_I2C")
// #elif(ENABLE_USER_I2C)
// I2C_Slave_Init(100000 , 0x02);
// I2CAddr = localAddress;
// meterSN1=0x3031; meterSN2=0x3233; meterSN3=0x3435;
// meterSN4=0x3637; meterSN5=0x3839; meterSN6=0x4041;
// #endif
2026-03-20 21:16:58 +08:00
}
//******************************************************************************
2026-03-20 21:19:04 +08:00
void InitGlobalVar(void)
2026-03-20 21:16:58 +08:00
{
u8 I;
jumpError = 0;
2026-03-20 21:19:04 +08:00
clear_WDT();
2026-03-20 21:16:58 +08:00
//TXDMode = ENABLE_TXD_USE_DMA;
displayUpdate = 0;
flowRate = 0;
for(I=0; I<12; I++) Dis1[I] = 0;
for(I=0; I<ANX; I++) voltageDetected[I] = 0;
HWState.SampledOver = 0;
HWState.EnableCheck = 1;
currentMode.Bit.TurnOffSystem = 0;
//==============================================================================
// softVersion = (u16)SOFT_VERSION;
softVersion = (u16)VER_MV;
softVersion <<= 4;
softVersion |= (u16)VER_SV;
softVersion <<= 4;
softVersion |= (u16)VER_RV;
softVersion <<= 4;
softVersion |= (u16)VER_BV;
//=============================================================================
// 0x80~0xf0
protocol = 0;
localAddress = 1;
2026-03-20 21:19:04 +08:00
baudRate = BPS_115200;
minFlowRate = 0;
maxFlowRate = 0;
2026-03-20 21:16:58 +08:00
minAnalogOutput = 0;
maxAnalogOutput = 0;
2026-03-20 21:19:04 +08:00
GDCFactor = 0;
2026-03-20 21:16:58 +08:00
GDCFactorAType = 0;
filterTime = 0;
2026-03-20 21:19:04 +08:00
factoryInterval = 0;
2026-03-20 21:16:58 +08:00
offsetGas = 0;
offsetGasA = 0;
flowUnit = 0;
2026-03-20 21:19:04 +08:00
VHHParameterAir = 0;
VHHParameterScale = 0;
unitPerPulse = 0;
2026-03-20 21:16:58 +08:00
alarmFunction = 0;
alarmOutDelay = 0;
alarmAcc = 0;
alarmUpperFlowRate = 0;
alarmLowerFlowRate = 0;
PulseLevel = 0;
//==============================================================================
// 0XF0~0XFF: write only (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
CMDComPassword = 0;
CMDCalOffset = 0;
CMDClrRecord = 0;
//==============================================================================
flowAccCumulationRemaining = 0;
flowAccumulationHex = 0;
//---------------------------------------------------------------------------
totalPulse = 0;
#ifndef ENABLE_DENSITY_DETECT
#pragma message("[undefined] ENABLE_DENSITY_DETECT")
#elif(ENABLE_DENSITY_DETECT)
density = 0;
densityFSParameter = 0;
#endif
2026-03-20 21:19:04 +08:00
displayMode.NeedForInit = 1;
munWriteParams = WP_NOT;//<2F><>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>Ҫд<D2AA><D0B4>
2026-03-20 21:16:58 +08:00
}
/*******************************************************************************/
void SystemInitProcess(void)
{
2026-03-20 21:19:04 +08:00
if(systmeState != 0xAA55)
{
if(CodeCRC == 0) alarmState &= ~BL_CRC_ERROR;
else alarmState |= BL_CRC_ERROR;
InitGlobalVar();
}
SystemHardWareInit(); //ϵͳӲ<CDB3><D3B2><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
SystemHardWareAutoCheck();
SystemParameterInit(); //ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
SystemInterfaceInit(); //ϵͳ<CFB5>ӿڳ<D3BF>ʼ<EFBFBD><CABC> //USER_UART
2026-03-20 21:16:58 +08:00
systmeState = 0xAA55;
}
2026-03-20 21:19:04 +08:00
u32 sleeptime ;
void LPTIMER1_IRQ_Callback()//
{
StartNormolFlowMeasurement();//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>źŵIJ<C5B5><C4B2><EFBFBD>
// LHL_GPIO_TogglePin(pGPIO1, GPIO_PIN_7);
// sleeptime++;
// if (sleeptime == 40){ mcuModeSleeping = 1 ; }
}
//******************************************************************************
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void EnterMainEntry(void)
{
samplingInterval = 0;
StartPrimaryTimerInterval(TimeVaule[samplingInterval]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
lptimer_register_irq_callback(PrimaryTimer,LPTIMER1_IRQ_Callback);
}
2026-03-20 21:16:58 +08:00