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

📄 rtc.c

📁 C语言源代码及相关资料
💻 C
字号:


#include 	"config.h"


INT8U		RTC_Init_OK=0;
/*******************************************************************************************************
** 函数名称:  RTC_InitDft
** 函数功能:  按照默认值初始化实时时钟.RTC被初始化为时钟源选择Fpclk,秒值增加一次后产生中断
** 入口参数:  time: 初始化时间指针
** 出口参数:  无
*******************************************************************************************************/

uint8 RTC_InitDft(void)
{
	CCR     = 0x00;								// 禁止时间计数器
	
	PREINT 	= Fpclk / 32768 - 1;				// 设置基准时钟分频器,RTC时钟使用内部时钟分频得到
	PREFRAC = Fpclk % 32768;
	
	if(GPS_Fault==0&&(GPS_DATA.Time.Year>0)&&(GPS_DATA.Time.Mon>0)&&(GPS_DATA.Time.Day>0))
	{
		GPS_DATA.Time.Week=weekdayGet(GPS_DATA.Time.Year,GPS_DATA.Time.Mon,GPS_DATA.Time.Day);		
		YEAR 	= GPS_DATA.Time.Year+2000;							// 初始化时间寄存器
		MONTH	= GPS_DATA.Time.Mon;
		DOM 	= GPS_DATA.Time.Day;
		DOW 	= GPS_DATA.Time.Week;
		HOUR	= GPS_DATA.Time.Hour;
		MIN 	= GPS_DATA.Time.Min;
		SEC		= GPS_DATA.Time.Sec;
		RTC_Init_OK=2;	//GPS时间
	}
	
	
	CISS   &= ~(0x01 << 7);						// 必需禁止次秒级中断,因为该寄存器的值不受复位影响
	AMR	   |= 0xff;								// 必需禁止报警,因为它的值不受复位影响
	CIIR 	= 0x01;								// 设置秒值的增量产生1次中断
	ILR    |= 0x03;								// 清除RTC增量中断标志
	
	CCR  	= 0x01;								// 启动RTC,时钟源使用Fpclk
	
	
	
	return	TRUE;
	
}

uint8 RTC_InitDft2(void)
{
	CCR   	= 0x00;							// 禁止时间计数器
	
	/*
	if(GPS_Fault==0&&(GPS_DATA.Time.Year>0)&&(GPS_DATA.Time.Mon>0)&&(GPS_DATA.Time.Day>0))
	{
		GPS_DATA.Time.Week=weekdayGet(GPS_DATA.Time.Year,GPS_DATA.Time.Mon,GPS_DATA.Time.Day);		
		YEAR 	= GPS_DATA.Time.Year+2000;							// 初始化时间寄存器
		MONTH	= GPS_DATA.Time.Mon;
		DOM 	= GPS_DATA.Time.Day;
		DOW 	= GPS_DATA.Time.Week;
		HOUR	= GPS_DATA.Time.Hour;
		MIN 	= GPS_DATA.Time.Min;
		SEC		= GPS_DATA.Time.Sec;
		RTC_Init_OK=2;	//GPS时间
	}
	*/
	{
		uint16 time[7] = {2009, 6, 20, 5, 20, 10, 28};// 用于设定RTC的初始时间
		
		YEAR 	= time[0];						// 初始化时间寄存器
		MONTH	= time[1];
		DOM 	= time[2];
		DOW 	= time[3];
		HOUR	= time[4];
		MIN 	= time[5];
		SEC		= time[6];
	
	}
	
	INTWAKE = 1 << 15;            			// 允许RTC唤醒CPU
	
	CIIR    = 0;							// 由于复位后改寄存器的值未定,因此必须清零,以免影响其他中断
	CISS    = 0;							// 必需禁止次秒级中断,因为该寄存器的值不受复位影响
	AMR		= 0xfe;							// 只打开秒报警,必需禁止其他报警,因为它的值不受复位影响
	ALSEC 	= 38;							// 设置秒报警寄存器的值为38,即每分钟的第38秒就产生报警中断
	ILR  	= 0x03;							// 清除RTC增量中断标志
	
	CCR  	= 0x11;							// 启动RTC,时钟源使用外部32.768KHz的独立晶振
	
	return	TRUE;
	
}



/*******************************************************************************************************
** 函数名称:  RtcTimeSnd
** 函数功能:  时间更新时,读取RTC的时间值
** 入口参数:  无
** 出口参数:  无
*******************************************************************************************************/

uint8 RtcTime(RTC_DATETIME	*	dateTime)
{
	
	uint32 datas; 
	uint32 times;
	uint32 bak;
	
	while (0 == (ILR & 0x01));					// 等待RTC增量中断
	ILR   = 0x01;								// 清除中断标志

	times = CTIME0;								// 读取完整的时钟寄存器
	datas = CTIME1;
	
	bak   = (datas >> 16) & 0xfff;				// 获取 年
    dateTime->Time_year = bak;
    
	bak   = (datas >> 8) & 0x0f;				// 获取 月
	dateTime->Time_month = bak;
	
	bak   = datas & 0x1f;						// 获取 日
    dateTime->Time_day = bak;
    
	bak   = (times >> 24) & 0x07;				// 获取 星期
    dateTime->Time_week = bak;
		
	bak   = (times >> 16) & 0x1f;				// 获取 小时
 	dateTime->Time_hour = bak;
	
	bak   = (times >> 8) & 0x3f;				// 获取 分钟
    dateTime->Time_min = bak;
    
	bak   = times & 0x3f;						// 获取 秒钟
    dateTime->Time_sec = bak;
    
    
    
    return	TRUE;

}



/****************************************************************************
* 名称:WDTinit()
* 功能:
* 入口参数:
            
*           
* 出口参数:无
* 说明:
        
* 注意: 
****************************************************************************/

void WDTinit(void)
{
	WDTC = 0xff000000;//0xff000000
	WDMOD = 0x03;
	WdtFeed();
		
}
		
void WdtFeed(void)
{
	WDFEED = 0xAA;
	WDFEED = 0x55;

}



/*********************************************************************************************************
** 函数名称: uint8	T1MAT_Init
** 功能描述: 定时器0匹配模式初始化
** 入口参数: time		匹配时间,该值会直接写入到匹配寄存器中
**			 PR_data	预分频寄存器的值
**			 T_MODE		匹配控制模式
**						0:匹配时,定时器复位
**						1:匹配时,定时器停止
**			 EXT_MODE	匹配时,外部输出控制
**						0:不执行任何动作
**						1:外部匹配输出0
**						2:外部匹配输出1
**						3:外部匹配输出翻转
**			 MATn		匹配通道选择,0~3
**			 Int_En		中断使能
**						0:发生匹配事件时,不产生中断
**						1:发生匹配事件时,产生中断
** 出口参数: 0 :初始化失败
**           1 :初始化成功
**调试说明: 调用前,要设置相关的引脚
********************************************************************************************************/
uint8  T1MAT_Init(uint32 time, uint32 PR_data, uint8 T_MODE, uint8 EXT_MODE, uint8 MATn, uint8 Int_En)
{
	if ((T_MODE > 1) || (EXT_MODE > 3) || (MATn > 3) || (Int_En > 1))
	{
		return (0);						// 参数不合理,直接返回
	}
	
	T1TCR = 0x03;						// 在设置之前,先将定时器复位
	T1IR  = T1IR | (1 << MATn);			// 清除中断标志位
	T1PR  = PR_data;					// 设置预分频器 
	/* 设置匹配寄存器 */
	switch (MATn)						
	{
		case 0:
			T1MR0 = time;
			break;
		case 1:
			T1MR1 = time;
			break;
		case 2:
			T1MR2 = time;
			break;
		case 3:
			T1MR3 = time;
			break;
		default:
			break;
	}
	T1MCR = T1MCR & (~(7 << (MATn * 3))) | (1 << (MATn * 3 + 1 + T_MODE)) | (Int_En << (MATn * 3));
	T1EMR = T1EMR & (~(3 << (MATn * 2 + 4))) | (EXT_MODE << (MATn * 2 + 4));
	T1TCR = 0x01;						// 重新启动定时器
	return (1);
}


/*********************************************************************************************************
** 函数名称 :IRQ_EINT0
** 函数功能 :外部中断0中断服务程序,取反蜂鸣器控制口。
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void  IRQ_EINT0(void)
{
	//
	EXTINT      = (1 << 0);				// 清外部中断0中断标志		
	VICVectAddr = 0x00;					// 通知VIC中断处理结束
	
	
}

/*********************************************************************************************************
** 函数名称 :Init_Eint
** 函数功能 :外部中实验
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void 	Init_Eint(void)
{
	
	PINSEL4  = 0x00100000;						// P2.10连接EINT0
	
	EXTMODE  = 0x01;							//0x00 电平触发方式,EXTMODE  = 0x01;为边沿触发方式
	EXTPOLAR = 0x00;							//低电平触发// 下降沿触发		
	
	SetVICIRQ (14, 2, (uint32)IRQ_EINT0); 
	//VICIntSelect  = 0x00;				// 所有中断通道设置为IRQ中断		
	//VICVectPri14  = 00;					// 设置外部中断0中断最高优先级	
	//VICVectAddr14 = (uint32)IRQ_EINT0;	// 设置中断服务程序地址	
	EXTINT        = (1 << 0);				// 清外部中断0中断标志		
	//VICIntEnable  = 1 << 14;			// 使能EINT0中断	
	INTWAKE  |= (1 << 0);							// 外部中断0可唤醒芯片	
	
}

#define     KEYPin		(1 << 23)		// P0.23为P0口中断输入脚
//#define     KEYPin		(1 << 1)		// P2.1为P2口中断输入脚
#define 	GPIOWAKE 	(1 << 7)		// 使能GPIO脚掉电唤醒位

/*******************************************************************************************
** 函数名称 :IRQ_Eint3
** 函数功能 :GPIO中断服务程序
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************/
void  IRQ_Eint3(void)
{
	IO2IntClr 	= KEYPin;				// 清零P2.1中断
	VICVectAddr = 0;					// 向量中断结束
	//IO2IntStatF=0;
}

/*********************************************************************************************************
** 函数名称 :Init_Eint3
** 函数功能 :外部中实验
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/

void 	Init_Eint3(void)
{
	//IO_INT_STAT=0;
	//IO2IntStatF=0;
	IO_INT_STAT= ( (1<<2 ) );	//打开P0,P2的GPIO INT STATUS	//IOIntStatus
	IO2IntStatF|=KEYPin;	//下降沿触发
	IO2IntEnF  |= KEYPin;	// 设置P2.1为下降沿中断
	
	/* 初始化中断向量 */
	SetVICIRQ (17, 1, (uint32)IRQ_Eint3); 
	//VICIntSelect  = 0x00000000;			// 设置所有中断分配为IRQ中断
	//VICVectPri17  = 1;					// 分配外部中断3为优先级1中断
	//VICVectAddr17 = (uint32)IRQ_Eint3;	// 设置中断服务程序地址
	IO2IntClr 	= KEYPin;				// 清零P2.1中断
	//VICIntEnable  = 1 << 17;			// 使能EINT3中断
	INTWAKE       |= GPIOWAKE;			// GPIO中断唤醒芯片
	

}

void  IRQ_Eint3_P0_24(void)
{
	IO0IntClr 	= KEYPin;				// 清零P2.1中断
	VICVectAddr = 0;					// 向量中断结束
	//IO0IntStatF=0;
}
void 	Init_Eint3_P0_24(void)
{
	//IO_INT_STAT=0;
	//IO2IntStatF=0;
	IO_INT_STAT= ( ( 1<<0 ) );	//打开P0,P2的GPIO INT STATUS	//IOIntStatus
	IO0IntStatF|=KEYPin;	//下降沿触发
	IO0IntEnF  |= KEYPin;	// 设置P2.1为下降沿中断
	
	/* 初始化中断向量 */
	SetVICIRQ (17, 1, (uint32)IRQ_Eint3_P0_24); 
	//VICIntSelect  = 0x00000000;			// 设置所有中断分配为IRQ中断
	//VICVectPri17  = 1;					// 分配外部中断3为优先级1中断
	//VICVectAddr17 = (uint32)IRQ_Eint3;	// 设置中断服务程序地址
	IO0IntClr 	= KEYPin;				// 清零P2.1中断
	//VICIntEnable  = 1 << 17;			// 使能EINT3中断
	INTWAKE       |= GPIOWAKE;			// GPIO中断唤醒芯片
	

}

⌨️ 快捷键说明

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