s3c2410 的RTC实验问题

yumufenglin 2008-06-26 03:01:20
这是代码:


/****************************************Copyright (c)**************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: main.c
** Last modified Date: 2006-01-11
** Last Version: v1.0
** Description: MagicARM2410实验箱的基础实验---RTC实验。
** 初始化S3C2410A内部的RTC,然后每隔1秒钟读取一次RTC的时间,并通过串口发送到PC机显示。
**------------------------------------------------------------------------------------------------------
** Created By: 黄绍斌
** Created date: 2006-01-10
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#include "config.h"


// 定义显示缓冲区
char disp_buf[50];


// 定义当前时间变量
uint8 g_year = 0;
uint8 g_month = 0;
uint8 g_date = 0;
uint8 g_day = 0;
uint8 g_hour = 0;
uint8 g_min = 0;
uint8 g_sec = 0;


// 定义星期字符串
char *str_day[8] = {" ","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};



/*********************************************************************************************************
** Function name: DelayNS
** Descriptions: 长软件延时。
** 延时时间与系统时钟有关。
** Input: dly 延时参数,值越大,延时越久
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i;

for(; dly>0; dly--)
for(i=0; i<50000; i++);
}


// 定义初始化时钟值
#define INIT_YEAR 0x06 /* 2006年 */
#define INIT_MONTH 0x01 /* 1月 */
#define INIT_DATE 0x10 /* 10日 */
#define INIT_DAY 0x02 /* 星期二 */
#define INIT_HOUR 0x20 /* 20时 */
#define INIT_MIN 0x30 /* 30分 */
#define INIT_SEC 0x00 /* 0秒 */

/*********************************************************************************************************
** Function name: RTC_Init
** Descriptions: RTC初始化。使用的初始化值为INIT_XXX(宏)来初始化。
** 若force为0,则先检查当前时钟是否正确(通过年月日、时分秒来判断),若正确则不再初始化。
** Input: force 是否强行初始化(非0值时表示强行)
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-01-11
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void RTC_Init(int force)
{
int err;
uint32 bak;

// 判断当前RTC是否正确运行
err = 0;
if(force == 0) // 若force为0,则判断当前时钟是否正确
{
rRTCCON = 0x00; // 禁止RTC接口(只允许RTC计数和读数)
bak = rBCDYEAR & 0xFF;
if(bak>0x99) err++; // 年判断
bak = rBCDMON & 0x1F;
if(bak>0x12) err++; // 月判断
bak = rBCDDATE & 0x3F;
if(bak>0x31) err++; // 日判断
bak = rBCDHOUR & 0x3F;
if(bak>0x24) err++; // 时判断
bak = rBCDMIN & 0x7F;
if(bak>0x59) err++; // 分判断
bak = rBCDSEC & 0x7F;
if(bak>0x59) err++; // 秒判断

if(err==0) return; // 若时钟正确,则直接返回
}

rRTCCON = 0x01; // 标准模式,RTC接口使能(允许写)

rBCDYEAR = INIT_YEAR & 0xFF;
rBCDMON = INIT_MONTH & 0x1F;
rBCDDATE = INIT_DATE & 0x3F;
rBCDDAY = INIT_DAY & 0x07; // 星期,MON:1 TUE:2 WED:3 THU:4 FRI:5 SAT:6 SUN:7
rBCDHOUR = INIT_HOUR & 0x3F;
rBCDMIN = INIT_MIN & 0x7F;
rBCDSEC = INIT_SEC & 0x7F;

rRTCCON = 0x00; // 禁止RTC接口(只允许RTC计数和读数)
}



/*********************************************************************************************************
** Function name: RTC_Read
** Descriptions: 读时间函数。可以指定时否读日期(年月日和星期)
** Input: date 是否读日期(非0值时表示读)
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-01-11
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void RTC_Read(uint32 date)
{
if(date)
{
g_year = rBCDYEAR;
g_month = rBCDMON;
g_date = rBCDDATE;
g_day = rBCDDAY;
}

g_hour = rBCDHOUR;
g_min = rBCDMIN;
g_sec = rBCDSEC;
}



/*********************************************************************************************************
** Function name: DispRTC
** Descriptions: 显示时间(从串口发送显示数据),即显示g_year、g_month、g_date等变量的值。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-01-11
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DispRTC(void)
{
sprintf(disp_buf, "%02x:%02x:%02x %10s, %2x/%2x/20%02x \n",
g_hour,g_min, g_sec, str_day[g_day], g_month, g_date, g_year);
UART_SendStr(disp_buf);
}



/*********************************************************************************************************
** Function name: main
** Descriptions: 初始化RTC,然后不断地读取时间值,并输出串口。
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main(void)
{
int temp;

UART_Select(0); // 选择UART0
UART_Init(); // 初始化UART0

RTC_Init(0); // 初始化RTC(非强行方式)
RTC_Read(1); // 读日期

temp = 0;
while(1)
{
while(temp == rBCDSEC);
temp = rBCDSEC;

RTC_Read(0); // 读时间
DispRTC(); // 输出时间显示
}

return(0);
}

/*********************************************************************************************************
** End Of File
********************************************************************************************************/


结果是这样的:3f:7f:60 Sunday, 1d/3f/20bf
...全文
107 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
一段波 2011-10-20
  • 打赏
  • 举报
回复
帮顶,我也遇到这个问题了,发现是在rRTCCON = 0x01的情况下 BCD寄存器不能写入值得问题
yumufenglin 2008-06-26
  • 打赏
  • 举报
回复
为什么不能正常显示结果呢?
而且在观察时
rBCDYEAR = INIT_YEAR & 0xFF;
rBCDMON = INIT_MONTH & 0x1F;
rBCDDATE = INIT_DATE & 0x3F;
rBCDDAY = INIT_DAY & 0x07; // 星期,MON:1 TUE:2 WED:3 THU:4 FRI:5 SAT:6 SUN:7
rBCDHOUR = INIT_HOUR & 0x3F;
rBCDMIN = INIT_MIN & 0x7F;
rBCDSEC = INIT_SEC & 0x7F;
这些东西的值很奇怪,谢谢大侠指导,小弟在此谢过

19,502

社区成员

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

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