/** * @brief RTC Application runs in while loop * @param None * @retval : None */ void RTC_Application(void) { uint8_t ReturnValue; CalculateTime(); if(TimeDateDisplay==0) { DisplayTime(); } if(DisplayDateFlag==1 && TimeDateDisplay==0) { DisplayDate(); DisplayDateFlag=0; } if(AlarmStatus==1) { DisplayAlarm(); GPIO_SetBits(GPIOC, GPIO_Pin_6); Dummy=RTC_GetCounter(); AlarmStatus=2; } if(((RTC_GetCounter()-Dummy) == 4) && (AlarmStatus==2)) { GPIO_ResetBits(GPIOC, GPIO_Pin_6); SelIntExtOnOffConfig(ENABLE); RightLeftIntExtOnOffConfig(ENABLE); UpDownIntOnOffConfig(ENABLE); MenuInit(); Dummy=0; AlarmStatus = 0; } if(TamperEvent == 1) /* Tamper event is detected */ { TamperNumber = TamperNumber + 1; BKP_WriteBackupRegister(BKP_DR5,TamperNumber); BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE); BKP_WriteBackupRegister(BKP_DR2,s_DateStructVar.Month); BKP_WriteBackupRegister(BKP_DR3,s_DateStructVar.Day); BKP_WriteBackupRegister(BKP_DR4,s_DateStructVar.Year); BKP_WriteBackupRegister(BKP_DR9,s_AlarmDateStructVar.Day); BKP_WriteBackupRegister(BKP_DR8,s_AlarmDateStructVar.Month); BKP_WriteBackupRegister(BKP_DR10,s_AlarmDateStructVar.Year); BKP_WriteBackupRegister(BKP_DR6,ClockSource); BKP_WriteBackupRegister(BKP_DR7,SummerTimeCorrect); ReturnValue=EE_WriteVariable(TamperNumber); if(ReturnValue==PAGE_FULL) { ReturnValue=EE_WriteVariable(TamperNumber); } ReturnValue=EE_WriteVariable(s_DateStructVar.Day); ReturnValue=EE_WriteVariable(s_DateStructVar.Month); ReturnValue=EE_WriteVariable((s_DateStructVar.Year)/100); ReturnValue=EE_WriteVariable((s_DateStructVar.Year)%100); ReturnValue=EE_WriteVariable((s_TimeStructVar.HourHigh*10)+\ s_TimeStructVar.HourLow); ReturnValue=EE_WriteVariable((s_TimeStructVar.MinHigh*10)+\ s_TimeStructVar.MinLow); ReturnValue=EE_WriteVariable((s_TimeStructVar.SecHigh*10)+\ s_TimeStructVar.SecLow); while(!(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))) { } TamperEvent=0; BKP_TamperPinCmd(ENABLE); } if(BatteryRemoved != 0) /* Battery tamper is detected */ { TamperNumber = TamperNumber + 1; BKP_WriteBackupRegister(BKP_DR5,TamperNumber); ReturnValue=EE_WriteVariable(TamperNumber); if(ReturnValue==PAGE_FULL) { ReturnValue=EE_WriteVariable(TamperNumber); } ReturnValue=EE_WriteVariable(s_DateStructVar.Day); ReturnValue=EE_WriteVariable(s_DateStructVar.Month); ReturnValue=EE_WriteVariable((s_DateStructVar.Year)/100); ReturnValue=EE_WriteVariable((s_DateStructVar.Year)%100); ReturnValue=EE_WriteVariable((s_TimeStructVar.HourHigh*10)\ +s_TimeStructVar.HourLow); ReturnValue=EE_WriteVariable((s_TimeStructVar.MinHigh*10)\ +s_TimeStructVar.MinLow); if(BatteryRemoved==1) { ReturnValue=EE_WriteVariable(BATTERY_REMOVED); BatteryRemoved=0; } else if(BatteryRemoved==2) { ReturnValue=EE_WriteVariable(BATTERY_RESTORED); BatteryRemoved=0; } BKP_TamperPinCmd(ENABLE); } }
/*********************************************************** 函数名称:Uart_Order_Pro() 函数功能:UART命令处理 入口参数: 出口参数: 备 注:1 帧格式检查; 2 命令处理; ***********************************************************/ uint8 DLT645Main(COM_TYPEDEF com) { uint8 *pBuf; uint16 Len = 0; uint8 BUFFER1[6],BUFFER2[6],Address[6]; Len = ProtocolDataRec(com, &pBuf); if(Len != 0) { uart_buff=(struct uart_buff_type *)(pBuf+GetFE(pBuf)); //丢弃0xFE if(Uart_Frame_Chk(uart_buff->Buffer)) //帧格式检查 { MeterInfoParaGet(0x01020002, BUFFER2); Address_Change(Address,BUFFER2); Uart_Sub_33(); uart_err.byte = 0x00; if((uart_buff->Buffer[1] == 0xaa) && (uart_buff->Buffer[2] == 0xaa) && (uart_buff->Buffer[3] == 0xaa) && (uart_buff->Buffer[4] == 0xaa) && (uart_buff->Buffer[5] == 0xaa) && (uart_buff->Buffer[6] == 0xaa)) { if((uart_buff->Buffer[8] == 0x13) && (uart_buff->Buffer[9] == 0x00)) //广播读地址 { Broadcast_Read_Addr(Address); } else if((uart_buff->Buffer[8] == 0x15) && (uart_buff->Buffer[9] == 0x06)) { Address_Change(BUFFER1,&uart_buff->Buffer[10]); if(0 == MeterInfoParaSet(0x01020002, BUFFER1, 6)) { Broadcast_write_Addr(BUFFER1); //======================================= //清电能及密码 BillingParaSet(0x09050081, NULL, 0); PassWordSetDefault(); DisplayAlarm(DIS_ALARM_CLEAR_OK,TRUE);//显示OK //======================================= } else { uart_err.byte=0xff; //0xff无需应答 } } else if((uart_buff->Buffer[8] == 0x11) && (uart_buff->Buffer[9] == 0x04)) //AA广播读地址 { if((uart_buff->Buffer[10] == 0x01)&&(uart_buff->Buffer[11] == 0x04)&&(uart_buff->Buffer[12] == 0x00)&&(uart_buff->Buffer[13] == 0x04)) { AA_Read_Addr(Address); } else if((uart_buff->Buffer[10] == 0x02)&&(uart_buff->Buffer[11] == 0x04)&&(uart_buff->Buffer[12] == 0x00)&&(uart_buff->Buffer[13] == 0x04)) { AA_Read_Meter_No(); } else { uart_err.byte=0xff; //0xff无需应答 } } //-------- used for calibrate meter ---------- else if(uart_buff->Buffer[8] == 0x11)//read data { if((uart_buff->Buffer[13]==0xe0)||(uart_buff->Buffer[13]==0xe1)||(uart_buff->Buffer[13]==0x02))//calibrate meter { Drv_Calibrate_DLT6452007(0); } } else if(uart_buff->Buffer[8] == 0x14)//write data { if((uart_buff->Buffer[13]==0xe0)||(uart_buff->Buffer[13]==0xe1))//calibrate meter { Drv_Calibrate_DLT6452007(1); } } else { uart_err.byte=0xff; //0xff无需应答. } } else if((uart_buff->Buffer[1] == 0x00) && (uart_buff->Buffer[2] == 0x00) && (uart_buff->Buffer[3] == 0x00) && (uart_buff->Buffer[4] == 0x00) && (uart_buff->Buffer[5] == 0x00) && (uart_buff->Buffer[6] == 0x00)) { //-------- used for calibrate meter ---------- if(uart_buff->Buffer[8] == 0x11)//read data { if((uart_buff->Buffer[13]==0xe0)||(uart_buff->Buffer[13]==0xe1)||(uart_buff->Buffer[13]==0x02))//calibrate meter { Drv_Calibrate_DLT6452007(0); } } else if(uart_buff->Buffer[8] == 0x14)//write data { if((uart_buff->Buffer[13]==0xe0)||(uart_buff->Buffer[13]==0xe1))//calibrate meter { Drv_Calibrate_DLT6452007(1); } } //--------------end---------------------- else { uart_err.byte=0xff; //0xff无需应答. } } else if(memcmp(&uart_buff->Buffer[1],Address,6) == 0) { //-------- used for calibrate meter ---------- if(uart_buff->Buffer[8] == 0x11)//read data { if((uart_buff->Buffer[13]==0xe0)||(uart_buff->Buffer[13]==0xe1)||(uart_buff->Buffer[13]==0x02))//calibrate meter { Drv_Calibrate_DLT6452007(0); } } else if(uart_buff->Buffer[8] == 0x14)//write data { if((uart_buff->Buffer[13]==0xe0)||(uart_buff->Buffer[13]==0xe1))//calibrate meter { Drv_Calibrate_DLT6452007(1); } } //--------------end---------------------- else { uart_err.byte=0xff; //0xff无需应答 } } else { uart_err.byte=0xff; //0xff无需应答. } } else { uart_err.byte=0xff; //0xff无需应答. } if(uart_err.byte == 0xff) { //不是645协义,不处理数据 // LDRV_CommRxEnable(com); return 0; } else { if(uart_err.byte == 0x00) //正常应答 { uart_buff->Buffer[8]|=0x80; //从站正常应答命令 } else //异常应答 { if(uart_buff->Buffer[8]==0x03) { //安全认证命令异常应答 uart_buff->Buffer[8]|=0xc0;//cmd uart_buff->Buffer[9]=2;//leng uart_buff->Buffer[10]=uart_err.byte;//data uart_buff->Buffer[11]=0x00;//data } else { uart_buff->Buffer[8]|=0xc0; //从站正常应答命令 uart_buff->Buffer[9]=1;//leng uart_buff->Buffer[10]=uart_err.byte;//data } } } Uart_Tran_Frame(); LDRV_UsartSend(com,(uint8 *)pBuf, uart_buff->Buffer[9]+12+GetFE(pBuf)); //应答是否要FE??? return 1; } return 0; }