📄 rtc.c
字号:
/*******************************************************************************
*File: main.c
*功能: 运行RTC进行计时,并将所计时间值不断地通过串口向上位机发送
*******************************************************************************/
#include "CFG.h"
/*
#define Bln_RTCReadYEAR
#define Bln_RTCReadMONTH
#define Bln_RTCReadDOY
#define Bln_RTCReadDOW
#define Bln_RTCReadDOM
#define Bln_RTCReadHOUR
#define Bln_RTCReadMIN
#define Bln_RTCReadSEC
*/
#ifdef Bln_RTCReadYEAR
uint16 RTC_ReadYEAR; //读年值
#endif
#ifdef Bln_RTCReadMONTH
uint8 RTC_ReadMONTH; //读月值
#endif
#ifdef Bln_RTCReadDOY
uint16 RTC_ReadDOY; //读天值
#endif
#ifdef Bln_RTCReadDOW
uint8 RTC_ReadDOW; //读星期值
#endif
#ifdef Bln_RTCReadDOM
uint8 RTC_ReadDOM; //读日值
#endif
#ifdef Bln_RTCReadHOUR
uint8 RTC_ReadHOUR; //读小时值
#endif
#ifdef Bln_RTCReadMIN
uint8 RTC_ReadMIN; //读分值
#endif
#ifdef Bln_RTCReadSEC
uint8 RTC_ReadSEC; //读秒值
#endif
void RTCInit(uint16 RTC_YEAR,uint8 RTC_MONTH,uint16 RTC_DOY,uint8 RTC_DOW,uint8 RTC_DOM,uint8 RTC_HOUR,uint8 RTC_MIN,uint8 RTC_SEC,uint16 RTC_CIIR);
void Func_RTCReadTime(void);
void Func_RTCRest(void);
void Func_RTCAMR(uint8 RTCAMR_YEAR,uint8 RTCAMR_MONTH,uint8 RTCAMR_DOY,uint8 RTCAMR_DOW,uint8 RTCAMR_DOM,uint8 RTCAMR_HOUR,uint8 RTCAMR_MIN,uint8 RTCAMR_SEC);
void Func_RTCAL(uint16 RTCAL_YEAR,uint8 RTCAL_MONTH,uint16 RTCAL_DOY,uint8 RTCAL_DOW,uint8 RTCAL_DOM,uint8 RTCAL_HOUR,uint8 RTCAL_MIN,uint8 RTCAL_SEC);
/****************************************************************************
* 名 称:void Func_RTCReadTime(void)
* 功 能:读出各个时间的值。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Func_RTCReadTime(void)
{ uint32 RTCTimer;
//读星期、小时、分、秒
RTCTimer=CTIME0;
#ifdef Bln_RTCReadDOW
RTC_ReadDOW=(RTCTimer>>24) & 0X07;
#endif
#ifdef Bln_RTCReadHOUR
RTC_ReadHOUR=(RTCTimer>>16) & 0X1F;
#endif
#ifdef Bln_RTCReadMIN
RTC_ReadMIN=(RTCTimer>>8) & 0X3F;
#endif
#ifdef Bln_RTCReadSEC
RTC_ReadSEC=(RTCTimer>>0) & 0X3F;
#endif
//读年、月、日
RTCTimer=CTIME1;
#ifdef Bln_RTCReadYEAR
RTC_ReadYEAR=(RTCTimer>>16) & 0X0FFF;
#endif
#ifdef Bln_RTCReadMONTH
RTC_ReadMONTH=(RTCTimer>>8) & 0X0F;
#endif
#ifdef Bln_RTCReadDOM
RTC_ReadDOM=(RTCTimer>>0) & 0X1F;
#endif
//读天数
RTCTimer=CTIME2;
#ifdef Bln_RTCReadDOY
RTC_ReadDOY=(RTCTimer>>0) & 0X1FF;
#endif
}
/****************************************************************************
* 名 称:RTCInit()
* 功 能:初始化实时时钟。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void RTCInit(uint16 RTC_YEAR,uint8 RTC_MONTH,uint16 RTC_DOY,uint8 RTC_DOW,uint8 RTC_DOM,uint8 RTC_HOUR,uint8 RTC_MIN,uint8 RTC_SEC,uint16 RTC_CIIR)
{ //RTC_DOY,一年当中的第几天,RTC_DOW 星期,RTC_DOM几号[例(1月1日)中的1日]
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
if (RTC_YEAR)
{ YEAR = RTC_YEAR; // 设置年
}
if (RTC_MONTH)
{ MONTH = RTC_MONTH; // 设置月
}
if (RTC_DOY)
{ DOY=RTC_DOY; // 设置第几天
}
if (RTC_DOW)
{ DOW = RTC_DOW; // 设置星期
}
if (RTC_DOM)
{ DOM=RTC_DOM; // 设置日
}
if (RTC_HOUR)
{ HOUR = RTC_HOUR; // 设置小时
}
if (RTC_MIN )
{ MIN = RTC_MIN; // 设置分钟
}
if (RTC_SEC)
{ SEC = RTC_SEC; // 设置秒
}
CIIR =(CIIR& 0X0000) |(0X01<< RTC_CIIR); // 设置秒值的增量产生一次中断
CCR = 0x01; // 启动RTC
}
/****************************************************************************
* 名 称:void Func_RTCRest(void)
* 功 能:复位实时时钟。复位后,只有预分频寄存器PREINT,PREFRAC的值被硬件初始化,其余的寄存器不变
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Func_RTCRest(void)
{ CCR |= 0x02; // 复位RTC
}
/****************************************************************************
* 名 称:void Func_RTCAMR(uint8 RTCAMR_YEAR,uint8 RTCAMR_MONTH,uint8 RTCAMR_DOY,
uint8 RTCAMR_DOW,uint8 RTCAMR_DOM,uint8 RTCAMR_HOUR,uint8 RTCAMR_MIN,uint8 RTCAMR_SEC)
* 功 能:报警屏蔽。
* 入口参数:RTCAMR_YEAR、RTCAMR_MONTH、RTCAMR_DOY...
* 出口参数:无
****************************************************************************/
void Func_RTCAMR(uint8 RTCAMR_YEAR,uint8 RTCAMR_MONTH,uint8 RTCAMR_DOY,uint8 RTCAMR_DOW,uint8 RTCAMR_DOM,uint8 RTCAMR_HOUR,uint8 RTCAMR_MIN,uint8 RTCAMR_SEC)
{ AMR=RTCAMR_SEC <<0 | //SEC报警屏蔽,1:屏蔽;0:禁止
RTCAMR_MIN <<1 | //MIN报警屏蔽,1:屏蔽;0:禁止
RTCAMR_HOUR <<2 | //HOUR报警屏蔽,1:屏蔽;0:禁止
RTCAMR_DOM <<3 | //DOM报警屏蔽,1:屏蔽;0:禁止
RTCAMR_DOW <<4 | //DOW报警屏蔽,1:屏蔽;0:禁止
RTCAMR_DOY <<5 | //DOY报警屏蔽,1:屏蔽;0:禁止
RTCAMR_MONTH<<6 | //MONTH报警屏蔽,1:屏蔽;0:禁止
RTCAMR_YEAR <<7 ; //YEAR报警屏蔽,1:屏蔽;0:禁止
}
/****************************************************************************
* 名 称:void Func_RTCAMR(uint16 RTCAL_YEAR,uint8 RTCAL_MONTH,uint16 RTCAL_DOY,uint8 RTCAL_DOW,
uint8 RTCAL_DOM,uint8 RTCAL_HOUR,uint8 RTCAL_MIN,uint8 RTCAL_SEC)
* 功 能:报警比较值。
* 入口参数:RTCAL_YEAR、RTCAL_MONTH、RTCAL_DOY...
* 出口参数:无
****************************************************************************/
void Func_RTCAL(uint16 RTCAL_YEAR,uint8 RTCAL_MONTH,uint16 RTCAL_DOY,uint8 RTCAL_DOW,uint8 RTCAL_DOM,uint8 RTCAL_HOUR,uint8 RTCAL_MIN,uint8 RTCAL_SEC)
{ ALYEAR =RTCAL_YEAR;
ALMON =RTCAL_MONTH;
ALDOY =RTCAL_DOY;
ALDOW =RTCAL_DOW;
ALDOM =RTCAL_DOM;
ALHOUR =RTCAL_HOUR;
ALMIN =RTCAL_MIN;
ALSEC =RTCAL_SEC;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -