hal_rtc.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 206 行

C
206
字号

/**************************************************************************/
/*                                                                        */
/*     Copyright (C) 2006 Oki Electric Industry Co., LTD.                 */
/*                                                                        */
/*     System Name  :  ML675050 series                                    */
/*     Module Name  :  ML675050 rtc HAL program                           */
/*     File   Name  :  hal_rtc.c                                          */
/*     Revision     :  01.00                                              */
/*     Date         :  2006/1/5 initial version                           */
/*                                                                        */
/**************************************************************************/
#include "common.h"
#if defined(__arm)
#include "ml675050.h"
#else
#include "ml675050sim.h"
#endif
#include "hal_common.h"
#include "hal_rtc.h"


/************************************************************************/
/*                                                                      */
/*  Function Name   : HalRtc_RtcInit                                    */
/*  Input           : ML675050_RtcInitParam *initParam                  */
/*  Output          : int16_t HAL_OK(1)                                 */
/*                            HAL_PARAM_ERROR(-2)                       */
/*                                                                      */
/*  Note : Initialize rtc.                                              */
/*                                                                      */
/************************************************************************/
int16_t HalRtc_RtcInit( ML675050_RtcInitParam *initParam )
{
    int16_t rtnVal = HAL_OK;

     /* H/W control */
     OkiCLib_set8bit(CF, (uint8_t)(initParam->info_24_12 ));
     
     OkiCLib_clr8bit(CF, CF_TEST );
     OkiCLib_set8bit(CF, CF_REST );
     OkiCLib_set8bit(CF, CF_STOP );
     
     OkiCLib_clr8bit(CF, CF_REST );
     OkiCLib_set8bit(CF, (uint8_t)(initParam->info_24_12 ));
     
     /*time clear*/
     OkiCLib_write8(S1, 0 );
     OkiCLib_write8(S10, 0 );
     OkiCLib_write8(M1, 0 );
     OkiCLib_write8(M10, 0 );
     OkiCLib_write8(H1, 0 );
     OkiCLib_write8(H10, 0 );
     OkiCLib_write8(D1, 0 );
     OkiCLib_write8(D10, 0 );
     OkiCLib_write8(MO1, 0 );
     OkiCLib_write8(MO10, 0 );
     OkiCLib_write8(Y1, 0 );
     OkiCLib_write8(Y10, 0 );
     OkiCLib_write8(W, 0 );
     
     OkiCLib_clr8bit(CD, CD_HOLD );
     OkiCLib_clr8bit(CF, CF_STOP );

    return rtnVal;
}


/************************************************************************/
/*                                                                      */
/*  Function Name   : HalRtc_RtcWriteDate                               */
/*  Input           : const  ML675050_RtcTime *pRtcTime                 */
/*  Output          : int16_t HAL_OK(1)                                 */
/*                            HAL_PARAM_ERROR(-2)                       */
/*                                                                      */
/*  Note : rtc write data.                                              */
/*                                                                      */
/************************************************************************/

int16_t HalRtc_RtcWriteDate( const  ML675050_RtcTime *pRtcTime )
{
    int16_t rtnVal = HAL_OK;
    uint8_t busybit;
    int16_t i;
    
    OkiCLib_set8bit(CD, CD_HOLD );    
    /*BUSY =0?*/
    busybit= OkiCLib_read8(CD);
    busybit= busybit & CD_BUSY;
  
    if(busybit==CD_BUSY){
        OkiCLib_clr8bit(CD, CD_HOLD);
        for(i=0;i<100;i++){
            ;
        }
    }
    
    OkiCLib_set8bit(CD, CD_HOLD );
         /*BUSY =0?*/
    busybit= OkiCLib_read8(CD);
    busybit= busybit & CD_BUSY;
    if(busybit!=CD_BUSY){
        /* setting RTC data */
         OkiCLib_write8(Y1,  (uint8_t)(pRtcTime->year & 0x000F));
         OkiCLib_write8(Y10, (uint8_t)((pRtcTime->year >> 4) & 0x000F));
         OkiCLib_write8(MO1, (uint8_t)(pRtcTime->month & 0x000F));
         OkiCLib_write8(MO10,(uint8_t)((pRtcTime->month >> 4) & 0x000F));
         OkiCLib_write8(D1,  (uint8_t)(pRtcTime->day & 0x000F));
         OkiCLib_write8(D10, (uint8_t)((pRtcTime->day >> 4) & 0x000F));
         OkiCLib_write8(H1,  (uint8_t)(pRtcTime->hour & 0x000F));
         OkiCLib_write8(H10, (uint8_t)((pRtcTime->hour >> 4) & 0x000F));
         OkiCLib_write8(M1,  (uint8_t)(pRtcTime->minute & 0x000F));
         OkiCLib_write8(M10, (uint8_t)((pRtcTime->minute >> 4) & 0x000F));
         OkiCLib_write8(S1,  (uint8_t)(pRtcTime->second & 0x000F)) ;
         OkiCLib_write8(S10, (uint8_t)((pRtcTime->second >> 4) & 0x000F));
         OkiCLib_write8(W,   pRtcTime->week );
         
         if(pRtcTime->info_24_12==0){   /* 12 hour */
             OkiCLib_clr8bit(CF, CF_24_12);
             OkiCLib_set8bit(CF, CF_REST);
             OkiCLib_clr8bit(CF, CF_24_12);
             OkiCLib_clr8bit(CF, CF_REST);
             if(pRtcTime->info_AM_PM==4){
                 OkiCLib_set8bit(H10, H10_PM_AM);
             }
             else{
                 OkiCLib_clr8bit(H10, H10_PM_AM);
             }
         }else{                         /* 24 hour */
             OkiCLib_set8bit(CF, CF_24_12);
             OkiCLib_set8bit(CF, CF_REST);
             OkiCLib_set8bit(CF, CF_24_12);
             OkiCLib_clr8bit(CF, CF_REST);
         }
         OkiCLib_clr8bit(CD, CD_HOLD);
    }
    
    return rtnVal;
}


/************************************************************************/
/*                                                                      */
/*  Function Name   : HalRtc_RtcReadDate                                */
/*  Input           : ML675050_RtcTime *pRtcTime                        */
/*  Output          : int16_t HAL_OK(1)                                 */
/*                            HAL_PARAM_ERROR(-2)                       */
/*                                                                      */
/*  Note : rtc read data.                                               */
/*                                                                      */
/************************************************************************/
int16_t HalRtc_RtcReadDate(ML675050_RtcTime *pRtcTime)
{
    int16_t rtnVal = HAL_OK;
    uint8_t busybit;
    int16_t i;
    
    OkiCLib_set8bit(CD, CD_HOLD );
        /*BUSY =0?*/
    busybit= OkiCLib_read8(CD);
    busybit= busybit & CD_BUSY;
    
    if(busybit==CD_BUSY){
         OkiCLib_clr8bit(CD, CD_HOLD);
         for(i=0;i<100;i++){
             ;
         }
    }

    OkiCLib_set8bit(CD, CD_HOLD );
         /*BUSY =0?*/
    busybit= OkiCLib_read8(CD);
    busybit= busybit & CD_BUSY;
    
    if(pRtcTime == NULL){
        rtnVal = HAL_PARAM_ERROR;
    }
    if(rtnVal == HAL_OK){

        if(busybit!=CD_BUSY){
        /* get_RTC data */
            pRtcTime->year = (uint16_t)(((OkiCLib_read8(Y10)<<4)&0xF0)|(OkiCLib_read8(Y1)&0x0F));
            
            pRtcTime->month = (uint16_t)(((OkiCLib_read8(MO10)<<4)&0xF0)|(OkiCLib_read8(MO1)&0x0F));
            
            pRtcTime->day = (uint16_t)(((OkiCLib_read8(D10)<<4)&0xF0)|(OkiCLib_read8(D1)&0x0F));
            
            pRtcTime->hour = (uint16_t)((((OkiCLib_read8(H10)&0x03)<<4)&0xF0)|(OkiCLib_read8(H1)&0x0F));
            
            pRtcTime->minute = (uint16_t)(((OkiCLib_read8(M10)<<4)&0xF0)|(OkiCLib_read8(M1)&0x0F));
            
            pRtcTime->second = (uint16_t)(((OkiCLib_read8(S10)<<4)&0xF0)|(OkiCLib_read8(S1)&0x0F));

            pRtcTime->info_24_12 = (uint8_t)((OkiCLib_read8(CF) & 0x4) >> 2);  /*24/12*/
            if (pRtcTime->info_24_12 != 0x01) {
                pRtcTime->info_AM_PM = (uint8_t)((OkiCLib_read8(H10) & 0x4) >> 2); /*AM/PM*/
            }

            OkiCLib_clr8bit(CD, CD_HOLD);
        }

    }

    return rtnVal;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?