當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]//C文件/**********************************************************************************************

//C文件


/*************************************************************************************************************
?*?文件名:			PCF8563.c
?*?功能:			STM32?PCF8563?高精度?RTC?芯片驅(qū)動(dòng)
?*?作者:			cp1300@139.com
?*?創(chuàng)建時(shí)間:		2017-07-10
?*?最后修改時(shí)間:	2017-07-10
?*?詳細(xì):			使用軟件IIC接口驅(qū)動(dòng)
					2017-07-13:通過(guò)寫入PCF8563_REG_CLKOUT與讀取PCF8563_REG_CLKOUT寄存器,發(fā)現(xiàn)某些不用的位會(huì)亂跳,最終發(fā)現(xiàn)時(shí)間寄存器也有同樣的問(wèn)題,需要把不用的位都屏蔽掉
*************************************************************************************************************/
#include?"system.h"
#include?"delay.h"
#include?"PCF8563.h"
#include?"stdio.h"
#include?"SoftwareIIC.h"

//月修正數(shù)據(jù)表
static?u8?const?table_week[12]?=?{0,3,3,6,1,4,6,2,5,0,3,5};?		??
//平年的月份日期表
static?u8?const?mon_table[12]?=?{31,28,31,30,31,30,31,31,30,31,30,31};
static?bool?Is_Leap_Year(u16?year);


rtc_timer?ext_timer;	//外部RTC時(shí)鐘
static?SIIC_HANDLE?IIC_Handel;

#define?PCF8563_SDA_GPIOx?	GPIOC
#define?PCF8563_SCL_GPIOx?	GPIOC
#define?PCF8563_SDA_Bit?	1
#define?PCF8563_SCL_Bit	?	13




//調(diào)試宏開關(guān)
#define?PCF8563_DBUG	1
#if?PCF8563_DBUG
	#include?"system.h"
	#define?PCF8563_Debug(format,...)	uart_printf(format,##__VA_ARGS__)
#else
	#define?PCF8563_Debug(format,...)	/
/
#endif	//PCF8563_DBUG


//PCF8563?iic總線地址
#define?PCF8563_IIC_W_ADDR			0xA2
#define?PCF8563_IIC_R_ADDR			0xA3


static?u8?GetWeek(u16?year,u8?month,u8?day);	//獲取2000-2099年之間的日期對(duì)應(yīng)的星期
static?u32?DECtoBCD(?u8?DEC);					//將數(shù)字轉(zhuǎn)換為壓縮BCD格式,最大支持99
static?u32?BCDtoDEC(u8?BCD);					//將壓縮BCD轉(zhuǎn)為DEC,最大支持99
bool?PCF8563_ReadReg(PCF8563_REG_TYPE?RegIndex,?u8?*pData,?u8?RegNum)?;		//讀取PCF8563寄存器
bool?PCF8563_WriteReg(PCF8563_REG_TYPE?RegIndex,?u8?*pData,?u8?RegNum)?;	//寫入PCF8563寄存器
bool?PCF8563_WriteOneReg(PCF8563_REG_TYPE?RegIndex,?u8?Data);				//寫單個(gè)寄存器


/*************************************************************************************************************************
*函數(shù)????????	:	bool?PCF8563_Init(void)
*功能????????	:	初始化PCF8563
*參數(shù)????????	:	無(wú)
*返回????????	:	FALSE:失敗;TRUE:成功
*依賴			:?	底層宏定義
*作者???????	:	cp1300@139.com
*時(shí)間?????		:	2017-07-10
*最后修改時(shí)間	:	2017-07-10
*說(shuō)明????????	:	無(wú)
*************************************************************************************************************************/
bool?PCF8563_Init(void)
{
	u8?data;
	
	memset(&ext_timer,0,sizeof(rtc_timer));
	if(SIIC_Init(&IIC_Handel,PCF8563_SDA_GPIOx,?PCF8563_SCL_GPIOx,?PCF8563_SDA_Bit,?PCF8563_SCL_Bit,?1)?==?FALSE)
	{
		PCF8563_Debug("**********************PCF8563?初始化失敗,IIC接口初始化失??!rn");
		return?FALSE;
	}
	
	if(PCF8563_WriteOneReg(PCF8563_REG_CONTROL1,?0x08)?==?FALSE)	//啟動(dòng)時(shí)鐘,開啟掉電檢測(cè)
	{
		PCF8563_Debug("**********************PCF8563?初始化失敗,開啟掉電監(jiān)測(cè)功能失??!rn");
		return?FALSE;
	}

	if(PCF8563_ReadReg(PCF8563_REG_SECONDS,?&data,?1)?==?FALSE)
	{
		PCF8563_Debug("**********************PCF8563?初始化失敗,讀取秒寄存器失??!rn");
		return?FALSE;
	}
	if(data?&?0x80)	//秒?最高位為1,時(shí)鐘芯片沒(méi)有初始化?integrity?of?the?clock?information?is?no?longer?guaranteed
	{
		//初始化時(shí)鐘芯片與時(shí)間
		PCF8563_Debug("時(shí)鐘芯片沒(méi)有初始化,需要重新初始化時(shí)鐘!rn");
		if(PCF8563_SetTimer(2017,6,6,6,6,6)==FALSE)
		{
			PCF8563_Debug("時(shí)鐘芯片沒(méi)有初始化,需要重新初始化時(shí)鐘!rn");
		}
	}
	
	PCF8563_GetTimer();		//更新時(shí)間
	return?TRUE;
}

/*************************************************************************************************************************
*函數(shù)????????	:	bool?PCF8563_ReadReg(PCF8563_REG_TYPE?RegIndex,?u8?*pData,?u8?RegNum)?
*功能????????	:	讀取PCF8563多個(gè)寄存器
*參數(shù)????????	:	RegIndex:寄存器地址,pData:讀取到的值,RegNum:讀取的寄存器數(shù)量
*返回????????	:	TRUE:通信成功;FALSE:通信失敗
*依賴			:?	底層宏定義
*作者???????	:	cp1300@139.com
*時(shí)間?????		:	2017-07-10
*最后修改時(shí)間	:	2017-07-10
*說(shuō)明????????	:	無(wú)
*************************************************************************************************************************/
bool?PCF8563_ReadReg(PCF8563_REG_TYPE?RegIndex,?u8?*pData,?u8?RegNum)?
{
	u8?i;
	
	if(RegNum?<?1)?RegNum?=?1;
	if(RegNum?>?16)?RegNum?=?16;								//限制讀取的最大數(shù)量
	
	SIIC_Start(&IIC_Handel);									//發(fā)送起始信號(hào)
	if(SIIC_SendByte(&IIC_Handel,?PCF8563_IIC_W_ADDR)==FALSE)	//發(fā)送寫地址
	{
		PCF8563_Debug("PCF8563?發(fā)送寫地址?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	
	if(SIIC_SendByte(&IIC_Handel,?RegIndex)==FALSE)				//發(fā)送要讀取的寄存器地址
	{
		PCF8563_Debug("PCF8563?發(fā)送要讀取的寄存器地址2?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	
	SIIC_Start(&IIC_Handel);									//發(fā)送起始信號(hào)	
	
	
	if(SIIC_SendByte(&IIC_Handel,?PCF8563_IIC_R_ADDR)==FALSE)	//發(fā)送讀取地址
	{
		PCF8563_Debug("PCF8563?發(fā)送讀取地址?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	
	for(i?=?0;i?<?RegNum;i?++)
	{
		if(i?==?(RegNum-1))										//最后一字節(jié)
		{
			pData[i]?=?SIIC_ReadByte(&IIC_Handel,?FALSE);		//讀取數(shù)據(jù)-最后一字節(jié)不發(fā)送ACK
		}
		else
		{
			pData[i]?=?SIIC_ReadByte(&IIC_Handel,?TRUE);		//讀取數(shù)據(jù)
		}
	}
	
	SIIC_Stop(&IIC_Handel);										//發(fā)送結(jié)束

	return?TRUE;
}


/*************************************************************************************************************************
*函數(shù)????????	:	bool?PCF8563_ReadOneReg(PCF8563_REG_TYPE?RegIndex,?u8?*pData)?
*功能????????	:	讀取PCF8563單個(gè)寄存器
*參數(shù)????????	:	RegIndex:寄存器地址,pData:讀取到的值
*返回????????	:	TRUE:通信成功;FALSE:通信失敗
*依賴			:?	底層宏定義
*作者???????	:	cp1300@139.com
*時(shí)間?????		:	2017-07-10
*最后修改時(shí)間	:	2017-07-13
*說(shuō)明????????	:	無(wú)
*************************************************************************************************************************/
bool?PCF8563_ReadOneReg(PCF8563_REG_TYPE?RegIndex,?u8?*pData)?
{
	SIIC_Start(&IIC_Handel);									//發(fā)送起始信號(hào)
	if(SIIC_SendByte(&IIC_Handel,?PCF8563_IIC_W_ADDR)==FALSE)	//發(fā)送寫地址
	{
		PCF8563_Debug("PCF8563?發(fā)送寫地址?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	
	if(SIIC_SendByte(&IIC_Handel,?RegIndex)==FALSE)				//發(fā)送要讀取的寄存器地址
	{
		PCF8563_Debug("PCF8563?發(fā)送要讀取的寄存器地址2?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	
	SIIC_Start(&IIC_Handel);									//發(fā)送起始信號(hào)	
	
	
	if(SIIC_SendByte(&IIC_Handel,?PCF8563_IIC_R_ADDR)==FALSE)	//發(fā)送讀取地址
	{
		PCF8563_Debug("PCF8563?發(fā)送讀取地址?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	
	*pData?=?SIIC_ReadByte(&IIC_Handel,?FALSE);					//讀取數(shù)據(jù)-最后一字節(jié)不發(fā)送ACK
	
	SIIC_Stop(&IIC_Handel);										//發(fā)送結(jié)束
	return?TRUE;
}


/*************************************************************************************************************************
*函數(shù)????????	:	bool?PCF8563_WriteReg(PCF8563_REG_TYPE?RegIndex,?u8?*pData,?u8?RegNum)?
*功能????????	:	寫PCF8563多個(gè)寄存器
*參數(shù)????????	:	RegIndex:寄存器地址,pData:寫入的值,RegNum:寫入的寄存器數(shù)量
*返回????????	:	TRUE:通信成功;FALSE:通信失敗
*依賴			:?	底層宏定義
*作者???????	:	cp1300@139.com
*時(shí)間?????		:	2017-07-10
*最后修改時(shí)間	:	2017-07-10
*說(shuō)明????????	:	無(wú)
*************************************************************************************************************************/
bool?PCF8563_WriteReg(PCF8563_REG_TYPE?RegIndex,?u8?*pData,?u8?RegNum)?
{
	u8?i;

	SIIC_Start(&IIC_Handel);									//發(fā)送起始信號(hào)
	if(SIIC_SendByte(&IIC_Handel,?PCF8563_IIC_W_ADDR)==FALSE)	//發(fā)送寫地址
	{
		PCF8563_Debug("PCF8563?發(fā)送寫地址?ACK錯(cuò)誤rn");
		return?FALSE;
	}

	/*if(SIIC_SendByte(&IIC_Handel,?0)==FALSE)				//發(fā)送要讀取的寄存器地址
	{
		PCF8563_Debug("PCF8563?發(fā)送要讀取的寄存器地址2?ACK錯(cuò)誤rn");
		return?FALSE;
	}*/
	
	if(SIIC_SendByte(&IIC_Handel,?RegIndex)==FALSE)				//發(fā)送要寫的寄存器地址
	{
		PCF8563_Debug("PCF8563?發(fā)送要讀取的寄存器地址2?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	/*SIIC_Start(&IIC_Handel);									//發(fā)送起始信號(hào)						
	if(SIIC_SendByte(&IIC_Handel,?PCF8563_IIC_W_ADDR)==FALSE)	//發(fā)送寫地址
	{
		PCF8563_Debug("PCF8563?發(fā)送讀取地址?ACK錯(cuò)誤rn");
		return?FALSE;
	}*/
	
	for(i?=?0;i?<?RegNum;i?++)
	{
		SIIC_SendByte(&IIC_Handel,?pData[i]);					//發(fā)送數(shù)據(jù)
	}
	
	SIIC_Stop(&IIC_Handel);										//發(fā)送結(jié)束
???
	return?TRUE;
}


/*************************************************************************************************************************
*函數(shù)????????	:	bool?PCF8563_WriteOneReg(PCF8563_REG_TYPE?RegIndex,?u8?Data)??
*功能????????	:	寫PCF8563單個(gè)寄存器
*參數(shù)????????	:	RegIndex:寄存器地址,Data:寫入的值
*返回????????	:	TRUE:通信成功;FALSE:通信失敗
*依賴			:?	底層宏定義
*作者???????	:	cp1300@139.com
*時(shí)間?????		:	2017-07-10
*最后修改時(shí)間	:	2017-07-13
*說(shuō)明????????	:	無(wú)
*************************************************************************************************************************/
bool?PCF8563_WriteOneReg(PCF8563_REG_TYPE?RegIndex,?u8?Data)?
{
	SIIC_Start(&IIC_Handel);									//發(fā)送起始信號(hào)
	if(SIIC_SendByte(&IIC_Handel,?PCF8563_IIC_W_ADDR)==FALSE)	//發(fā)送寫地址
	{
		PCF8563_Debug("PCF8563?發(fā)送寫地址?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	if(SIIC_SendByte(&IIC_Handel,?RegIndex)==FALSE)				//發(fā)送要寫的寄存器地址
	{
		PCF8563_Debug("PCF8563?發(fā)送要讀取的寄存器地址2?ACK錯(cuò)誤rn");
		return?FALSE;
	}
	
	SIIC_SendByte(&IIC_Handel,?Data);							//發(fā)送數(shù)據(jù)
	
	SIIC_Stop(&IIC_Handel);										//發(fā)送結(jié)束
???
	return?TRUE;
}

/*************************************************************************************************************************
*?函數(shù)			:	bool?PCF8563_GetTimer(void)
*?功能			:	PCF8563獲取時(shí)間
*?參數(shù)			:	無(wú)
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時(shí)間			:	2017-07-11
*?最后修改時(shí)間?	:?	2017-07-11
*?說(shuō)明			:?	獲取到的時(shí)間會(huì)更新到全局ext_timer
*************************************************************************************************************************/
bool?PCF8563_GetTimer(void)
{
	u8?data[7];
	u8?retry;
	u8?temp;

	
	for(retry?=?0;retry?<?3;retry?++)
	{
		if(PCF8563_ReadReg(PCF8563_REG_SECONDS,?data,?7)?==?TRUE)	//設(shè)置時(shí)間
		{
			if(data[0]?&?0x80)	//時(shí)間無(wú)效
			{
				PCF8563_Debug("PCF8563?時(shí)間無(wú)效,需要重新初始化!rn");
				PCF8563_SetTimer(2017,6,6,6,6,6);					//初始化設(shè)置時(shí)間
			}
			else
			{
				
				//uart_printf("%02X,%02X,%02X,%02X,%02X,%02X,%02Xrn",data[0],data[1],data[2],data[3],data[4],data[5],data[6]);
				temp?=?BCDtoDEC(data[0]&0x7F);
				if(temp?>?59)?continue;				//秒鐘范圍不對(duì)
				ext_timer.sec?=?temp;
				temp?=?BCDtoDEC(data[1]&0x7F);
				if(temp?>?59)?continue;				//分鐘范圍不對(duì)
				ext_timer.min?=?temp;
				temp?=?BCDtoDEC(data[2]&0x3F);
				if(temp?>?23)?continue;				//小時(shí)范圍不對(duì)
				ext_timer.hour?=?temp;
				temp?=?BCDtoDEC(data[3]&0x3F);
				if(temp?>?31||temp==0)?continue;	//日期范圍不對(duì)
				ext_timer.date?=?temp;
				temp?=?BCDtoDEC(data[4]&0x07);
				if(temp?>?6)?continue;				//星期范圍不對(duì)
				ext_timer.week?=?temp+1;
				temp?=?BCDtoDEC(data[5]&0x1F);
				if(temp?>?12||temp==0)?continue;	//月份范圍不對(duì)
				ext_timer.month?=?temp;
				ext_timer.year?=?BCDtoDEC(data[6])+2000;

				return?TRUE;
			}
		}
		else
		{
			PCF8563_Debug("PCF8563?讀取時(shí)間失敗!rn");
		}
	}
	return?FALSE;
}



/*************************************************************************************************************************
*?函數(shù)			:	bool?PCF8563_SetTimer(u16?year,u8?month,u8?date,u8?hour,u8?min,u8?sec)
*?功能			:	PCF8563時(shí)間設(shè)置
*?參數(shù)			:	year,month,date:年(2000~2099),月(1~12),日(1~31),hour,min,sec:小時(shí)24小時(shí),分鐘,秒鐘
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時(shí)間			:	2017-07-11
*?最后修改時(shí)間?	:?	2017-07-11
*?說(shuō)明			:?	
*************************************************************************************************************************/
bool?PCF8563_SetTimer(u16?year,u8?month,u8?date,u8?hour,u8?min,u8?sec)
{
	u8?data[7];
	
	if(year?<?2000)?year?=?2000;
	if(year?>?2099)?year?=?2099;
	
	data[0]?=?DECtoBCD(sec);	//秒
	data[1]?=?DECtoBCD(min);	//分
	data[2]?=?DECtoBCD(hour);	//小時(shí)
	data[3]?=?DECtoBCD(date);	//日
	data[4]?=?GetWeek(year,?month,?date)-1;	//星期
	year?-=?2000;
	data[5]?=?DECtoBCD(month);	//月
	data[6]?=?DECtoBCD(year);	//年
	
	PCF8563_WriteReg(PCF8563_REG_SECONDS,?&data[0],?7);	//設(shè)置時(shí)間

	
	
	if(PCF8563_WriteOneReg(PCF8563_REG_CONTROL1,?0x08)?==?FALSE)	//啟動(dòng)時(shí)鐘,開啟掉電檢測(cè)
	{
		PCF8563_Debug("**********************PCF8563?設(shè)置失敗,啟動(dòng)時(shí)鐘失?。n");
		return?FALSE;
	}
	
	return?TRUE;
}







/*************************************************************************************************************************
*?函數(shù)			:	u32?PCF8563_TimeToSec(u16?syear,u8?smon,u8?sday,u8?hour,u8?min,u8?sec)
*?功能			:	PCF8563時(shí)間轉(zhuǎn)換為秒(從1970開始)(注意:不可重入,請(qǐng)注意調(diào)用沖突)
*?參數(shù)			:	year,month,date:年(2000~2099),月(1~12),日(1~31),hour,min,sec:小時(shí)24小時(shí),分鐘,秒鐘
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時(shí)間			:	2017-07-11
*?最后修改時(shí)間?	:?	2017-07-17
*?說(shuō)明			:?	只能計(jì)算從2000年之后的秒,修改如果年,月,日不變,則無(wú)需重新計(jì)算,提高效率
					注意:不可重入,請(qǐng)注意調(diào)用沖突
*************************************************************************************************************************/
u32?PCF8563_TimeToSec(u16?syear,u8?smon,u8?sday,u8?hour,u8?min,u8?sec)
{
	u16?t;
	u32?seccount?=?0;
	static?u32?LastYearSec?=?0;		//之前年對(duì)應(yīng)的秒,如果年不變,則不用重新計(jì)算
	static?u32?LastMonSec?=?0;		//當(dāng)前年月份對(duì)應(yīng)的秒數(shù),如果月份不變,則不需要重新計(jì)算
	static?u32?LastDaySec?=?0;		//當(dāng)前日期對(duì)應(yīng)的秒,如果日期不變,則不需要重新計(jì)算
	static?u16?LastYear?=?0;		//之前的年如果不變,則只計(jì)算今年的秒
	static?u8?LastMon?=?0;			//當(dāng)前年之前的月份
	static?u8?LastDay?=?0;			//之前的日期
	
	
	
	if(syear?<?2000?||?syear?>?2099)
		return?0;

	//年變化了才重新計(jì)算
	if(LastYear?!=?syear)							//年發(fā)生了變化,重新計(jì)算
	{
		LastYear?=?syear;							//記錄本次的年
		LastYearSec?=?0;
		for(t?=?1970;t?<?syear;t?++)				//把所有年份的秒鐘相加
		{
			if(Is_Leap_Year(t))
				LastYearSec?+=?31622400;			//閏年的秒鐘數(shù)
			else?
				LastYearSec?+=?31536000;			??//平年的秒鐘數(shù)
		}
	}

	//月變化了才重新計(jì)算
	if(LastMon?!=?smon)								//月份有變化
	{
		LastMon?=?smon;								//記錄本次的月份
		smon?-=?1;
		LastMonSec?=?0;
		for(t?=?0;t?<?smon;t?++)	???					//把前面月份的秒鐘數(shù)相加
		{
			LastMonSec?+=?(u32)mon_table[t]?*?86400;	//月份秒鐘數(shù)相加
			if(Is_Leap_Year(syear)?&&?t?==?1)
				LastMonSec?+=?86400;					//閏年2月份增加一天的秒鐘數(shù)	???
		}
	}
	//日期變化了才重新計(jì)算
	if(LastDay?!=?sday)
	{
		LastDay?=?sday;								//記錄本次的日期
		LastDaySec?=?(u32)(sday?-?1)?*?86400;		//把前面日期的秒鐘數(shù)相加?
	}
	
	seccount?=?LastYearSec+LastMonSec+LastDaySec;	//直接獲取年對(duì)應(yīng)的秒,不用每次計(jì)算

	seccount?+=?(u32)hour?*?3600;					//小時(shí)秒鐘數(shù)
????seccount?+=?(u32)min?*?60;	?					//分鐘秒鐘數(shù)
	seccount?+=?sec;								//最后的秒鐘加上去
	
	return?seccount;
}



??
/*************************************************************************************************************************
*?函數(shù)			:	bool?Is_Leap_Year(u16?year)
*?功能			:	判斷是否是閏年函數(shù)
*?參數(shù)			:	year:年份
*?返回			:	TRUE:是閏年,FALSE:不是閏年
*?依賴			:	無(wú)
*?作者			:	cp1300@139.com
*?時(shí)間			:	2014-05-30
*?最后修改時(shí)間	:	2014-05-30
*?說(shuō)明			:?	
					月份???1??2??3??4??5??6??7??8??9??10?11?12
					閏年???31?29?31?30?31?30?31?31?30?31?30?31
					非閏年?31?28?31?30?31?30?31?31?30?31?30?31	
*************************************************************************************************************************/
static?bool?Is_Leap_Year(u16?year)
{			??
	if(year?%?4?==?0)?//必須能被4整除
	{?
		if(year?%?100?==?0)?
		{?
			if(year?%?400?==?0)
				return?TRUE;//如果以00結(jié)尾,還要能被400整除?	???
			else?
				return?FALSE;???
		}else?
			return?TRUE;???
	}else?
		return?FALSE;	
}


//獲取2000-2099年之間的日期對(duì)應(yīng)的星期
//功能描述:輸入公歷日期得到星期(只允許1901-2099年)
//year,month,day:公歷年月日?
//返回值:星期號(hào)(1~7,代表周1~周日)																						?
static?u8?GetWeek(u16?year,u8?month,u8?day)
{	
	u16?temp2;
	u8?yearH,yearL;
	yearH=year/100;	yearL=year%100;?
	//?如果為21世紀(jì),年份數(shù)加100??
	if?(yearH>19)yearL+=100;
	//?所過(guò)閏年數(shù)只算1900年之后的??
	temp2=yearL+yearL/4;
	temp2=temp2%7;?
	temp2=temp2+day+table_week[month-1];
	if?(yearL%4==0&&month<3)temp2--;
	temp2%=7;
	if(temp2==0)temp2=7;
	return?temp2;
}	




//將數(shù)字轉(zhuǎn)換為壓縮BCD格式,最大支持99
static?u32?DECtoBCD(?u8?DEC)?
{
	return?((u8)(DEC/10)<>4)*10+(BCD&0x0f);
}



//使能系統(tǒng)命令行
#if?SYS_CMD_EN_
#include?"cmd.h"
#include?"string.h"

const?CMD_TYPE??CMD_GET_ExtTIME		=	{"TIME?",?0xCC5C410A,?CMD_ExtGetTime,?"tt獲取系統(tǒng)時(shí)間"};
const?CMD_TYPE??CMD_GET_ExtDATE		=	{"DATE?",?0xB2704461,?CMD_ExtGetDate,?"tt獲取系統(tǒng)日期"};
const?CMD_TYPE??CMD_SET_ExtTIME		=	{"TIME=",?0xCC5C4108,?CMD_ExtSetTime,?"tt設(shè)置系統(tǒng)時(shí)間?如(12:32:54):TIME=12?32?54"};
const?CMD_TYPE??CMD_SET_ExtDATE		=	{"DATE=",?0xB270445F,?CMD_ExtSetDate,?"tt設(shè)置系統(tǒng)日期?如(2014?6?8):TIME=2014?6?8"};

//獲取時(shí)間
void?CMD_ExtGetTime(char?*pStr)
{
	//PCF8563_GetTimer();		//更新時(shí)間
	cmd_printf("[獲取時(shí)間成功]:%02d:%02d:%02drn",ext_timer.hour,?ext_timer.min,?ext_timer.sec);
}

//獲取日期
void?CMD_ExtGetDate(char?*pStr)
{
	//PCF8563_GetTimer();		//更新時(shí)間
	cmd_printf("[獲取日期成功]:%04d-%02d-%02drn",ext_timer.year,?ext_timer.month,?ext_timer.date);
}

//設(shè)置時(shí)間
void?CMD_ExtSetTime(char?*pStr)
{
	u8?hour,min,sec;
	u8?len;
	char?*p;
	u8?num;
	
	len?=?strlen(pStr);	//獲取長(zhǎng)度
	if(isStrNumAndSpc(pStr,?len,?2)?==?FALSE)
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	//小時(shí)
	p?=?strstr(pStr,"?");	//搜索空格
	if(p?==?NULL)
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	num?=?p?-?pStr;
	if((num?>?2)?||?(num?==?0))
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	hour?=?CMD_StringToDec(pStr,?num);
	if(hour>23)
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	
	//分鐘
	pStr?=?p+1;
	p?=?strstr(pStr,"?");	//搜索空格
	if(p?==?NULL)
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	num?=?p?-?pStr;
	if((num?>?2)?||?(num?==?0))
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	min?=?CMD_StringToDec(pStr,?num);
	if(min>59)
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	//秒鐘
	pStr?=?p+1;
	num?=?strlen(pStr);
	if((num?>?2)?||?(num?==?0))
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	sec?=?CMD_StringToDec(pStr,?num);
	if(sec>59)
	{
		cmd_printf("[時(shí)間設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	
	PCF8563_GetTimer();		//更新時(shí)間
	if(PCF8563_SetTimer(ext_timer.year,?ext_timer.month,?ext_timer.date,hour,?min,?sec)?==?FALSE)
	{
		PCF8563_GetTimer();		//更新時(shí)間
		cmd_printf("[時(shí)間設(shè)置失敗]:%02d:%02d:%02drn",ext_timer.hour,?ext_timer.min,?ext_timer.sec);
	}
	else
	{
		PCF8563_GetTimer();		//更新時(shí)間
		cmd_printf("[時(shí)間設(shè)置成功]:%02d:%02d:%02drn",ext_timer.hour,?ext_timer.min,?ext_timer.sec);
	}
	
}?


//設(shè)置日期
void?CMD_ExtSetDate(char?*pStr)
{
	u16?year;
	u8?month,?date;
	u8?len;
	char?*p;
	u8?num;
	
	len?=?strlen(pStr);	//獲取長(zhǎng)度
	if(isStrNumAndSpc(pStr,?len,?2)?==?FALSE)
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	//年
	p?=?strstr(pStr,"?");	//搜索空格
	if(p?==?NULL)
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	num?=?p?-?pStr;
	if((num?>?4)?||?(num?==?0))
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	year?=?CMD_StringToDec(pStr,?num);
	if(year>9999)
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	
	//月
	pStr?=?p+1;
	p?=?strstr(pStr,"?");	//搜索空格
	if(p?==?NULL)
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	num?=?p?-?pStr;
	if((num?>?2)?||?(num?==?0))
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	month?=?CMD_StringToDec(pStr,?num);
	if(month>12)
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	//日
	pStr?=?p+1;
	num?=?strlen(pStr);
	if((num?>?2)?||?(num?==?0))
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	date?=?CMD_StringToDec(pStr,?num);
	if(date>31)
	{
		cmd_printf("[日期設(shè)置錯(cuò)誤]:格式不對(duì)或非法參數(shù)!rn");
		return;
	}
	
	PCF8563_GetTimer();		//更新時(shí)間
	if(PCF8563_SetTimer(year,?month,?date,?ext_timer.hour,?ext_timer.min,?ext_timer.sec)?==?FALSE)
	{
		PCF8563_GetTimer();		//更新時(shí)間
		cmd_printf("[日期設(shè)置失敗]:%04d-%02d-%02drn",ext_timer.year,?ext_timer.month,?ext_timer.date);
	}
	else
	{
		PCF8563_GetTimer();		//更新時(shí)間
		cmd_printf("[日期設(shè)置成功]:%04d-%02d-%02drn",ext_timer.year,?ext_timer.month,?ext_timer.date);
	}
	
}?


#endif?//SYS_CMD_EN_


//,H文件


/*************************************************************************************************************
?*?文件名:			PCF8563.h
?*?功能:			STM32?PCF8563?高精度?RTC?芯片驅(qū)動(dòng)
?*?作者:			cp1300@139.com
?*?創(chuàng)建時(shí)間:		2017-07-10
?*?最后修改時(shí)間:	2017-07-10
?*?詳細(xì):			使用軟件IIC接口驅(qū)動(dòng)
*************************************************************************************************************/
#ifndef?_PCF8563_H_
#define?_PCF8563_H_

#include?"system.h"

#if(BOARD_SUPPORT)	//需要板級(jí)支持
#include?"board.h"?
#else	//默認(rèn)支持

#endif


//時(shí)間結(jié)構(gòu)體
typedef??struct?
{
	u8	hour;?		//小時(shí)
	u8	min;	?	//分鐘
	u8	sec;		//秒			
	u8??month;		//月
	u8??date;		//日
	u8??week;		//星期
	u16?year;	?	//年
}rtc_timer;
extern?rtc_timer?ext_timer;	//外部RTC時(shí)鐘


//PCF8563?寄存器
typedef?enum
{
	PCF8563_REG_CONTROL1			=	0x00,	//控制寄存器1
	PCF8563_REG_CONTROL2			=	0x01,	//控制寄存器2
	PCF8563_REG_SECONDS				=	0x02,	//秒?seconds?00?to?59?coded?in?BCD
	PCF8563_REG_MINUTES				=	0x03,	//分?minutes?00?to?59?coded?in?BCD
	PCF8563_REG_HOURS				=	0x04,	//小時(shí)?hours?00?to?23?coded?in?BCD
	PCF8563_REG_DAYS				=	0x05,	//日?days?01?to?31?coded?in?BCD
	PCF8563_REG_WEEK				=	0x06,	//星期?weekdays?0?to?6?in?BCD
	PCF8563_REG_MONTHS				=	0x07,	//月份?months?01?to?12?coded?in?BCD
	PCF8563_REG_YEARS				=	0x08,	//年份?years?00?to?99?coded?in?BCD
	PCF8563_REG_ALARM_MINUTE		=	0x09,	//鬧鐘,分鐘?minute?alarm?00?to?59?coded?in?BCD
	PCF8563_REG_ALARM_HOUR			=	0x0A,	//鬧鐘,小時(shí)?hour?alarm?00?to?23?coded?in?BCD
	PCF8563_REG_ALARM_DAY			=	0x0B,	//鬧鐘,日?day?alarm?01?to?31?coded?in?BCD
	PCF8563_REG_ALARM_WEEK			=	0x0C,	//鬧鐘,星期?weekday?alarm?0?to?6?in?BCD
	PCF8563_REG_CLKOUT				=	0x0D,	//時(shí)鐘輸出設(shè)置
	PCF8563_REG_TIME_CONTROL		=	0x0E,	//定時(shí)器設(shè)置
	PCF8563_REG_TIME				=	0x0F,	//定時(shí)器倒計(jì)數(shù)值
}PCF8563_REG_TYPE;


bool?PCF8563_Init(void);													//PCF8563初始化
bool?PCF8563_SetTimer(u16?year,u8?month,u8?date,u8?hour,u8?min,u8?sec);		//PCF8563時(shí)間設(shè)置
bool?PCF8563_GetTimer(void);												//更新時(shí)間

u32?PCF8563_TimeToSec(u16?syear,u8?smon,u8?sday,u8?hour,u8?min,u8?sec);		//時(shí)間轉(zhuǎn)換為秒,注意:不可重入,請(qǐng)注意調(diào)用沖突


//使能系統(tǒng)命令行
#if?SYS_CMD_EN_
#include?"cmd.h"
#include?"string.h"



extern?const?CMD_TYPE??CMD_GET_ExtTIME;
extern?const?CMD_TYPE??CMD_GET_ExtDATE;
extern?const?CMD_TYPE??CMD_SET_ExtTIME;
extern?const?CMD_TYPE??CMD_SET_ExtDATE;


//獲取時(shí)間
void?CMD_ExtGetTime(char?*pStr);
//獲取日期
void?CMD_ExtGetDate(char?*pStr);
//設(shè)置時(shí)間
void?CMD_ExtSetTime(char?*pStr);
//設(shè)置日期
void?CMD_ExtSetDate(char?*pStr);

#endif?//SYS_CMD_EN_

#endif?/*_PCF8563_H_*/



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉