📄 rtc.c
字号:
uiRsv = uiRsv; /* 防止编译报警 */
ImpCmd(Tab_RTC, pucArgData, uiTemp); /* 把字符串转化为参数 */
#if __RTC_EN_OUT_CLK == 0 /* 根据是否具有外部CLK进行编译 */
uiTemp[Wakeup] = __RTC_UNINT_WAKE; /* 不具有外部CLK,参数采用默认值*/
uiTemp[Outclk] = __RTC_IN_CLK;
#endif
return __rtcInit(uiArgID, uiTemp[Wakeup], uiTemp[Outclk]);
}
/*********************************************************************************************************
** Function name: rtcSetMode
** Descriptions: RTC设置模式参数,能够设置增量中断,报警中断,和清除中断
** Input parameters: uiArgID 器件编号,默认为0
** uiArgMode 要设置参数的类型,类型种类如下
** RTC_MODE_SEC_INT 秒增量中断
** RTC_MODE_MIN_INT 分钟增量中断
** RTC_MODE_HOU_INT 小时增量中断
** RTC_MODE_DOM_INT 月里面天数增量中断
** RTC_MODE_DOW_INT 星期值增量中断
** RTC_MODE_DOY_INT 在年里面日期增量中断
** RTC_MODE_MON_INT 月值增量中断
** RTC_MODE_YEA_INT 年值增量中断
** RTC_MODE_NULL 清除中断触发
** RTC_MODE_ALARM 报警中断
** pucArgData 当上面的uiArgMode为RTC_MODE_ALARM时,传入字符串参数指针,
** 用来设置报警值,否则可传入空指针。
** 传入的参数格式为关键字0=值0[空格]关键字1=值1[空格].....
** 关键字:Year 范围0-4095
** Month 月,范围1-12
** Day 日期(月),1-31
** Hour 小时,0-23
** Min 分钟,0-59
** Sec 秒 ,0-59
** Output parameters: NONE
** Returned value: 设置成功:OPERATE_SUCCESS,
** 设置失败:OPERATE_FAIL
** 失败的原因为ID传入错误。模式传入错误
*********************************************************************************************************/
int32 rtcModeSet (uint32 uiArgID,
uint32 uiArgMode,
char *pcArgData)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
uint32 uiTemp[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
int32 iResult;
__PRTC_PARM prtpaTime;
if (uiArgID >= __RTC_MAX_NUM) {
return OPERATE_FAIL;
}
puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase; /* 获取RTC寄存器基地址 */
uiOffBase = GrtiDataTab[uiArgID]->uiOffBase;
iResult = OPERATE_SUCCESS; /* 预设操作结果成功 */
PCONP |= (1<<9); /* 打开RTC功率控制寄存器 */
puiBaseAddr[__B_RTC_ILR << uiOffBase] = 0x03; /* 清除中断 */
switch (uiArgMode) {
case RTC_MODE_SEC_INT:
case RTC_MODE_MIN_INT:
case RTC_MODE_HOU_INT:
case RTC_MODE_DOM_INT:
case RTC_MODE_DOW_INT:
case RTC_MODE_DOY_INT:
case RTC_MODE_MON_INT:
case RTC_MODE_YEA_INT: /* 增量中断,同一种处理方式 */
puiBaseAddr[__B_RTC_CIIR << uiOffBase] = uiArgMode; /* 设置增量中断 */
break;
case RTC_MODE_NULL: /* 清除所有中断触发 */
puiBaseAddr[__B_RTC_CIIR << uiOffBase] = 0;
puiBaseAddr[__B_RTC_AMR << uiOffBase] = 0xFF;
break;
case RTC_MODE_ALARM:
if (pcArgData) { /* 指针有效 */
ImpCmd( Tab_RTC, pcArgData, uiTemp); /* 把字符串转化为参数 */
}
prtpaTime = (__PRTC_PARM)uiTemp; /* 对参数进行指针强转 */
/*
* 参数过滤,这些参数过滤允许用户修改单个时间报警值
*/
if (prtpaTime->uiYear > 4095 || prtpaTime->uiYear == 0) {
prtpaTime->uiYear = puiBaseAddr[__B_RTC_ALYEA << uiOffBase];
}
if (prtpaTime->uiMonth > 12 || prtpaTime->uiMonth == 0) {
prtpaTime->uiMonth = puiBaseAddr[__B_RTC_ALMON << uiOffBase];
}
if (prtpaTime->uiDOM > 31 || prtpaTime->uiDOM == 0) {
prtpaTime->uiDOM = puiBaseAddr[__B_RTC_ALDOM << uiOffBase];
}
if (prtpaTime->uiHour > 23) {
prtpaTime->uiHour = puiBaseAddr[__B_RTC_ALHOU << uiOffBase];
}
if (prtpaTime->uiMinute > 59) {
prtpaTime->uiMinute = puiBaseAddr[__B_RTC_ALMIN << uiOffBase];
}
if (prtpaTime->uiSecond > 59) {
prtpaTime->uiSecond = puiBaseAddr[__B_RTC_ALSEC << uiOffBase];
}
/*
* 设置报警值
*/
puiBaseAddr[__B_RTC_ALYEA << uiOffBase] = prtpaTime->uiYear;
puiBaseAddr[__B_RTC_ALMON << uiOffBase] = prtpaTime->uiMonth;
puiBaseAddr[__B_RTC_ALDOM << uiOffBase] = prtpaTime->uiDOM;
puiBaseAddr[__B_RTC_ALHOU << uiOffBase] = prtpaTime->uiHour;
puiBaseAddr[__B_RTC_ALMIN << uiOffBase] = prtpaTime->uiMinute;
puiBaseAddr[__B_RTC_ALSEC << uiOffBase] = prtpaTime->uiSecond;
puiBaseAddr[__B_RTC_AMR << uiOffBase] = 0x30; /* 打开报警中断,星期与 */
/* 日期(年)没有匹配报警 */
break;
default:
iResult = OPERATE_FAIL;
break;
}
if ( GrtiDataTab[uiArgID]->ucClkStat == __RTC_OUT_CLK ) /* 如果外部时钟,进入节电模式 */
{
PCONP &= ~(1<<9);
}
return iResult;
}
/*********************************************************************************************************
** Function name: __rtcAlarmGet
** Descriptions: RTC获取报警值
** Input parameters: uiArgID 器件编号,默认为0
** RtcTime 获取时间值的结构体指针
** Output parameters: NONE
** Returned value: 获取成功:OPERATE_SUCCESS,
** 获取失败:OPERATE_FAIL
** 失败的原因为ID传入错误;查询报警值,但没有设置报警值
*********************************************************************************************************/
static int32 __rtcAlarmGet( uint32 uiArgID, __PRTC_PARM RtcTime)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
if (uiArgID >= __RTC_MAX_NUM) {
return OPERATE_FAIL;
}
puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase; /* 获取RTC寄存器基地址 */
uiOffBase = GrtiDataTab[uiArgID]->uiOffBase;
if ((puiBaseAddr[__B_RTC_AMR << uiOffBase] & 0xff) == 0xff) {
return OPERATE_FAIL; /* 没有设置报警中断,返回错误 */
}
RtcTime->uiYear = puiBaseAddr[__B_RTC_ALYEA << uiOffBase] & 0xFFF;
RtcTime->uiMonth = puiBaseAddr[__B_RTC_ALMON << uiOffBase] & 0x0F;
RtcTime->uiDOM = puiBaseAddr[__B_RTC_ALDOM << uiOffBase] & 0x1f;
RtcTime->uiHour = puiBaseAddr[__B_RTC_ALHOU << uiOffBase] & 0x1f;
RtcTime->uiMinute = puiBaseAddr[__B_RTC_ALMIN << uiOffBase] & 0x3f;
RtcTime->uiSecond = puiBaseAddr[__B_RTC_ALSEC << uiOffBase] & 0x3f;
RtcTime->uiDOW = 0; /* 没有设置的报警内容填充0 */
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: rtcGetMode
** Descriptions: RTC获取模式参数,能够获取中断状态以及当前的报警中断报警值
** Input parameters: uiArgID 器件编号,默认为0
** uiArgMode 要获取参数的类型,类型种类如下,暂时开放报警中断
** RTC_MODE_ALARM 报警中断
** Output parameters: pcArgBuf 当上面的uiArgMode为RTC_MODE_ALARM时,输出RTC报警时间值,
** 输出格式为:"2007-07-01 12:36:25"
** Returned value: 获取成功:OPERATE_SUCCESS,
** 获取失败:OPERATE_FAIL
** 失败的原因为ID传入错误;输出缓冲区为NULL;查询报警值,但没有设置报警值
*********************************************************************************************************/
int32 rtcModeGet (uint32 uiArgID,
uint32 uiArgMode,
char *pcArgBuf)
{
__RTC_PARM AlarmTime;
uint32 i;
if (!pcArgBuf) { /* 传入空指针返回错误 */
return OPERATE_FAIL;
}
if (uiArgMode != RTC_MODE_ALARM) {
return OPERATE_FAIL; /* 不是报警中断就返回错误 */
}
if (__rtcAlarmGet(uiArgID, &AlarmTime) == OPERATE_FAIL) { /* 获取报警值失败 */
return OPERATE_FAIL;
}
/* 格式化输出时间 */
sprintf( pcArgBuf, "%4d-%2d-%2d %2d:%2d:%2d", AlarmTime.uiYear, AlarmTime.uiMonth, \
AlarmTime.uiDOM, AlarmTime.uiHour, AlarmTime.uiMinute, AlarmTime.uiSecond );
for ( i = 0; i < 18; i++)
{
if( pcArgBuf[i] == ' ' )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -