当前位置:首页 > 芯闻号 > 充电吧
[导读]相对于STM32,6410的RTC是相当的简单./***************************************************************************

相对于STM32,6410的RTC是相当的简单.




/*************************************************************************************************************
 * 文件名:	RTC.c
 * 功能:		S3C6410 RTC底层驱动函数
 * 作者:		cp1300@139.com
 * 创建时间:	2012年3月28日21:52
 * 最后修改时间:2012年3月28日
 * 详细:		RTC相关底层驱动函数
*************************************************************************************************************/
#include "system.h"
#include "rtc.h"

Time_TypeDef Timer;//存放全局时间

//内部静态变量声明
static bool uAutoTimeUpdate = FALSE;	//标记是否自动由中断更新时间
static bool uSecEnd = FALSE;			//秒结束标志,结束后就可以更新时间了


/*************************************************************************************************************************
*函数        :	void RTC_Install(u8 ENABLE)
*功能        :	RTC设置使能与失能
*参数        :	Enable:使能时钟设置,Disable:使能时钟设置
*返回        :	无
*依赖     : 	底层宏定义
*作者        :	cp1300@139.com
*时间     :	20120328
*最后修改时间:	20120329
*说明     :	平时不设置时应该设置为Disable
*************************************************************************************************************************/
void RTC_Install(u8 ENABLE)
{
	if(ENABLE)
		RTC->CON |=  BIT0;//RTC时钟设置使能
	else
		RTC->CON &=  ~BIT0;//RTC时钟设置失能
}

/*************************************************************************************************************************
*函数        :	u8 BCD_to_DEC(u8 BCD_Code)
*功能        :	BCD码转DEC码
*参数        :	BCD码
*返回        :	DEC码
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	用于将BCD码时间转换为十进制时间,长度为8bit
*************************************************************************************************************************/
u8 BCD_to_DEC(u8 BCD_Code)
{
	return ((BCD_Code >> 4) * 10 + (BCD_Code & 0x0f));
}


/*************************************************************************************************************************
*函数        :	__inline u8 GetSec(void)
*功能        :	获取秒
*参数        :	无
*返回        :	秒
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD秒获取后转化为DEC秒
*************************************************************************************************************************/
__inline u8 GetSec(void)
{
	return (BCD_to_DEC(RTC->BCDSEC));//获取秒
}

/*************************************************************************************************************************
*函数        :	__inline u8 GetMin(void)
*功能        :	获取分
*参数        :	无
*返回        :	分
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD分获取后转化为DEC分
*************************************************************************************************************************/
__inline u8 GetMin(void)
{
	return (BCD_to_DEC(RTC->BCDMIN));//获取分
}

/*************************************************************************************************************************
*函数        :	__inline u8 GetHour(void)
*功能        :	获取时
*参数        :	无
*返回        :	时
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD时获取后转化为DEC时
*************************************************************************************************************************/
__inline u8 GetHour(void)
{
	return (BCD_to_DEC(RTC->BCDHOUR));//获取时
}

/*************************************************************************************************************************
*函数        :	__inline u8 GetWeek(void)
*功能        :	获取星期
*参数        :	无
*返回        :	星期
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD星期获取后转化为DEC星期,1-7:星期一-星期日
*************************************************************************************************************************/
__inline u8 GetWeek(void)
{
	return (BCD_to_DEC(RTC->BCDDAY));//获取星期
}


/*************************************************************************************************************************
*函数        :	__inline u8 GetDate(void)
*功能        :	获取日
*参数        :	无
*返回        :	日
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD日获取后转化为DEC日
*************************************************************************************************************************/
__inline u8 GetDate(void)
{
	return (BCD_to_DEC(RTC->BCDDATE));//获取日
}


/*************************************************************************************************************************
*函数        :	__inline u8 GetMonth(void)
*功能        :	获取月
*参数        :	无
*返回        :	月
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD月获取后转化为DEC月
*************************************************************************************************************************/
__inline u8 GetMonth(void)
{
	return (BCD_to_DEC(RTC->BCDMON));//获取月
}



/*************************************************************************************************************************
*函数        :	__inline u8 GetYear(void)
*功能        :	获取年
*参数        :	无
*返回        :	年
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将BCD年获取后转化为DEC年
*************************************************************************************************************************/
__inline u8 GetYear(void)
{
	return (BCD_to_DEC(RTC->BCDYEAR));//获取年
}



/*************************************************************************************************************************
*函数        :	void UpdateTimer(void)
*功能        :	更新时间
*参数        :	无
*返回        :	无
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	将时间放在了全局的结构Timer中
*************************************************************************************************************************/
void UpdateTimer(void)
{
	Timer.w_year = 2000 + GetYear();	//更新年,起点为2000年
	Timer.w_month = GetMonth();	//更新月
	Timer.w_date = GetDate();	//更新日
	Timer.week = GetWeek();		//更新星期
	Timer.hour = GetHour();		//更新时
	Timer.min = GetMin();		//更新分
	Timer.sec = GetSec();		//更新秒
}


/*************************************************************************************************************************
*函数        :	u8 DEC_to_BCD(u8 DEC_Code)
*功能        :	DEC码转BCD码
*参数        :	DEC码
*返回        :	BCD码
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	用于将DEC码时间转换为BCD时间,长度为8bit
*************************************************************************************************************************/
u8 DEC_to_BCD(u8 DEC_Code)
{
	u8 temp;
	
	if(DEC_Code > 99)
		return 0;
	temp = DEC_Code / 10;
	temp <BCDSEC = DEC_to_BCD(DEC_Sec);//设置取秒
}

/*************************************************************************************************************************
*函数        :	void SetMin(u8 DEC_Min)
*功能        :	设置分
*参数        :	分
*返回        :	无
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetMin(u8 DEC_Min)
{
	RTC->BCDMIN = DEC_to_BCD(DEC_Min);//设置分
}

/*************************************************************************************************************************
*函数        :	void SetHour(u8 DEC_Hour)
*功能        :	设置时
*参数        :	时
*返回        :	无
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetHour(u8 DEC_Hour)
{
	RTC->BCDHOUR = DEC_to_BCD(DEC_Hour);//设置时
}

/*************************************************************************************************************************
*函数        :	void SetWeek(u8 DEC_Week)
*功能        :	设置星期
*参数        :	星期
*返回        :	无
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetWeek(u8 DEC_Week)
{
	RTC->BCDDAY = DEC_to_BCD(DEC_Week);//设置星期
}


/*************************************************************************************************************************
*函数        :	void SetDate(u8 DEC_Date)
*功能        :	设置日
*参数        :	日
*返回        :	无
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetDate(u8 DEC_Date)
{
	RTC->BCDDATE = DEC_to_BCD(DEC_Date);//设置日
}


/*************************************************************************************************************************
*函数        :	void SetMonth(u8 DEC_Month)
*功能        :	设置月
*参数        :	月
*返回        :	无
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetMonth(u8 DEC_Month)
{
	RTC->BCDMON = DEC_to_BCD(DEC_Month);//设置月
}



/*************************************************************************************************************************
*函数        :	void SetYear(u8 DEC_Year)
*功能        :	设置年
*参数        :	年
*返回        :	无
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置时间,注意需要先开启写保护,否则无法写入
*************************************************************************************************************************/
void SetYear(u8 DEC_Year)
{
	RTC->BCDYEAR = DEC_to_BCD(DEC_Year);//设置年
}



/*************************************************************************************************************************
*函数        :	void InstallData(u16 Year,u8 Month,u8 Date,u8 Week)
*功能        :	设置日期
*参数        :	年,月,日,星期
*返回        :	无
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置会自动去除写保护,年范围为2000-2099
*************************************************************************************************************************/
void InstallData(u16 Year,u8 Month,u8 Date,u8 Week)
{
	RTC_Install(ENABLE);	//允许更新时间
	SetYear(Year-2000);			//设置年
	SetMonth(Month);		//设置月
	SetDate(Date);			//设置日
	SetWeek(Week);			//设置星期
	RTC_Install(DISABLE);	//禁止更新时间
}


/*************************************************************************************************************************
*函数        :	void InstallTime(u8 Hour,u8 Min,u8 Sec)
*功能        :	设置时间
*参数        :	时,分,秒
*返回        :	无
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120329
*说明        :	设置会自动去除写保护
*************************************************************************************************************************/
void InstallTime(u8 Hour,u8 Min,u8 Sec)
{
	RTC_Install(ENABLE);	//允许更新时间
	SetHour(Hour);			//设置时
	SetMin(Min);			//设置分
	SetSec(Sec);			//设置秒
	RTC_Install(DISABLE);	//禁止更新时间
}


/*************************************************************************************************************************
*函数        :	__inline ClearIntP(void)
*功能        :	清除INTP中断标志
*参数        :	无
*返回        :	无
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	20120331
*最后修改时间:	20120331
*说明        :	无
*************************************************************************************************************************/
__inline ClearIntP(void)
{
	RTC->INTP |= BIT0;	//写1清除TIC中断
}

/*************************************************************************************************************************
*函数        :	bool RTC_SecEnd(void)
*功能        :	判断秒是否到达
*参数        :	无
*返回        :	TRUE:秒到达;FALSE:未到达
*依赖        : 	底层函数
*作者        :	cp1300@139.com
*时间        :	20120331
*最后修改时间:	20120331
*说明        :	无
*************************************************************************************************************************/
bool RTC_SecEnd(void)
{
	if(uAutoTimeUpdate == TRUE)	//开启了自动更新时间
	{
		if(uSecEnd == TRUE)		//秒结束
		{
			uSecEnd = FALSE;	//清除标志
			return TRUE;
		}
		else
			return FALSE;
	}
	if(RTC->INTP & BIT0)	//TIC中断标志置位
	{
		ClearIntP();		//清除中断标志
		return TRUE;
	}
	return FALSE;
}



//TIC中断服务程序,用于自动更新时间
void __irq Isr_RTC_InspectTick(void)
{
	uSecEnd = TRUE;					//秒结束时间成立
	UpdateTimer();					//更新所有时间
	ClearIntP();					//清除中断标志
	VICInterruptEnd();	//中断退出
}




/*************************************************************************************************************************
*函数        :	void RTC_Init(u8 AutoUpdate)
*功能        :	初始化RTC
*参数        :	EnableInt:是否开启中断
*返回        :	无
*依赖        : 	无
*作者        :	cp1300@139.com
*时间        :	20120329
*最后修改时间:	20120331
*说明        :	判断时钟是否写保护,如果没,则写开启保护,并更新时间
*************************************************************************************************************************/
void RTC_Init(FunctionalState EnableInt)
{
	RTC->TICNT = 32768-1;
	RTC->CON = BIT8;		//使能标记定时器,32768分频
	RTC_Install(DISABLE);	//开启时钟写保护
	UpdateTimer();			//更新所有时间
	if(EnableInt == ENABLE)			//使能自动更新时间
	{
		uAutoTimeUpdate = TRUE;//标志有效
		Set_IsrAddr(INT_RTC_TIC,(u32)Isr_RTC_InspectTick);//设置中断向量地址
		Set_IntEnable(INT_RTC_TIC,ENABLE);//使能TIC中断
	}
	else
	{
		uAutoTimeUpdate = FALSE;
		Set_IntEnable(INT_RTC_TIC,DISABLE);//关闭TIC中断
	}
}






/*************************************************************************************************************
 * 文件名:	RTC.H
 * 功能:		S3C6410 RTC底层驱动函数
 * 作者:		陈鹏
 * 创建时间:	2012年3月28日21:52
 * 最后修改时间:2012年3月28日
 * 详细:		RTC相关底层驱动函数
*************************************************************************************************************/
#ifndef _RTC_H_
#define _RTC_H_


 //时间结构体
typedef struct 
{
	u8 hour; 	//小时
	u8 min;	 	//分钟
	u8 sec;		//秒			
	//公历日月年周
	u16 w_year;	 	//年
	u8  w_month;	//月
	u8  w_date;		//日
	u8  week;		//星期
#if _Lunar_calendar
	//农历日月年节气
	u8 l_year;		//年
	u8 l_month;		//月
	u8 l_data;		//日
	u8 SolarTerms;	//农历节气 
#endif
}Time_TypeDef;

extern Time_TypeDef Timer;//存放全局时间

void UpdateTimer(void);	//更新全部时间
void RTC_Init(FunctionalState EnableInt);	//初始化RTC
void InstallData(u16 Year,u8 Month,u8 Date,u8 Week);	//设置日期
void InstallTime(u8 Hour,u8 Min,u8 Sec);				//设置时间
bool RTC_SecEnd(void);							//判断秒是否到达



#endif



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

实时时钟(Real-TimeClock,RTC)常用于制作时钟日历。RTC电路分属于两个电源域:备份域和VDD电源域。RTC的核心计数部分在备份域中,可在VDD断电VBAT供电时保持RTC的计数,当系统复位或者从待机模式...

关键字: ST 实时时钟 RTC

RTC简介实时时钟 (RTC) 是一个独立的BCD定时器/计数器。RTC提供具有可编程闹钟中断功能的日历时钟 /日历。RTC还包含具有中断功能的周期性可编程唤醒标志。系统可以自动将月份的天数补偿为28、29(闰年)、30...

关键字: RTC 实时时钟

针对传统类人机器人在控制系统实时性和视觉识别方面的不足,以S3C6410作为主控芯片,设计了具有视觉识别功能的类人机器人控制系统,通过改进和简化视频识别算法取得了良好的目标识别效果。实验表明,基

关键字: s3c6410 机器人 机器视觉

电路仿真软件的使用越来越多,因此电路仿真软件的重要性不言而喻。对于电路仿真软件,小编在往期文章中做过诸多介绍。为增进大家对电路仿真软件的了解,本文将对电路仿真软件proteus予以讲解,主要内容为基于proteus的实时...

关键字: proteus 实时时钟 指数 电路仿真软件

MAX31341B工作电流低于180nA,有效延长可穿戴设备、零售终端及便携系统的电池寿命

关键字: 实时时钟 微控制器 中央微控制器

PCF8563是一款低功耗的CMOS实时时钟/日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C总线接口串行传递。最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存...

关键字: pcf8563 实时时钟 日历芯片

写在前面的话:STM32F0项目进阶系列是硬件系统工程师星克曼以项目进阶的方式写出的入门教程,以项目开发为蓝底,快速学习进入实战。STM32 I2C总线在上一讲 STM32F0项目进阶之I2C 中已经讲过了,已经将标准...

关键字: stm32f0 实时时钟 ds1307

一、 首先先来看看核心板的原理图我们发现数据线才有8条,而并没有地址信号,所以该8条线一定是可以传数据,也可以传地址。而地址线肯定又不够,那么,地址肯定又是多次发出的。从datasheet可以看到它要发出5个周期的

关键字: nandflash ok6410 硬件

  RTC-Real Time Clock是430单片机的实时时钟模块,可以配置成实时时钟模式(万年历)或者一般目的的32位计数器模式,其中实时时钟模式提供了年月日、时分秒,可以选择BCD码或者二进制格式,并且具有可编程...

关键字: MSP430 rtc 单片机 实时时钟

STM32RTC使用步骤:打开PWR时钟和Backup区数据访问若使用外部低速时钟(LSE),打开LSE并等待起振选择和打开RTC时钟,等待时钟同步配置时间格式,分频系数等根据需要配置时钟,日期,闹钟,唤醒,输出,时间戳...

关键字: rtc stm32f3 实时时钟
关闭
关闭