📄 rtc.c
字号:
/*********************************************************************************************************
**文件名称: RTC.c
**功能说明: RTC操作软件包
**使用说明:
********************************************************************************************************/
#include "config.h"
#include "RTC.h"
/*********************************************************************************************************
**函数名称:void RTCInit(uint8 clksrc)
**函数功能:RTC初始化操作
**入口参数:clksrc RTC时钟源选择。 0 :时钟源为VBP >0 : 时钟源为外部晶振
**出口参数:无
**说明:
********************************************************************************************************/
void RTCInit(uint8 clksrc)
{
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
ILR = 0x03; //清除RTC增量和报警中断标志
CCR = 0x02; //清零CTC,禁止RTC
if(clksrc > 0)
{
CCR = 0x01|0x10; //时钟源为外部晶振
}
else
{
CCR = 0x01;//时钟源为VBP
}
}
/*********************************************************************************************************
**函数名称:uint8 SetRTCtime(RTCtime time)
**函数功能:设置RTC的时间
**入口参数:time 时间值结构体
**出口参数:0 :参数错误
** 1 :操作成功
**说明:
********************************************************************************************************/
uint8 SetRTCtime(RTCtime time)
{
if(time.sec > 59) return 0;
if(time.min > 59) return 0;
if(time.hour > 23) return 0;
if(time.day > 31) return 0;
if(time.week > 6) return 0;
if(time.month > 12) return 0;
if(time.year > 4095) return 0;
SEC = time.sec;
MIN = time.min;
HOUR = time.hour;
DOM = time.day;
DOW = time.week;
MONTH = time.month;
YEAR = time.year;
return 1;
}
/*********************************************************************************************************
**函数名称:void GetRTCtime(RTCtime *ptime)
**函数功能:获取RTC的时间
**入口参数:*ptime 时间值结构体指针
**出口参数:无
**说明:
********************************************************************************************************/
void GetRTCtime(RTCtime *ptime)
{
uint32 tmp0,tmp1;
tmp0 = CTIME0;
tmp1 = CTIME1;
ptime->sec = tmp0 & 0x000000FF;
ptime->min = (tmp0 >> 8) & 0x000000FF;
ptime->hour = (tmp0 >>16) & 0x000000FF;
ptime->week =(tmp0 >>24)& 0x000000FF;
ptime->day = tmp1 & 0x000000FF;
ptime->month = (tmp1>>8) & 0x000000FF;
ptime->year = (tmp1>>16) & 0x0000FFFF;
}
/*********************************************************************************************************
**函数名称:void SetAMR(uint8 val)
**函数功能:设置报警屏蔽
**入口参数:val 报警屏蔽控制字节,按位操作
bit0 1---屏蔽秒值 0---不屏蔽秒值
bit1 1---屏蔽分值 0---不屏蔽分值
bit2 1---屏蔽小时值 0---不屏蔽小时值
bit3 1---屏蔽日期(月)值 0---不屏蔽日期(月)值
bit4 1---屏蔽星期值 0---不屏蔽星期值
bit5 1---屏蔽日期(年)值 0---不屏蔽日期(年)值
bit6 1---屏蔽月值 0---不屏蔽月值
bit7 1---屏蔽年值 0---不屏蔽年值
**出口参数:无
**说明:
********************************************************************************************************/
void SetAMR(uint8 val)
{
AMR = val;
}
/*********************************************************************************************************
**函数名称:uint8 SetAlarmTime(uint8 type, uint32 time)
**函数功能:设置报警时间值
**入口参数:type 时间类型。取值如下:0:秒
1:分
2:时
3:日期(月)
4:星期
5:日期(年)
6:月
7:年
time 时间值。根据类型不同,时间值的范围也不同。
**出口参数:0 :参数错误
** 1 :操作成功
**说明:
********************************************************************************************************/
uint8 SetAlarmTime(uint8 type, uint32 time)
{
switch(type)
{
case 0: //秒
if(time > 59) return 0;
ALSEC = time;
break;
case 1: //分
if(time > 59) return 0;
ALMIN = time;
break;
case 2: //时
if(time > 23) return 0;
ALHOUR = time;
break;
case 3: //日期(月)
if(time > 31) return 0;
ALDOM = time;
break;
case 4: // 星期
if(time > 6) return 0;
ALDOW = time;
break;
case 5: //日期(年)
if(time > 366) return 0;
ALDOY = time;
break;
case 6: //月
if(time > 12) return 0;
ALMON = time;
break;
case 7:
if(time > 4095) return 0;
ALYEAR = time;
break;
default :
return 0; //参数错误
}
return 1;
}
/*********************************************************************************************************
**函数名称:uint8 SetCIIR(uint8 type)
**函数功能:设置计数增量中断类型
**入口参数:type 增量中断类型。按位操作:
bit0:1 使能秒增量中断 0 禁止
bit1:1 使能分增量中断 0 禁止
bit2:1 使能时增量中断 0 禁止
bit3:1 使能日期(月)增量中断 0 禁止
bit4:1 使能星期增量中断 0 禁止
bit5:1 使能日期(年)增量中断 0 禁止
bit6:1 使能月增量中断 0 禁止
bit7:1 使能年增量中断 0 禁止
**出口参数:0 :参数错误
** 1 :操作成功
**说明:
********************************************************************************************************/
uint8 SetCIIR(uint8 type)
{
CIIR = type;
return 1;
}
/*********************************************************************************************************
**函数名称:uint8 IsIncInt(void)
**函数功能:判断是否增量中断产生
**入口参数:无
**出口参数:0 :无增量中断产生
** 1 :有增量中断产生
**说明:
********************************************************************************************************/
uint8 IsIncInt(void)
{
return (ILR & 0x01);
}
/*********************************************************************************************************
**函数名称:void CleanIncInt(void)
**函数功能:清零增量中断标志
**入口参数:无
**出口参数:无
**说明:
********************************************************************************************************/
void CleanIncInt(void)
{
ILR = 0x01;
}
/*********************************************************************************************************
**函数名称:uint8 IsAlarmInt(void)
**函数功能:判断是否报警中断产生
**入口参数:无
**出口参数:0 :无报警中断产生
** 1 :有报警中断产生
**说明:
********************************************************************************************************/
uint8 IsAlarmInt(void)
{
return ((ILR & 0x02)>>1);
}
/*********************************************************************************************************
**函数名称:void CleanAlarmInt(void)
**函数功能:清零报警中断标志
**入口参数:无
**出口参数:无
**说明:
********************************************************************************************************/
void CleanAlarmInt(void)
{
ILR = 0x02;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -