求助S3C2440的芯片,每次设置系统时间问题

InsaneCode 2013-04-27 09:54:21
大家好,

小弟遇到了一个搞不懂的问题。向大家请教。
芯片是 S3C2440,wince5.0,每次系统启动好自后,去设置系统时间(OEMSetRealTime),然后系统就会不停的调用OEMGetRealTime,而且速度非常快的调用,还不停下来,造成整个系统都缓慢了。
BOOL
OEMGetRealTime(LPSYSTEMTIME lpst)
{
volatile RTCreg *s2440RTC;

s2440RTC = (RTCreg *)RTC_BASE;
RETAILMSG(1,(TEXT("[KQ_TEST] +OEMGetRealTime \r\n")));

s2440RTC->rRTCCON =0x1;
lpst->wMilliseconds=0;
lpst->wSecond= FROM_BCD(s2440RTC->rBCDSEC&0x7f);
lpst->wMinute= FROM_BCD(s2440RTC->rBCDMIN&0x7f);
lpst->wHour= FROM_BCD(s2440RTC->rBCDHOUR&0x3f);
lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1);
lpst->wDay= FROM_BCD(s2440RTC->rBCDDAY&0x3f);
lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON&0x1f);
//lpst->wYear=(2000+s2440RTC->rBCDYEAR);
lpst->wYear=FROM_BCD(s2440RTC->rBCDYEAR)+2000;
if (lpst->wSecond==0)
{
lpst->wSecond=FROM_BCD(s2440RTC->rBCDSEC&0x7f);
lpst->wMinute=FROM_BCD(s2440RTC->rBCDMIN&0x7f);
lpst->wHour=FROM_BCD(s2440RTC->rBCDHOUR&0x3f);
lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1);
lpst->wDay=FROM_BCD(s2440RTC->rBCDDAY&0x3f);
lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON&0x1f);
lpst->wYear=(2000+s2440RTC->rBCDYEAR);
}
//禁止RTC
s2440RTC->rRTCCON=0;
return TRUE;
}

BOOL
OEMSetRealTime(LPSYSTEMTIME lpst)
{
volatile RTCreg *s2440RTC = (RTCreg *)RTC_BASE;
static int firsttime = 0;
// enable RTC control
RETAILMSG(1,(TEXT("[KQ_TEST] +OEMSetRealTime \r\n")));
s2440RTC->rRTCCON = 0x1;

s2440RTC->rBCDSEC = (unsigned char)TO_BCD(lpst->wSecond );
s2440RTC->rBCDMIN = (unsigned char)TO_BCD(lpst->wMinute );
s2440RTC->rBCDHOUR = (unsigned char)TO_BCD(lpst->wHour );

s2440RTC->rBCDDATE = (unsigned char)(lpst->wDayOfWeek + 1);

s2440RTC->rBCDDAY = (unsigned char)TO_BCD(lpst->wDay );
s2440RTC->rBCDMON = (unsigned char)TO_BCD(lpst->wMonth );
s2440RTC->rBCDYEAR = (unsigned char)TO_BCD((lpst->wYear -2000));

// disable RTC control
s2440RTC->rRTCCON = 0; //&= ~0x1;

return TRUE;
}

大家帮忙看看吧,谢谢了
...全文
278 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010192845 2013-05-10
  • 打赏
  • 举报
回复
感觉像你驱动有问题啊~
cclutpk 2013-05-03
  • 打赏
  • 举报
回复
RTC在常开区,否则关机时间就丢了。只要常开区有电理论上说是不需要其他模块就可以独立工作的
cclutpk 2013-05-02
  • 打赏
  • 举报
回复
引用 10 楼 kacyquan 的回复:
问题依然没有解决,写进去的,马上去读出来,结果还是不对,或者根本没有写进去。如果外部晶振没有起作用,是不是就是这个现象?怀疑硬件。
RTC的晶振没起来的话一般系统是起不来的
cclutpk 2013-05-02
  • 打赏
  • 举报
回复
引用 9 楼 kacyquan 的回复:
[quote=引用 8 楼 cclutpk 的回复:] 楼主是SEU的?4系还是6系的?
6系的啊。你怎么看出来了?[/quote] 头像出卖了你
InsaneCode 2013-05-02
  • 打赏
  • 举报
回复
问题还在继续。想请问一个问题,在rtc不需要设置其他寄存器的情况下,只要外部的晶振已经有了,就可以去设置rtc年月日的寄存器了?还是需要初始化一些其他的寄存器,使rtc工作起来呢?谢谢了
InsaneCode 2013-04-28
  • 打赏
  • 举报
回复
引用 2 楼 woshi_ziyu 的回复:
时间跑飞了 看看电池部分
这个板子没有电池的。时间跑飞一般是什么原因呢?谢谢
InsaneCode 2013-04-28
  • 打赏
  • 举报
回复
引用 1 楼 accessysq 的回复:
if (lpst->wSecond==0) { lpst->wSecond=FROM_BCD(s2440RTC->rBCDSEC&0x7f); lpst->wMinute=FROM_BCD(s2440RTC->rBCDMIN&0x7f); lpst->wHour=FROM_BCD(s2440RTC->rBCDHOUR&0x3f); lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1); lpst->wDay=FROM_BCD(s2440RTC->rBCDDAY&0x3f); lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON&0x1f); lpst->wYear=(2000+s2440RTC->rBCDYEAR); } lpst->wYear=(2000+s2440RTC->rBCDYEAR);//这里代码有错误 lpst->wYear = 2000 + FROM_BCD(s2440RTC->rBCDYEAR); 另外最好判断一下时间,避免时间跑飞了,wince最多只能表示100年,时间跑飞会导致系统变慢。
有错误的代码注释掉了已经,请问一下,最多表示100年的意思是什么呢?wince最多表示到多少年?
  • 打赏
  • 举报
回复
lpst->wYear=FROM_BCD(2000+s2440RTC->rBCDYEAR);错误了,2000是在外面。 wince没有电池跑飞很正常。所以最好是定义一个全局变量,判断是否是开机第一次运行,这个时候判断一下当前时间, 比如时间不是在2000年-2099年就把时间强制在固定某一年,如2013.
InsaneCode 2013-04-28
  • 打赏
  • 举报
回复
问题依然没有解决,写进去的,马上去读出来,结果还是不对,或者根本没有写进去。如果外部晶振没有起作用,是不是就是这个现象?怀疑硬件。
InsaneCode 2013-04-28
  • 打赏
  • 举报
回复
引用 8 楼 cclutpk 的回复:
楼主是SEU的?4系还是6系的?
6系的啊。你怎么看出来了?
cclutpk 2013-04-28
  • 打赏
  • 举报
回复
楼主是SEU的?4系还是6系的?
InsaneCode 2013-04-28
  • 打赏
  • 举报
回复
发现一个问题, // NOTE: The RTC on the SMDK2440 isn't battery-backed so RTC settings will be lost // when power is removed. // BOOL OEMSetRealTime(LPSYSTEMTIME lpst) { volatile RTCreg *s2440RTC = (RTCreg *)RTC_BASE; static int firsttime = 0; // enable RTC control RETAILMSG(1,(TEXT("[KQ_TEST] *Time Print Y:%d M:%d D:%d H:%d M:%d S:%d \r\n"),lpst->wYear,lpst->wMonth,lpst->wDay,lpst->wHour,lpst->wMinute,lpst->wSecond)); s2440RTC->rRTCCON = 0x1; s2440RTC->rBCDSEC = (unsigned char)TO_BCD(lpst->wSecond ); s2440RTC->rBCDMIN = (unsigned char)TO_BCD(lpst->wMinute ); s2440RTC->rBCDHOUR = (unsigned char)TO_BCD(lpst->wHour ); s2440RTC->rBCDDATE = (unsigned char)(lpst->wDayOfWeek + 1); s2440RTC->rBCDDAY = (unsigned char)TO_BCD(lpst->wDay ); s2440RTC->rBCDMON = (unsigned char)TO_BCD(lpst->wMonth ); s2440RTC->rBCDYEAR = (unsigned char)TO_BCD((lpst->wYear -2000)); //read them out lpst->wMilliseconds=0; lpst->wSecond= FROM_BCD(s2440RTC->rBCDSEC&0x7f); lpst->wMinute= FROM_BCD(s2440RTC->rBCDMIN&0x7f); lpst->wHour= FROM_BCD(s2440RTC->rBCDHOUR&0x3f); lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1); lpst->wDay= FROM_BCD(s2440RTC->rBCDDAY&0x3f); lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON&0x1f); //lpst->wYear=(2000+s2440RTC->rBCDYEAR); lpst->wYear=FROM_BCD(s2440RTC->rBCDYEAR)+2000; if (lpst->wSecond==0) { lpst->wSecond=FROM_BCD(s2440RTC->rBCDSEC&0x7f); lpst->wMinute=FROM_BCD(s2440RTC->rBCDMIN&0x7f); lpst->wHour=FROM_BCD(s2440RTC->rBCDHOUR&0x3f); lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1); lpst->wDay=FROM_BCD(s2440RTC->rBCDDAY&0x3f); lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON&0x1f); lpst->wYear=FROM_BCD(2000+s2440RTC->rBCDYEAR); } //read them out end RETAILMSG(1,(TEXT("[KQ_TEST] ***************************************** \r\n"))); RETAILMSG(1,(TEXT("[KQ_TEST] **Time Print Y:%d M:%d D:%d H:%d M:%d S:%d \r\n"),lpst->wYear,lpst->wMonth,lpst->wDay,lpst->wHour,lpst->wMinute,lpst->wSecond)); // disable RTC control s2440RTC->rRTCCON = 0; //&= ~0x1; return TRUE; } 读出来的竟然和想要写进去的完全不同。真是悲剧。。。为什么会这样呢?哪位大侠出出办法。
InsaneCode 2013-04-28
  • 打赏
  • 举报
回复
引用 6 楼 accessysq 的回复:
lpst->wYear=FROM_BCD(2000+s2440RTC->rBCDYEAR);错误了,2000是在外面。 wince没有电池跑飞很正常。所以最好是定义一个全局变量,判断是否是开机第一次运行,这个时候判断一下当前时间, 比如时间不是在2000年-2099年就把时间强制在固定某一年,如2013.
哦,确实是写错了哦。谢谢你!
woshi_ziyu 2013-04-27
  • 打赏
  • 举报
回复
时间跑飞了 看看电池部分
  • 打赏
  • 举报
回复
if (lpst->wSecond==0) { lpst->wSecond=FROM_BCD(s2440RTC->rBCDSEC&0x7f); lpst->wMinute=FROM_BCD(s2440RTC->rBCDMIN&0x7f); lpst->wHour=FROM_BCD(s2440RTC->rBCDHOUR&0x3f); lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1); lpst->wDay=FROM_BCD(s2440RTC->rBCDDAY&0x3f); lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON&0x1f); lpst->wYear=(2000+s2440RTC->rBCDYEAR); } lpst->wYear=(2000+s2440RTC->rBCDYEAR);//这里代码有错误 lpst->wYear = 2000 + FROM_BCD(s2440RTC->rBCDYEAR); 另外最好判断一下时间,避免时间跑飞了,wince最多只能表示100年,时间跑飞会导致系统变慢。

19,518

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧