#include "../main/SystemInclude.h" u16 systmeState; //u16 UPGRADECammand ; //u16 CodeCRC ; u16 jumpError; //****************************************************************************** // for internel modbus //u32 securityID; // //***************************************************************************** //for modbus >16bit register define u32 flowRate,flowAccumulationInteger; s32 GASPressure; u64 flowAccumulationHex; u32 minFlowRate,maxFlowRate,minAnalogOutput,maxAnalogOutput; u32 alarmAcc,alarmUpperFlowRate,alarmLowerFlowRate; u32 reverseFlowRateMin, reverseFlowRateMax; //******************************************************************************* __SystemProcess_Union_TypeDef systemProcessing; //用于系统工作状态 __SystemState_Union_TypeDef currentMode; __Hardware_Status_Bit_TypeDef HWState; __Alarm_State_TypeDef systemAlarm; //****************************************************************************** u16 curveMode; u16 SysLcd, SysLoopChip;// currentSysState; u16 testTypeCounter;//, MEMSErrorCounter; u16 systemVoltage, batteryGrid; u16 calibType; // for code CRC u16 APPCodeCRC; u32 securityID; u16 IDvalidTime, comCounter, comResetCounter, AutoOffsetCounter, timePeriod, autoTxdCounter, SysVolErrorCount; u32 ModeExitTime; __Display_Status_Bit_TypeDef displayMode; // for save data u16 timeCompute; //for system u16 lastState, syatemHardState; //------------------------------------------------------------------------------ // for display u8 Dis1[15], timer[8]; u16 displayUpdate, displayCNT; //u8 flowRateUnit, AccUnit; //------------------------------------------------------------------------------ // for flowRate u32 currentFlowRate, factoryFlowRate; //------------------------------------------------------------------------------ //u16 calibTemperature; //------------------------------------------------------------------------------ // for acc pulse output u16 samplingInterval, samplingIntervalTarget, responseTimeIndex; 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; const u8 SoftBuildDate[10] = BUILD_DATE; 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}; const u16 TimeVaule[] ={2048,4096, 8192, 16384, 32768, 65535}; //2048, 0.125s,0.25s, 0.5s, 1s, 2s, 4s 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" /******************************************************************************/ //****************************************************************************** void EnterUserMode(void) { currentMode.Bit.CalibMode = 0; currentMode.Bit.IntCalibMode = 0; currentMode.Bit.FactoryTestMode = 0; currentMode.Bit.DebugMode = 0; currentMode.Bit.DigitOutput = 1; currentMode.Bit.ComModeOperate = 0; ModeExitTime = 0; } //****************************************************************************** void EnterCalibMode(void) { currentMode.Bit.CalibMode = 1; currentMode.Bit.IntCalibMode = 1; currentMode.Bit.FactoryTestMode = 0; currentMode.Bit.DebugMode = 0; currentMode.Bit.DigitOutput = 1; currentMode.Bit.ComModeOperate = 1; ModeExitTime = 0; } //****************************************************************************** void EnterZeroCalibMode(void) { currentMode.Bit.CalibMode = 1; currentMode.Bit.IntCalibMode = 1; currentMode.Bit.ZeroCalib = 1; currentMode.Bit.FactoryTestMode = 0; currentMode.Bit.DebugMode = 0; currentMode.Bit.DigitOutput = 1; currentMode.Bit.ComModeOperate = 1; ModeExitTime = 0; } //****************************************************************************** void EnterBatteryMode(void) { currentMode.Bit.CalibMode = 0; currentMode.Bit.IntCalibMode = 0; currentMode.Bit.FactoryTestMode = 0; currentMode.Bit.DebugMode = 0; currentMode.Bit.DigitOutput = 1; currentMode.Bit.ComModeOperate = 1; currentMode.Bit.ExtPowerInput = 0; ModeExitTime = 0; } //****************************************************************************** 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; currentMode.Bit.DebugMode = 0; currentMode.Bit.ExtPowerInput = 1; currentMode.Bit.DigitOutput = 1; currentMode.Bit.ComModeOperate = 1; ModeExitTime = 0; } /******************************************************************************/ void ModeExitCount(void) { //---------------------------------------------------------------------------- // ONE SENCOND // 16384*30 / 128 IDvalidTime += timePeriod; if(IDvalidTime >= ID_VALID_TIME) { IDvalidTime = 0; securityID = 0; HWState.EnableCheckCorr = 1; } //---------------------------------------------------------------------------- // comm return counter if(currentMode.Bit.CalibMode) { comCounter += timePeriod; if(comCounter >= comResetCounter) { comCounter = 0; comResetCounter = TIMING_500mS; currentMode.Bit.DigitOutput = 1; systemProcessing.Bit.WriteHandle = 0; } } //---------------------------------------------------------------------------- // mode return counter ModeExitTime += (u32)timePeriod; if(ModeExitTime >= (u32)EXIT_7200S) { ModeExitTime = 0; EnterUserMode(); // currentMode.Bit.ComModeOperate = 0; } } /******************************************************************************/ void ManagePrimaryTimeInterval(void) { u32 currentPerPulse; //---------------------------------------------------------------------------- //重置主定时器 samplingIntervalForTotal = samplingInterval; timePeriod = TimeVaule[samplingInterval]; timePeriod >>= 7; samplingInterval = samplingIntervalTarget; ResetPrimaryTimer(TimeVaule[samplingInterval]); samplingIntervalTarget = factoryInterval;// if(currentMode.Bit.CalibMode) samplingIntervalTarget = (u16)EXT_POWER_PERIOD_TIME; else samplingIntervalTarget = factoryInterval;// currentMode.Bit.TurnOffSystem = 0; } //主程序入口------------------------------------------------------------ void EnterMainEntry(void) { // samplingInterval = 1; // 注册主定时器中断处理程序入口 StartPrimaryTimer(TimeVaule[samplingInterval]); //启用主定时器 lptimer_register_irq_callback(PrimaryTimer, PrimaryTimer_IRQ_Callback); } /******************************************************************************/ 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); // Clear_WDT(); // // disable_interrupts(); ////FY WriteMultiByteToInfoSegment(PARAMETER_BASE, FlashBuf, PARA_LEN); // enable_interrupts(); //FY ReadMultiByteFromInfoSegment(PARAMETER_BASE, FlashBuf, PARA_LEN); } //****************************************************************************** //系统参数初始化,读取出厂参数 void SystemParameterInit(void) { currentMode.Bit.ComModeOperate = 0; //------------------------------------------------------------------------------ InternalShortParameterInit(); InternalLongParameterInit(); //------------------------------------------------------------------------------ // 先读取温度,判断模式 ManagePrimaryTimeInterval(); //------------------------------------------------------------------------------ Clear_WDT(); //------------------------------------------------------------------------------ ReadMultiByteFromMemory(SERIES_BASE, (u8 *)&meterSN1, SERIES_DEPTH); //------------------------------------------------------------------------------ localAddress = (u16)ReadShortParameterFromMemory(SLAVER_ADDR, SLAVER_ADDR_DEFAULT); #ifndef ENABLE_USER_I2C #pragma message("[undefined] ENABLE_USER_I2C") #elif(ENABLE_USER_I2C) I2CAddr = localAddress; #endif // for GDCF // GCFCoefA = (s32)ReadParameterFromEEPROM(GCF_A, GCF_A_WIDTH, (u32)GCF_A_DEFAULT); GDCFactor = (u16)ReadShortParameterFromMemory(GCF_B, GCF_DEFAULT); // GCFCoefC = (s32)ReadParameterFromEEPROM(GCF_C, GCF_C_WIDTH, GCF_C_DEFAULT); ComputeGCFFactor(); Clear_WDT(); offsetGas = (u16)ReadShortParameterFromMemory(GAS_OFFSET, 32768); //------------------------------------------------------------------------------ // offsetGCFX = (u16)ReadParameterFromEEPROM(OFFSET_GCFX, OFFSET_GCFX_WIDTH, 32768); //------------------------------------------------------------------------------ samplingInterval = factoryInterval; samplingTiming = SetupResponseTime(factoryInterval, SAMPLE_PERIOD_DEFAULT); responseTimeIndex = (u16)ReadShortParameterFromMemory(RESPONSE_TIME, RESPONSE_TIME_DEFAULT); responseTime = SetupResponseTime(responseTimeIndex, RESPONSE_TIME_DEFAULT); // for max current Loop flowrate maxFlowRate = ReadLongParameterFromMemory(OUT_MAX_FLOW, MAX_FR_DEFAULT); tempL.DWord = maxFlowRate; maxFlowRateH = tempL.Word[1]; maxFlowRateL = tempL.Word[0]; minFlowRate = ReadLongParameterFromMemory(OUT_MIN_FLOW, MIN_FR_DEFAULT); // V2004 tempL.DWord = minFlowRate; minFlowRateH = tempL.Word[1]; minFlowRateL = tempL.Word[0]; Clear_WDT(); //read uart DecimalPoint uartDecimalPoint = (u16)ReadShortParameterFromMemory(COM_DECIMAL, COM_DECIMAL_POINT_DEFAULT); //============================================================================ // for AUTO TXD DATA timingTxdStart = (u16)ReadShortParameterFromMemory(TIMING_TXD_START, TIMING_TXD_START_DEFAULT); timingTxdLen = (u16)ReadShortParameterFromMemory(TIMING_TXD_LEN, TIMING_TXD_LEN_DEFAULT); timingTxdTime = (u16)ReadShortParameterFromMemory(TIMING_TXD_TIME, TIMING_TXD_TIME_DEFAULT); // key setup password //============================================================================ #ifndef ENABLE_KEY_FUNCTION #pragma message("[undefined] ENABLE_KEY_FUNCTION") #elif(ENABLE_KEY_FUNCTION) keyPassWord = ReadParameterFromEEPROM(KEY_PASSWORD, KEY_PASSWORD_WIDTH, KEY_PASSWORD_DEFAULT); #endif //============================================================================ UnitConverterInit(); //============================================================================ #ifndef ENABLE_ACCPULSE #pragma message("[undefined] ENABLE_ACCPULSE") #elif(ENABLE_ACCPULSE) PulseParameterInit(); #endif //============================================================================ GasAnalysisParameterInit(); //============================================================================ SaveParameterInit(); //============================================================================== // 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(); //---------------------------------------------------------------------------- // V2004 #ifndef ENABLE_ALARM_ACC #pragma message("[undefined] ENABLE_ALARM_ACC") #elif(ENABLE_ALARM_ACC) alarmAcc = ReadParameterFromEEPROM(ALARM_ACC, ALARM_ACC_WIDTH, ALARM_ACC_DEFAULT); #endif //---------------------------------------------------------------------------- #ifndef ENABLE_LEAK_DETECT #pragma message("[undefined] ENABLE_LEAK_DETECT") #elif(ENABLE_LEAK_DETECT) minLeakFlowRate = (u16)ReadParameterFromEEPROM(MIN_LEAK_FLOW, MIN_LEAK_FLOW_WIDTH, MIN_LEAK_FLOW_DEFAULT); maxLeakFlowRate = (u16)ReadParameterFromEEPROM(MAX_LEAK_FLOW, MAX_LEAK_FLOW_WIDTH, MAX_LEAK_FLOW_DEFAULT); leakDetectTime = (u16)ReadParameterFromEEPROM(LEAK_TIME, LEAK_TIME_WIDTH, LEAK_TIME_DEFAULT); #endif //============================================================================== #ifndef REC_ACC_PER #pragma message("[undefined] REC_ACC_PER") #elif(REC_ACC_PER) RetrieveLastAccumulation(); #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 //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=========================================================================*/ // SI2C_Init(); /*Memory Init==========================================================================*/ EEPROMInit(); //if(REC_ACC_PER) FRAMInit();// Acc flowrate save enable bit /*external tempreture Init============================================================*/ // HWState.EnableTempTest= 1; // HWState.EnableTempInit=1; // WriteWordRegister(CONFIG, SHUT_DOWN);//配置寄存器初始化 } //****************************************************************************** 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============================================================================ #ifndef ENABLE_USER_I2C #pragma message("[undefined] ENABLE_USER_I2C") #elif(ENABLE_USER_I2C) I2C_Slave_Init(100000 , 0x02); I2CAddr = localAddress; #endif } //****************************************************************************** void InitGlobalVar(void) { u8 I; jumpError = 0; Clear_WDT(); //TXDMode = ENABLE_TXD_USE_DMA; displayUpdate = 0; flowRate = 0; for(I=0; I<12; I++) Dis1[I] = 0; for(I=0; I