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 + -
显示快捷键?