s3c2410 的RTC实验问题

znlg37   2008-6-26 15:01 楼主
这是代码:


/****************************************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

回复评论 (1)

为什么不能正常显示结果呢?
而且在观察时
    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;
这些东西的值很奇怪,谢谢大侠指导,小弟在此谢过
点赞  2008-6-26 15:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复