?? drv_calendar.c
字號:
#include "config_60_61.h"
#include "config_GD61.h"
#include "include_GD61.h"
#include "config_60_61.h"
#include "config_GD60.h"
#include "include_GD60.h"
#include "Def_ATT7022.h"
volatile CALENDAR CurrentTime;
volatile CALENDAR SettingTime;
////////////////////////////////////////////////////////////////////////
// the following is is for GD60
volatile uint8 DispSecondTick =0; // for display of time
volatile uint8 U1_EngSecondTick =0; // for U1_Energy accumulation Function
volatile uint8 U2_EngSecondTick =0; // for U2_Energy accumulation Function
volatile uint8 EnergyMeterSTick =0;
volatile uint8 TempSampleFlag =0; // for temperature sampling task
volatile uint8 KKK_Check_Timer =0; // for KKK check
volatile uint8 TempSample_Timer =0;
volatile uint8 GetCurrentDataTick=0;
volatile uint8 U1U2_ReadyTimer=U1U2READYTIME; // DSP get ready time
////////////////////////////////////////////////////////////////////////
volatile char TimerActSecTick = 0; // for timer_control Function
volatile char HeartBeetTimeSecTick = 0; // for display of time
volatile uint16 enTimerLightCnt; //decrease 1 every second
volatile uint16 PW_AlarmEnTimer;
volatile uint16 LD_AlarmEnTimer;
volatile uint16 CC1000ResetTimer; //CC1000 reset timer
volatile uint16 SysReadyTimer;
volatile uint16 OutReadyTimer;
volatile uint16 LD_AlarmCounter;
volatile uint16 PW_AlarmCounter;
ROUTETASK routeTask[MAX_ROUTE_TASK_NUM];
ROUTETASK relayErrorTask[MAX_ROUTE_TASK_NUM];
extern uint16 RF_ModuleAddress; //=0x5555; //module address.
extern volatile uint16 WireCutAlarmSecTimer;
////////////////////////////////////////////////////////////////////////
//volatile CALENDAR CurrentTime;
volatile uint8 NegoSendTimerSe;
volatile uint8 PPP_Test_Tick;
volatile uint16 AtuoPingTimerS;
/////////////////////////////////////////////////////////////////////
void __irq RTC_InterruptServing(void);
void ReadDateTime(void);
void Start_RTC(void);
void SettingRTC(CALENDAR Ctime);
void SetDefaultRTC(void);
/*******************************************************************/
//status ok
void __irq RTC_InterruptServing(void)
{
uint32 datas;
uint32 times;
uint8 i;
times = CTIME0; // 讀取完整的時鐘寄存器
datas = CTIME1;
CurrentTime.xYEAR = (datas >> 16) & 0xfff; // 獲取 年
CurrentTime.xMONTH = (datas >> 8) & 0x0f; // 獲取 月
CurrentTime.xDOM = datas & 0x1f; // 獲取 日
CurrentTime.xDOW = (times >> 24) & 0x07; // 獲取 星期
CurrentTime.xHOUR = (times >> 16) & 0x1f; // 獲取 小時
CurrentTime.xMIN = (times >> 8) & 0x3f; // 獲取 分鐘
CurrentTime.xSEC = times & 0x3f; // 獲取 秒鐘
//// for PPP negotiation
if(NegoSendTimerSe != 0x0) NegoSendTimerSe --;
if(PPP_Test_Tick != 0x0) PPP_Test_Tick --;
if(AtuoPingTimerS != 0x0) AtuoPingTimerS--;
////
RUN_LED_Flash(); //flash REv2 led
//// run system timer
DispSecondTick ++; //as display of timer
U1_EngSecondTick++; //for U1_Energy accumulation function
U2_EngSecondTick++; //for U2_Energy accumulation function
EnergyMeterSTick++; //as energy meter timer
KKK_Check_Timer ++; //for Att7022 configuration data check function
TempSample_Timer++;
////
if(TempSample_Timer>=10){
TempSample_Timer=0;
TempSampleFlag = GET_SAMPLE_TEP; //enable temperature sample
}
////
TimerActSecTick =1; //for timer_control Function
HeartBeetTimeSecTick=1; //for display of time
////
for(i=0;i<MAX_ROUTE_TASK_NUM;i++){ //
if((routeTask[i].activityFlag==ENABLE_FLAG)&&
(routeTask[i].secondTimer!=0)) routeTask[i].secondTimer--;
}
////
if(U1U2_ReadyTimer>0) U1U2_ReadyTimer--;
if(GetCurrentDataTick!=0) GetCurrentDataTick--;
if(enTimerLightCnt!=0) enTimerLightCnt--;
if(AutoVoltageTimer!=0) AutoVoltageTimer--;
if(PW_AlarmEnTimer!=0) PW_AlarmEnTimer--;
if(LD_AlarmEnTimer!=0) LD_AlarmEnTimer--;
if(CC1000ResetTimer!=0) CC1000ResetTimer--;
if(SysReadyTimer!=0) SysReadyTimer--;
if(OutReadyTimer!=0) OutReadyTimer--;
if(WireCutAlarmSecTimer!=0) WireCutAlarmSecTimer--;
////
if((CurrentTime.xHOUR==EN_ALARM_MSG_SENDING_TIME)&&
(CurrentTime.xMIN ==(RF_ModuleAddress*3)/60)&&
(CurrentTime.xSEC ==(RF_ModuleAddress*3)%60)){
LD_AlarmCounter=0; //enable alarm message sending at about 10 hour
PW_AlarmCounter=0;
}
////
ILR = 0x01; // 清除RTC增量中斷標志
VICVectAddr = 0; // 向量中斷結(jié)束
}
//////////////////////////////////////////////////////////////////
//status ok
void ReadDateTime(void)
{
uint32 datas;
uint32 times;
IRQDisable();
times = CTIME0; // 讀取完整的時鐘寄存器
datas = CTIME1;
IRQEnable();
CurrentTime.xYEAR = (datas >> 16) & 0xfff; // 獲取 年
CurrentTime.xMONTH = (datas >> 8) & 0x0f; // 獲取 月
CurrentTime.xDOM = datas & 0x1f; // 獲取 日
CurrentTime.xDOW = (times >> 24) & 0x07; // 獲取 星期
CurrentTime.xHOUR = (times >> 16) & 0x1f; // 獲取 小時
CurrentTime.xMIN = (times >> 8) & 0x3f; // 獲取 分鐘
CurrentTime.xSEC = times & 0x3f; // 獲取 秒鐘
}
/*********************************************************************
** 函數(shù)名稱 :RTCInit()
** 函數(shù)功能 :初始化實時時鐘
** 入口參數(shù) :無
** 出口參數(shù) :無
status ok
*********************************************************************/
void Start_RTC(void)
{
IRQDisable();
////
#ifdef SET_DEFAULT_TIME
SetDefaultRTC(); //set default day and time
#endif
////
CCR = 0x02; // using internal clk source,, CTC reset
// CCR = 0x12; // 使用獨立振蕩器, CTC reset
PREINT = LPC_FPCLK/32768-1; //set prescale, int port
PREFRAC = LPC_FPCLK-((PREINT+1)*32768); //set prescale, fraction port
CCR = 0x01; // using internal clk source,RTC start
// CCR = 0x11; // 使用獨立振蕩器, RTC start
ILR = 0x03; // 清除增量中斷標志
CIIR = 0x01; // 設(shè)置秒值的增量產(chǎn)生1次中斷
/* VIC初始化 */
VICVectCntl2 = 0x20|INT_RTC; // 分配通道2
VICVectAddr2 = (int)RTC_InterruptServing; // 設(shè)置中斷服務(wù)程序地址
VICIntEnable = (1<<INT_RTC); // 使能RTC中斷
ILR = 0x01; // 清除RTC增量中斷標志
VICVectAddr = 0; // 向量中斷結(jié)束
IRQEnable();
}
/////////////////////////////////////////////////////////////////////
//status ok
void SettingRTC (CALENDAR Ctime)
{
IRQDisable();
CCR = 0x02; // using internal clk source,, CTC reset
RTC_YEAR = Ctime.xYEAR;
RTC_MONTH = Ctime.xMONTH;
RTC_DOM = Ctime.xDOM;
RTC_DOW = Ctime.xDOW;
RTC_HOUR = Ctime.xHOUR;
RTC_MIN = Ctime.xMIN;
RTC_SEC = Ctime.xSEC;
CCR = 0x01; // using internal clk source,RTC start
////
SetSOE_Timer(RTC_HOUR*3600*1000+
RTC_MIN*60*1000+
RTC_SEC*1000); // synchronize SOE timer
IRQEnable(); // 使能IRQ中斷
////
CurrentTime.xYEAR = Ctime.xYEAR; // 獲取 年
CurrentTime.xMONTH = Ctime.xMONTH; // 獲取 月
CurrentTime.xDOM = Ctime.xDOM; // 獲取 日
CurrentTime.xDOW = Ctime.xDOW; // 獲取 星期
CurrentTime.xHOUR = Ctime.xHOUR; // 獲取 小時
CurrentTime.xMIN = Ctime.xMIN; // 獲取 分鐘
CurrentTime.xSEC = Ctime.xSEC; // 獲取 秒鐘
}
///////////////////////////////////////////////////////////////////
//status ok
void SetDefaultRTC(void)
{
if((POWERUP_FLAG1!=WARM_START_FLAG1)||
(POWERUP_FLAG2!=WARM_START_FLAG2)){
////
IRQDisable();
CCR = 0x02; // using internal clk source,, CTC reset
RTC_YEAR = 2006;
RTC_MONTH = 10;
RTC_DOM = 1;
RTC_DOW = 4;
RTC_HOUR = 23;
RTC_MIN = 57;
RTC_SEC = 0;
CCR = 0x01; // using internal clk source,RTC start
////
SetSOE_Timer(RTC_HOUR*3600*1000+
RTC_MIN*60*1000+
RTC_SEC*1000); // synchronize SOE timer
IRQEnable(); // 使能IRQ中斷
////
CurrentTime.xYEAR = RTC_YEAR; // 獲取 年
CurrentTime.xMONTH = RTC_MONTH; // 獲取 月
CurrentTime.xDOM = RTC_DOM; // 獲取 日
CurrentTime.xDOW = RTC_DOW; // 獲取 星期
CurrentTime.xHOUR = RTC_HOUR; // 獲取 小時
CurrentTime.xMIN = RTC_MIN; // 獲取 分鐘
CurrentTime.xSEC = RTC_SEC; // 獲取 秒鐘
}
}
//////////////////////////////////////////////////////////////////
// only SOE test
void PrintSOE_Timer(void)
{
uint32 SOE_milSecond;
char buffer[100];
static uint8 SecondTick;
if(SecondTick!=DispSecondTick){
SecondTick =DispSecondTick;
SOE_milSecond=T1TC;
sprintf(buffer,"SOE timer: %d - %d = %d ms",
SOE_milSecond,SOE_milSecond/55295,
(SOE_milSecond-SOE_milSecond/55295));
DB_SendString(buffer);
ReadDateTime();
sprintf(buffer,"CUR timer: %2d:%2d:%2d %2d:%2d:%2d = %d ms",
CurrentTime.xYEAR,CurrentTime.xMONTH,CurrentTime.xDOM,
CurrentTime.xHOUR,CurrentTime.xMIN,CurrentTime.xSEC,
(CurrentTime.xHOUR*3600+CurrentTime.xMIN*60+CurrentTime.xSEC)*1000);
DB_SendString(buffer);
}
}
/****************************************************************
** End Of File
****************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -