📄 rtc.c
字号:
/***********************************************Copyright (c)*********************************************
** Guangzou ZLG-MCU Development Co.,LTD.
**
** http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: Rtc.c
** Last modified Date: 2007-11-06
** Last Version: 1.0
** Descriptions: RTC驱动程序源程序,原始版本
**
**--------------------------------------------------------------------------------------------------------
** Created by: LiXiaoCheng
** Created date: 2007-11-06
** Version: 1.0
** Descriptions: 原始版本,对功率控制和掉电唤醒使用寄存器设置方式设置。
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "Config.h"
#include "RtcPrivate.h"
#include "Rtc.h"
/*********************************************************************************************************
定义一个RTC信息结构体
*********************************************************************************************************/
__RTC_INFO GrtiData;
/*********************************************************************************************************
定义一个RTC信息结构体指针表
*********************************************************************************************************/
const __PRTC_INFO GrtiDataTab[__RTC_MAX_NUM] = {&GrtiData};
/*********************************************************************************************************
定义一个RTC寄存器基地址表
*********************************************************************************************************/
const uint32 GuiRtcBaseAddrTab[__RTC_MAX_NUM] = {RTC_BASE_ADDR};
/*********************************************************************************************************
闰年月表,私有全局变量
*********************************************************************************************************/
const uint8 __ucWeekTab[] = {
(3 << 5) + 31, /* 1月 */
(6 << 5) + 29, /* 2月 */
(0 << 5) + 31, /* 3月 */
(3 << 5) + 30, /* 4月 */
(5 << 5) + 31, /* 5月 */
(1 << 5) + 30, /* 6月 */
(3 << 5) + 31, /* 7月 */
(6 << 5) + 31, /* 8月 */
(1 << 5) + 30, /* 9月 */
(4 << 5) + 31, /* 10月 */
(0 << 5) + 30, /* 11月 */
(2 << 5) + 31 /* 12月 */
};
/*********************************************************************************************************
** Function name: __rtcDlyS
** Descriptions: rtc内部使用的小的延时函数,为了测试RTC是否在延时前后是否运行。
** Input parameters: uiArgDly 输入值越大,延时越久
** Output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
static void __rtcDlyS (uint32 uiArgDly)
{
uint32 i;
for ( ; uiArgDly>0; uiArgDly--) {
for (i=0; i<100; i++);
}
}
/*********************************************************************************************************
** Function name: __weekDayGet
** Descriptions: 根据年月日获得星期值的算法。
** Input parameters: uiArgYear 输入的年值0-9999
** ucArgMon 输入的月值1-12
** ucArgDay 输入的日期值1-31
** Output parameters: NONE
** Returned value: 星期值 0-6(0表示星期天)
*********************************************************************************************************/
static uint8 __weekDayGet( uint32 uiArgYear,
uint8 ucArgMon,
uint8 ucArgDay )
{
uint8 ucHYear;
uint8 ucLYear;
uint8 ucweek;
uint8 ucday;
ucHYear = (uint8)(uiArgYear/100);
ucLYear = (uint8)(uiArgYear%100);
ucHYear &= 0x03; /* 百年%4 */
ucHYear = (uint8)(ucHYear | (ucHYear << 2)); /* 百年%4*5 */
ucday = __ucWeekTab[ucArgMon - 1]; /* 月表 */
ucweek = (uint8)(ucday >> 5); /* 月星期数 */
ucday &= 0x1f; /* 月天数 */
/* 平年 */
if ((ucArgMon < 3) && !((ucHYear == 0) | (ucLYear & ((ucLYear & 0x03) == 0))))
{
if (ucArgMon == 2) {
ucday--; /* 平年月天数 */
}
ucweek++; /* 平年月表+1 */
}
ucLYear = (uint8)(ucLYear + (ucLYear >> 2)); /* 年+年/4 */
ucweek = (uint8)((ucweek + ucHYear + ucLYear + ucArgDay + 2) % 7); /* (星期=百年%4*5+年+年/4+月表*/
/* +日+2)%7 */
return ucweek; /* 返回星期 */
}
/*********************************************************************************************************
** Function name: __rtcInit
** Descriptions: RTC初始化函数,2200系列没有RTC外部振荡器,该函数是为了兼容其他有外部振荡器的
** 芯片
** Input parameters: uiArgID 器件编号,默认为0
** uiArgWakeup 0表示不启动RTC中断唤醒,1表示启动RTC中断唤醒
** uiArgOutclk 1表示使用外部电源和晶振,0表示使用内部
** Output parameters: NONE
** Returned value: 返回1表示RTC已经为设置为外部晶振,返回0说明RTC使用内部晶振
*********************************************************************************************************/
static int32 __rtcInit (uint32 uiArgID,
uint32 uiArgWakeup,
uint32 uiArgOutclk)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
uint32 uitemp;
uint32 uictc;
int32 iResult;
/*
* 参数过滤
*/
if (uiArgWakeup > 1) {
uiArgWakeup = 0;
}
if (uiArgOutclk > 1) {
uiArgOutclk = 0;
}
if (uiArgID >= __RTC_MAX_NUM) {
return OPERATE_FAIL;
}
GrtiDataTab[uiArgID]->puiAddrBase = (uint32*)GuiRtcBaseAddrTab[uiArgID];
/* 初始化设备结构体基地址 */
GrtiDataTab[uiArgID]->uiOffBase = 0; /* 初始化设备结构体偏移量 */
GrtiDataTab[uiArgID]->ucClkStat = (uint8)uiArgOutclk; /* 初始化设备结构体CLK连接状态 */
puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase;
uiOffBase = GrtiDataTab[uiArgID]->uiOffBase;
if (uiArgWakeup == __RTC_INT_WAKE) {
INTWAKE |= 1<<15; /* 支持RTC中断唤醒CPU功能 */
}
puiBaseAddr[__B_RTC_ILR << uiOffBase] = 0x03; /* 清除残留中断标志 */
iResult = __RTC_RUN; /* 预设RTC初始化运行了 */
uictc = puiBaseAddr[__B_RTC_CTC << uiOffBase]; /* 获取时钟节拍寄存器值 */
__rtcDlyS(5);
if (uictc == puiBaseAddr[__B_RTC_CTC << uiOffBase] || /* 如果时钟不在运行就初始化 */
(uiArgOutclk == __RTC_IN_CLK)) {
PCONP |= (1<<9); /* 在功率管理中打开RTC */
puiBaseAddr[__B_RTC_AMR << uiOffBase] = 0xFF; /* 屏蔽所有报警寄存器 */
puiBaseAddr[__B_RTC_CIIR << uiOffBase] = 0x00; /* 关闭所有增量中断 */
puiBaseAddr[__B_RTC_CCR << uiOffBase] = 0;
if ( uiArgOutclk != __RTC_IN_CLK ) {
puiBaseAddr[__B_RTC_CCR << uiOffBase] = (1 << 4); /* 选择外部时钟 */
} else { /* 内部时钟就需要设置分频器 */
uitemp = (uint32)((int)(Fpclk / 32768) - 1);
puiBaseAddr[__B_RTC_PREINT << uiOffBase] = uitemp; /* RTC整数分频 */
puiBaseAddr[__B_RTC_FRAC << uiOffBase] = (Fpclk - ( uitemp + 1)*32768);
} /* RTC小数分频 */
puiBaseAddr[__B_RTC_CCR << uiOffBase] |= 0x01; /* 启动时钟 */
iResult = __RTC_UNRUN;
}
if(uiArgOutclk != __RTC_IN_CLK) { /* 选择外部时钟,必须先启动时钟*/
/* 才能关闭时钟 */
PCONP &= ~(1<<9); /* 关闭RTC,以实现节电 */
}
return iResult;
}
/*********************************************************************************************************
** Function name: rtcInit
** Descriptions: RTC初始化函数,该函数为了兼容其他芯片的函数,暂时开放该接口,保留参数为以后添加
** Input parameters: uiArgID 器件编号,默认为0
** pucArgData 传入字符串参数指针,
** 传入的参数格式为关键字0=值0[空格]关键字1=值1[空格].....
** 关键字为:Wakeup 1表示支持CPU中断唤醒,0表示不支持
** Outclk 1表示使用外部振荡器和电源,0表示使用内部振荡器
** Output parameters: NONE
** Returned value: 返回1表示RTC已经为设置为外部晶振,返回0说明RTC使用内部晶振,OPERATE_FAIL表示
** 初始化失败,失败的原因为ID传入错误。
*********************************************************************************************************/
int32 rtcInit (uint32 uiArgID,
char *pucArgData,
uint32 uiRsv)
{
uint32 uiTemp[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; /* 初始化参数 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -