⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv_calendar.c

📁 CC1000 Rf modem C codes for philips sLpc213X ARM MCU.
💻 C
字号:
#include "config_GD61.h"
#include "include_GD61.h"
#include <stdio.h>

volatile CALENDAR CurrentTime;
volatile CALENDAR SettingTime;
////////////////////////////////////////////////////////////////////////

volatile char TimerActSecTick	   = 0;	// for timer_control function
volatile char HeartBeetTimeSecTick = 0;	// for display of time


volatile char LED_Counter=0;


volatile char 	RunningLED_Cnt=0;
volatile uint8  TestSecondTick=0;
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 ADC_ChannelTimer;
volatile uint16 LD_AlarmCounter;
volatile uint16 PW_AlarmCounter;


volatile uint32 times_time0;
volatile uint32 datas_time0;

extern ROUTETASK routeTask[MAX_ROUTE_TASK_NUM];
extern ROUTETASK relayErrorTask[MAX_ROUTE_TASK_NUM];
extern uint16 	 ModuleAddress;			//=0x5555;	//module address.

extern volatile uint16 RTC_Failed_Time;   //3000ms
extern volatile uint16 Channel_Max_Time;

////////////////////////////////////////////////////////////////////////

void __irq RTC_InterruptServing(void);
void ReadDateTime(void);
void Start_RTC(void);
void SettingRTC (CALENDAR Ctime);
void SetDefaultRTC(void);
void RTC_Time0_Sencond(void);

///////////////////////////////////////////////////////////////////////
void RTC_Time0_Sencond(void)
{
	
	uint8 i;

	ReadDateTime();
	CurrentTime.xSEC++;
	if(CurrentTime.xSEC>59)
	{
		CurrentTime.xSEC=0;
		CurrentTime.xMIN++;
		if(CurrentTime.xMIN>59)
		{
			CurrentTime.xMIN=0;
			CurrentTime.xHOUR++;
			if(CurrentTime.xHOUR>23)
			{
				CurrentTime.xHOUR=0;
				CurrentTime.xDOM++;
				if(CurrentTime.xDOM>30)
				CurrentTime.xDOM=1;
			}
		}
		
	}
	SettingRTC(CurrentTime);
	
	TimerActSecTick     =1;		//for timer_control function
	HeartBeetTimeSecTick=1;		//for display of time


	LED_Counter++;
	if(LED_Counter & 0x01 == 0x01){	IO1CLR = LED4;}	// LED1点亮
	else						  {	IO1SET = LED4;}	// LED1点亮


	RunningLED_Cnt++;
	if(RunningLED_Cnt & 0x01 == 0x01){	IO1CLR = LED_P1_21;}	// power LED点亮
	else							 {	IO1SET = LED_P1_21;}	// power LED点亮

////
	for(i=0;i<MAX_ROUTE_TASK_NUM;i++){					//
		if((routeTask[i].activityFlag==ENABLE_FLAG)&&
		   (routeTask[i].secondTimer!=0)){
			routeTask[i].secondTimer--;
		}
#ifdef RP_RELAY_ERROR
		else if((routeTask[i].waittingResponse==ENABLE_FLAG)&&
				(routeTask[i].secondTimer!=0xff)){
			routeTask[i].secondTimer++;
		}
#endif		
	}

////
#ifdef RP_RELAY_ERROR
	for(i=0;i<MAX_ROUTE_TASK_NUM;i++){					//
		if((relayErrorTask[i].activityFlag==ENABLE_FLAG)&&
		   (relayErrorTask[i].secondTimer!=0)){
			relayErrorTask[i].secondTimer--;
		}
		else if((relayErrorTask[i].waittingResponse==ENABLE_FLAG)&&
				(relayErrorTask[i].secondTimer!=0xff)){
			relayErrorTask[i].secondTimer++;
		}
	}
#endif
////
	if(enTimerLightCnt!=0){
		enTimerLightCnt--;			// decrease 1 every second.
	}

////	
	if(AutoVoltageTimer!=0){
		AutoVoltageTimer--;			//decrease 1 every second
	}

////	
	if(PW_AlarmEnTimer!=0){			//decrease 1 every second
		PW_AlarmEnTimer--;				//for alarm system
	}

	if(LD_AlarmEnTimer!=0){			//decrease 1 every second
		LD_AlarmEnTimer--;				//for alarm system
	}
	
////
	if(CC1000ResetTimer!=0){		//decrease 1 every second
		CC1000ResetTimer--;
	}

////
	if(SysReadyTimer!=0){			//decrease 1 every second
		SysReadyTimer--;
	}

	if(OutReadyTimer!=0){			//decrease 1 every second
		OutReadyTimer--;
	}

	if(TestSecondTick!=0){			//decrease 1 every second
		TestSecondTick--;
	}
	
////
	ADC_ChannelTimer++;
	if(ADC_ChannelTimer>=Channel_Max_Time){		//decrease 1 every second
		ADC_ChannelTimer=0;		
	}
		
////
	if((CurrentTime.xHOUR == EN_ALARM_MSG_SENDING_TIME)&&
	   (CurrentTime.xMIN  == (ModuleAddress*3)/60)&&
	   (CurrentTime.xSEC  == (ModuleAddress*3)%60)){
	   
			LD_AlarmCounter=0;		//enable alarm message sending at about 10 hour
			PW_AlarmCounter=0;
	}
////
 
}






/*******************************************************************/
//status ok
void __irq RTC_InterruptServing(void)
{
uint32 datas;
uint32 times;
uint8 i;
	RTC_Failed_Time=3000;						
////
	TraceFunAddr((void*)RTC_InterruptServing);	//for watchdog tracing
////		
	
	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;			// 获取 秒钟
	
	TimerActSecTick     =1;		//for timer_control function
	HeartBeetTimeSecTick=1;		//for display of time


	LED_Counter++;
	if(LED_Counter & 0x01 == 0x01){	IO1CLR = LED4;}	// LED1点亮
	else						  {	IO1SET = LED4;}	// LED1点亮


	RunningLED_Cnt++;
	if(RunningLED_Cnt & 0x01 == 0x01){	IO1CLR = LED_P1_21;}	// power LED点亮
	else							 {	IO1SET = LED_P1_21;}	// power LED点亮

////
	for(i=0;i<MAX_ROUTE_TASK_NUM;i++){					//
		if((routeTask[i].activityFlag==ENABLE_FLAG)&&
		   (routeTask[i].secondTimer!=0)){
			routeTask[i].secondTimer--;
		}
#ifdef RP_RELAY_ERROR
		else if((routeTask[i].waittingResponse==ENABLE_FLAG)&&
				(routeTask[i].secondTimer!=0xff)){
			routeTask[i].secondTimer++;
		}
#endif		
	}

////
#ifdef RP_RELAY_ERROR
	for(i=0;i<MAX_ROUTE_TASK_NUM;i++){					//
		if((relayErrorTask[i].activityFlag==ENABLE_FLAG)&&
		   (relayErrorTask[i].secondTimer!=0)){
			relayErrorTask[i].secondTimer--;
		}
		else if((relayErrorTask[i].waittingResponse==ENABLE_FLAG)&&
				(relayErrorTask[i].secondTimer!=0xff)){
			relayErrorTask[i].secondTimer++;
		}
	}
#endif
////
	if(enTimerLightCnt!=0){
		enTimerLightCnt--;			// decrease 1 every second.
	}

////	
	if(AutoVoltageTimer!=0){
		AutoVoltageTimer--;			//decrease 1 every second
	}

////	
	if(PW_AlarmEnTimer!=0){			//decrease 1 every second
		PW_AlarmEnTimer--;				//for alarm system
	}

	if(LD_AlarmEnTimer!=0){			//decrease 1 every second
		LD_AlarmEnTimer--;				//for alarm system
	}
	
////
	if(CC1000ResetTimer!=0){		//decrease 1 every second
		CC1000ResetTimer--;
	}

////
	if(SysReadyTimer!=0){			//decrease 1 every second
		SysReadyTimer--;
	}

	if(OutReadyTimer!=0){			//decrease 1 every second
		OutReadyTimer--;
	}

	if(TestSecondTick!=0){			//decrease 1 every second
		TestSecondTick--;
	}
	
////
	ADC_ChannelTimer++;
	if(ADC_ChannelTimer>=Channel_Max_Time){		//decrease 1 every second
		ADC_ChannelTimer=0;		
	}
		
////
	if((CurrentTime.xHOUR == EN_ALARM_MSG_SENDING_TIME)&&
	   (CurrentTime.xMIN  == (ModuleAddress*3)/60)&&
	   (CurrentTime.xSEC  == (ModuleAddress*3)%60)){
	   
			LD_AlarmCounter=0;		//enable alarm message sending at about 10 hour
			PW_AlarmCounter=0;
	}
////
    ILR = 0x01;						// 清除RTC增量中断标志
    VICVectAddr = 0;				// 向量中断结束
}

//////////////////////////////////////////////////////////////////
//status ok

void ReadDateTime(void)
{
uint32 datas;
uint32 times;
	
	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;			// 获取 秒钟
}


	



/*********************************************************************
** 函数名称 :RTCInit()
** 函数功能 :初始化实时时钟
** 入口参数 :无
** 出口参数 :无
status ok
*********************************************************************/
void Start_RTC(void)
{
//	char dbuf[100];
	uint16 CTC1;
	uint16 CTC_i;
	IRQDisable();
	
	CCR   = 0x12;		// 使用独立振荡器, CTC reset
    ILR   = 0x03;		// 清除增量中断标志
    

	/* VIC初始化 */
    VICVectCntl2 = 0x20|INT_RTC;				// 分配通道2
    VICVectAddr2 = (int)RTC_InterruptServing;	// 设置中断服务程序地址
    VICIntEnable = (1<<INT_RTC);				// 使能RTC中断
    
    ILR 		= 0x01;	// 清除RTC增量中断标志
    VICVectAddr = 0;	// 向量中断结束
    
//restore the calendar
#ifdef EN_SET_DEFAULT_TIME
	SetDefaultRTC();	//set default day and time
#endif

    CCR   = 0x11;		// 使用独立振荡器, RTC start
	CIIR  = 0x01;		// 设置秒值的增量产生1次中断  
	
	CTC1=CTC;
	for(CTC_i=1;CTC_i<10000;CTC_i++);
	if(CTC==CTC1) 
	{
		PREINT=LPC_FPCLK/32768-1;
		PREFRAC=LPC_FPCLK-(PREINT+1)*32768;
		CCR=0x01;	//连接到内部预分频
	}	

//	if(CCR==0x11)	Uart0SendString("RTC work by RTC_external OSC");	//for debug
//	if(CCR==0x01)   Uart0SendString("RTC work by RTC_internal VPB");	//for debug
	IRQEnable();		// 打开中断
	RTC_Failed_Time=3000;   //3000ms
}

/////////////////////////////////////////////////////////////////////
//status ok
void SettingRTC (CALENDAR Ctime)
{
	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;
}

///////////////////////////////////////////////////////////////////
//status ok
void SetDefaultRTC(void)
{
	if((POWERUP_FLAG1!=WARM_START_FLAG1)||
	   (POWERUP_FLAG2!=WARM_START_FLAG2)){
	   
			RTC_YEAR	= 2005;
			RTC_MONTH	= 12;
			RTC_DOM		= 10;
			RTC_DOW		= 6;
			RTC_HOUR	= 18;
			RTC_MIN		= 1;
			RTC_SEC		= 40+(ModuleAddress%5);
	}
} 

/****************************************************************
**                            End Of File
****************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -