📄 rtc.c
字号:
if ( i != 10 )
{
pcArgBuf[i] = '0';
}
}
}
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: __rtcTimeSet
** Descriptions: RTC设置时间函数,星期自动计算,
** Input parameters: uiArgID 器件编号,默认为0
** pArgTime 传入设置时间参数的结构体指针
** Output parameters: NONE
** Returned value: 获取成功:OPERATE_SUCCESS,
** 获取失败:OPERATE_FAIL
** 失败的原因为ID传入错误
*********************************************************************************************************/
static int32 __rtcTimeSet (uint32 uiArgID, __PRTC_PARM pArgTime)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
if (uiArgID >= __RTC_MAX_NUM) {
return OPERATE_FAIL;
}
puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase; /* 获取RTC寄存器基地址 */
uiOffBase = GrtiDataTab[uiArgID]->uiOffBase;
puiBaseAddr[__B_RTC_CCR << uiOffBase] &= (~0x01); /* 停止RTC */
/*
* 进行参数过滤
*/
if (pArgTime->uiYear > 4095 || pArgTime->uiYear == 0) {
pArgTime->uiYear = puiBaseAddr[__B_RTC_YEAR << uiOffBase];
}
if (pArgTime->uiMonth > 12 || pArgTime->uiMonth == 0) {
pArgTime->uiMonth = puiBaseAddr[__B_RTC_MON << uiOffBase];
}
if (pArgTime->uiDOM > 31 || pArgTime->uiDOM == 0) {
pArgTime->uiDOM = puiBaseAddr[__B_RTC_DOM << uiOffBase];
}
if (pArgTime->uiHour > 23) {
pArgTime->uiHour = puiBaseAddr[__B_RTC_HOUR << uiOffBase];
}
if (pArgTime->uiMinute > 59){
pArgTime->uiMinute = puiBaseAddr[__B_RTC_MIN << uiOffBase];
}
if (pArgTime->uiSecond > 59) {
pArgTime->uiSecond = puiBaseAddr[__B_RTC_SEC << uiOffBase];
}
/*
* 如果系统结果也错误了就调用备用参数
*/
if (pArgTime->uiYear > 4095 || pArgTime->uiYear == 0) {
pArgTime->uiYear = 2000;
}
if (pArgTime->uiMonth > 12 || pArgTime->uiMonth == 0) {
pArgTime->uiMonth = 5;
}
if (pArgTime->uiDOM > 31 || pArgTime->uiDOM == 0) {
pArgTime->uiDOM = 5;
}
if (pArgTime->uiHour > 23) {
pArgTime->uiHour = 5;
}
if (pArgTime->uiMinute > 59) {
pArgTime->uiMinute = 5;
}
if (pArgTime->uiSecond > 59) {
pArgTime->uiSecond = 5;
}
/*
* 参数设置
*/
puiBaseAddr[__B_RTC_YEAR << uiOffBase] = pArgTime->uiYear;
puiBaseAddr[__B_RTC_MON << uiOffBase] = pArgTime->uiMonth&0x0f;
puiBaseAddr[__B_RTC_DOW << uiOffBase] = __weekDayGet(pArgTime->uiYear,
(uint8)pArgTime->uiMonth,
(uint8)pArgTime->uiDOM );
/* 获取星期值 */
puiBaseAddr[__B_RTC_DOM << uiOffBase] = pArgTime->uiDOM;
puiBaseAddr[__B_RTC_HOUR << uiOffBase] = pArgTime->uiHour;
puiBaseAddr[__B_RTC_MIN << uiOffBase] = pArgTime->uiMinute;
puiBaseAddr[__B_RTC_SEC << uiOffBase] = pArgTime->uiSecond;
puiBaseAddr[__B_RTC_CCR << uiOffBase] |= 0x01; /* 打开RTC */
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: rtcTimeSet
** Descriptions: RTC设置时间函数,星期自动计算,字符串传入参数
** Input parameters: uiArgID 器件编号,默认为0
** pcArgData 该参数是输入字符串格式参数的指针
** 例如设置时间为2007年6月23日,13时45分21秒,输入参数如下
** "Year=2007 Month=6 Day=23 Hour=13 Min=45 Sec=21"
** Rsv 保留参数
** Output parameters: NONE
** Returned value: 获取成功:OPERATE_SUCCESS,
** 获取失败:OPERATE_FAIL
** 失败的原因为ID传入错误,或参数传入空指针
*********************************************************************************************************/
int32 rtcTimeSet (uint32 uiArgID,
char *pcArgData,
void *Rsv)
{
uint32 uiTemp[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; /* 初始化参数 */
Rsv = Rsv; /* 防止编译报警 */
if (!pcArgData) { /* 传入空指针 */
return OPERATE_FAIL;
}
ImpCmd( Tab_RTC, pcArgData, uiTemp); /* 把字符串转化为参数 */
return __rtcTimeSet(uiArgID, (__PRTC_PARM)uiTemp); /* 设置参数 */
}
/*********************************************************************************************************
** Function name: __rtcTimeGet
** Descriptions: RTC获取时间函数,获取到的值放到结构体中
** Input parameters: uiArgID 器件编号,默认为0
** Time 获取时间参数结构体指针
** Output parameters: NONE
** Returned value: 获取成功:OPERATE_SUCCESS,
** 获取失败:OPERATE_FAIL
** 失败的原因为ID传入错误,或参数传入空指针
*********************************************************************************************************/
static int32 __rtcTimeGet(uint32 uiArgID, __PRTC_PARM Time)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
if (uiArgID >= __RTC_MAX_NUM) {
return OPERATE_FAIL;
}
puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase; /* 获取RTC寄存器基地址 */
uiOffBase = GrtiDataTab[uiArgID]->uiOffBase;
Time->uiYear = puiBaseAddr[__B_RTC_YEAR << uiOffBase] & 0xFFF;
Time->uiMonth = puiBaseAddr[__B_RTC_MON << uiOffBase] & 0x0F;
Time->uiDOW = puiBaseAddr[__B_RTC_DOW << uiOffBase] & 0x07;
Time->uiDOM = puiBaseAddr[__B_RTC_DOM << uiOffBase] & 0x1f;
Time->uiHour = puiBaseAddr[__B_RTC_HOUR << uiOffBase] & 0x1f;
Time->uiMinute = puiBaseAddr[__B_RTC_MIN << uiOffBase] & 0x3f;
Time->uiSecond = puiBaseAddr[__B_RTC_SEC << uiOffBase] & 0x3f;
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: rtcTimeGet
** Descriptions: RTC获取时间函数
** Input parameters: uiArgID 器件编号,默认为0
** Rsv 保留参数
** Output parameters: pcArgData 该参数是输出字符串格式参数的指针
** 例如输出时间"2007-6-23 3 12:35:40\r\n"
** Returned value: 获取成功:OPERATE_SUCCESS,
** 获取失败:OPERATE_FAIL
** 失败的原因为ID传入错误,或参数传入空指针
*********************************************************************************************************/
int32 rtcTimeGet(uint32 uiArgID,
char *pcArgBuf,
void *Rsv )
{
__RTC_PARM Time;
uint8 i;
if (!pcArgBuf) {
return OPERATE_FAIL; /* 传出参数缓冲区空指针 */
}
if (__rtcTimeGet(uiArgID, &Time) == OPERATE_FAIL) { /* 获取时间值错误 */
return OPERATE_FAIL;
}
sprintf( pcArgBuf, "%4d-%2d-%2d %1d %2d:%2d:%2d\r\n", Time.uiYear, Time.uiMonth, \
Time.uiDOM, Time.uiDOW, Time.uiHour, Time.uiMinute, Time.uiSecond );
for ( i = 0; i < 21; i++) /* 对填充的空格进行补0操作 */
{
if( pcArgBuf[i] == ' ' )
{
if ( i != 10 && i != 12 )
{
pcArgBuf[i] = '0';
}
}
}
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: rtcISR
** Descriptions: RTC中断服务程序,用户代码可以在IRQHook.c里添加。
** Input parameters: NONE
** Output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
void rtcIsr(void)
{
rtcHook();
ILR = 0x03; /* 该位置暂时使用寄存器操作 */
VICVectAddr = 0;
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -