www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]STM32F4裸機RTC驅(qū)動,寄存器操作。/******************************************************************************

STM32F4裸機RTC驅(qū)動,寄存器操作。


/*************************************************************************************************************
?*?文件名		:	RTC.c
?*?功能			:	STM32F4?RTC驅(qū)動
?*?作者			:	cp1300@139.com
?*?創(chuàng)建時間		:	2017-07-01
?*?最后修改時間	:	2017-07-01
?*?詳細:			要正確讀取?RTC?日歷寄存器(RTC_SSR、RTC_TR?和?RTC_DR),APB1?時鐘頻率?(fPCLK1)?必須等于或大于?fRTCCLK?RTC?時鐘頻率的七倍。這可以確保同步機制行為的安全性。
					如果?APB1?時鐘頻率低于?RTC?時鐘頻率的七倍,則軟件必須分兩次讀取日歷時間寄存器和?日期寄存器。這樣,當兩次讀取的?RTC_TR?結(jié)果相同時,才能確保數(shù)據(jù)正確。
					否則必須執(zhí)?行第三次讀訪問。任何情況下,APB1?的時鐘頻率都不能低于?RTC?的時鐘頻率。
					RTC->BKP0R:用于標示是否進行了初始化RTC,請不要再使用了。
					注意:初始化時會使用調(diào)試串口打印信息
					2017-01-15:修改全局時間結(jié)構(gòu)體名稱為g_timer,并且增加系統(tǒng)命令支持
*************************************************************************************************************/	
#include?"rtc.h"
#include?"system.h"?

volatile?tm?g_timer;								//全局系統(tǒng)時鐘

//秒中斷回調(diào)函數(shù)
static?void?(*RTC_SerIntCallBack)(void)?;			//秒中斷回調(diào)函數(shù)

//內(nèi)部函數(shù)申明
u8?RTC_GetWeek(u16?year,u8?month,u8?day);		//獲取2000-2099年之間的日期對應(yīng)的星期
u32?RTC_DECtoBCD(?u8?DEC);						//將數(shù)字轉(zhuǎn)換為壓縮BCD格式,最大支持99
u32?RTC_BCDtoDEC(u8?BCD);						//將壓縮BCD轉(zhuǎn)為DEC,最大支持99

/*************************************************************************************************************************
*?函數(shù)			:	bool?RTC_WaitSynchro(void)
*?功能			:	等待RSF同步
*?參數(shù)			:	無
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時間			:	2017-07-01
*?最后修改時間?	:?	2017-07-01
*?說明			:?	
*************************************************************************************************************************/
bool?RTC_WaitSynchro(void)
{?
	u32?retry=0XFFFFF;?
	
	//執(zhí)行以下步驟解鎖RTC寄存器寫保護
	RTC->WPR?=?0xCA;						//寫入KEY后關(guān)閉RTC寄存器寫保護
	RTC->WPR?=?0x53;?
	
	RTC->ISR?&=?~(1<ISR&(1<WPR=?0xff;							//隨便寫入一個值(不是KEY)使能RTC寄存器寫保護?
	
	return?TRUE;
}




/*************************************************************************************************************************
*?函數(shù)			:	bool?RTC_InitMode(void)
*?功能			:	RTC進入初始化模式
*?參數(shù)			:	無
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時間			:	2017-07-01
*?最后修改時間?	:?	2017-07-01
*?說明			:?	
*************************************************************************************************************************/
bool?RTC_InitMode(void)
{?
	u32?retry=0X10000;?
		
	if(RTC->ISR?&?(1<ISR?|=?1<ISR&(1<WPR?=?0xCA;						//寫入KEY后關(guān)閉RTC寄存器寫保護
	RTC->WPR?=?0x53;?
	if(RTC_InitMode()?==?FALSE)return?FALSE;//進入RTC初始化模式失敗
	temp?=?(u32)RTC_DECtoBCD(hour)?<<?16;	//小時
	temp?|=?(u32)RTC_DECtoBCD(min)?<<?8;	//分鐘
	temp?|=?(u32)RTC_DECtoBCD(sec)?<<?0;	//秒鐘
	
	RTC->TR=temp;							//設(shè)置時間
	RTC->ISR&=~(1<WPR?=?0xFF;						//開啟寫保護
	
	return?TRUE;?
}


/*************************************************************************************************************************
*?函數(shù)			:	bool?RTC_SetDate(u16?year,u8?month,u8?date)
*?功能			:	RTC日期設(shè)置
*?參數(shù)			:	year,month,date:年(2000~2099),月(1~12),日(1~31)
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時間			:	2017-07-01
*?最后修改時間?	:?	2017-07-01
*?說明			:?	會自動退出寫保護
*************************************************************************************************************************/
bool?RTC_SetDate(u16?year,u8?month,u8?date)
{
	u32?temp;
	u8?week;
	
	//執(zhí)行以下步驟解鎖RTC寄存器寫保護
	RTC->WPR?=?0xCA;						//寫入KEY后關(guān)閉RTC寄存器寫保護
	RTC->WPR?=?0x53;?
	if(RTC_InitMode()?==?FALSE)return?FALSE;//進入RTC初始化模式失敗
	if(year?<?2000)?year?=?2000;			//限制年
	if(year?>?2099)?year?=?2099;			//限制年
	if(month?<?1)?month?=?1;				//限制月
	if(month?>?12)?month?=?12;				//限制月
	if(date?<?1)?date?=?1;					//限制日
	if(date?>?31)?date?=?31;				//限制日
	week?=?RTC_GetWeek(year,month,date);	//計算設(shè)置的日期對應(yīng)的星期
	year?-=?2000;							//年轉(zhuǎn)換為0-99
	
	temp?=?(u32)RTC_DECtoBCD(year)<<16;		//年
	temp?|=?week<<13;						//星期
	temp?|=?(u32)RTC_DECtoBCD(month)<<8;	//月份
	temp?|=?(u32)RTC_DECtoBCD(date)<DR=temp;							//寫入
	RTC->ISR&=~(1<WPR?=?0xFF;						//開啟寫保護
	
	return?TRUE;?
}


/*************************************************************************************************************************
*?函數(shù)			:	bool?RTC_GetTime(u8?*hour,u8?*min,u8?*sec)
*?功能			:	獲取RTC時間
*?參數(shù)			:	*hour,*min,*sec:小時,分鐘,秒鐘?
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時間			:	2017-07-01
*?最后修改時間?	:?	2017-07-01
*?說明			:?	24小時制
*************************************************************************************************************************/
bool?RTC_GetTime(u8?*hour,u8?*min,u8?*sec)
{
	u32?temp;
	u32?retry?=?5250*3;
	u8?ampm;
	
?	while((RTC_WaitSynchro()?==?FALSE)?&&?(retry!=0))	//等待同步??	?
	{
		nop;nop;nop;nop;nop;nop;
		retry?--;
	}
	if(retry==0)?return?FALSE;
	
	temp=RTC->TR;
	*hour=RTC_BCDtoDEC((temp>>16)&0X3F);
	*min=RTC_BCDtoDEC((temp>>8)&0X7F);
	*sec=RTC_BCDtoDEC(temp&0X7F);
	
	ampm=temp>>22;?
	if(ampm!=0)	//使用的是12小時制,并且是下午,則小時加上12小時
	{
		*hour?+=?12;
	}
	
	return?TRUE;
}


/*************************************************************************************************************************
*?函數(shù)			:	bool?RTC_GetDate(u16?*year,u8?*month,u8?*date,u8?*week)
*?功能			:	獲取RTC日期
*?參數(shù)			:	*year,*mon,*date:年,月,日;*week:星期
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時間			:	2017-07-01
*?最后修改時間?	:?	2017-07-01
*?說明			:?	
*************************************************************************************************************************/
bool?RTC_GetDate(u16?*year,u8?*month,u8?*date,u8?*week)
{
	u32?retry?=?5250*3;
	u32?temp;
	
?	while((RTC_WaitSynchro()?==?FALSE)?&&?(retry!=0))	//等待同步??	?
	{
		nop;nop;nop;nop;nop;nop;
		retry?--;
	}
	if(retry==0)?return?FALSE;	?
	temp=RTC->DR;
	*year=RTC_BCDtoDEC((temp>>16)&0XFF)+2000;
	*month=RTC_BCDtoDEC((temp>>8)&0X1F);
	*date=RTC_BCDtoDEC(temp&0X3F);
	*week=(temp>>13)&0X07;?
	
	return?TRUE;
}


/*************************************************************************************************************************
*?函數(shù)			:	bool?RTC_Get(void)
*?功能			:	更新RTC時間
*?參數(shù)			:	無
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時間			:	2017-07-01
*?最后修改時間?	:?	2017-07-01
*?說明			:?	APB時鐘必須大于RTC時鐘7倍,通常會遠大于,一般APB少說也得1MHZ以上
					時間寫入到了全局緩沖區(qū)?timer?中
*************************************************************************************************************************/
bool?RTC_Get(void)
{
	u32?temp;
	u32?retry?=?5250*3;
	u8?ampm;
	
?	while((RTC_WaitSynchro()?==?FALSE)?&&?(retry!=0))	//等待同步??	?
	{
		nop;nop;nop;nop;nop;nop;
		retry?--;
	}
	if(retry==0)?return?FALSE;
	//獲取日期
	temp=RTC->DR;
	g_timer.year=RTC_BCDtoDEC((temp>>16)&0XFF)+2000;
	g_timer.month=RTC_BCDtoDEC((temp>>8)&0X1F);
	g_timer.date=RTC_BCDtoDEC(temp&0X3F);
	g_timer.week=(temp>>13)&0X07;?
	//獲取時間
	temp=RTC->TR;
	g_timer.hour=RTC_BCDtoDEC((temp>>16)&0X3F);
	g_timer.min=RTC_BCDtoDEC((temp>>8)&0X7F);
	g_timer.sec=RTC_BCDtoDEC(temp&0X7F);
	
	ampm=temp>>22;?
	if(ampm!=0)	//使用的是12小時制,并且是下午,則小時加上12小時
	{
		g_timer.hour?+=?12;
	}
	
	return?TRUE;
}


/*************************************************************************************************************************
*?函數(shù)			:	bool?RTC_SetWakeUp(bool?isEnableInt,?u16?WakeSecs)
*?功能			:	RTC喚醒中斷設(shè)置
*?參數(shù)			:	isEnableInt:是否開啟喚醒中斷;WakeSecs:喚醒周期,單位秒
*?返回			:	TRUE:開啟成功;FALSE:開啟失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時間			:	2017-07-02
*?最后修改時間?	:?	2017-07-02
*?說明			:?	
*************************************************************************************************************************/
bool?RTC_SetWakeUp(bool?isEnableInt,?u16?WakeSecs)
{
	u32?temp?=?RTC->CR;
	u32?retry?=?500;
	
	//關(guān)閉RTC寄存器寫保護
	RTC->WPR=0xCA;
	RTC->WPR=0x53;?
	if(WakeSecs==0)?WakeSecs?=?1;		//最少1秒	
	temp?|=?1<<10;						//喚醒定時器使能	
	if(isEnableInt)	//需要開啟喚醒中斷
	{			
		temp?|=?1<<14;					//使能喚醒定時器中斷	
		SYS_EXTI_SetEdge(EXTI_RTC_WAKE_UP,?EXTI_POS_EDGE);	//設(shè)置RTC喚醒中斷上升沿觸發(fā)
		SYS_EXTI_IntEnable(EXTI_RTC_WAKE_UP,?TRUE);			//RTC喚醒中斷EXTI開關(guān)
		SYS_EXTI_ClearInt(EXTI_RTC_WAKE_UP);				//清除中斷標記
		SYS_NVIC_IntEnable(IRQ_RTC_WKUP,?TRUE);				//RTC喚醒中斷?NVIC全局中斷使能
	}
	else
	{	
		temp?&=?~(1<ISR?&=?~(1<WUTR?!=?(WakeSecs-1))
	{
		//在?RTC_CR?寄存器中的?WUTE?位置?0?后,當喚醒定時器值可更改時,由硬件將該位置?1。
		//僅當?RTC_ISR?中的?WUTWF?置?1?時才可對該寄存器執(zhí)行寫操作。
		RTC->CR?&=?~(1<ISR?&?(1?<<?2))?==?0)?&&?retry)
		{
			Delay_US(1);
			retry?--;
		}
		if(retry==0)
		{
			uart_printf("設(shè)置RTC喚醒定時器失敗!");
			return?FALSE;
		}
		
		RTC->WUTR?=?WakeSecs-1;				//重新設(shè)置喚醒自動重載值
	}
	
	RTC->CR?=?temp;						//設(shè)置配置寄存器
	
	RTC->WPR=0xFF;						//開啟寫保護
	
	return?TRUE;
}

/*************************************************************************************************************************
*?函數(shù)			:	bool?RTC_Init(bool?SerIntEnable)
*?功能			:	RTC初始化
*?參數(shù)			:	SerIntEnable:TRUE:開啟秒中斷;FALSE:關(guān)閉秒中斷
*?返回			:	TRUE:成功,FALSE:失敗
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時間			:	2017-07-01
*?最后修改時間?	:?	2017-07-01
*?說明			:?	使用備份區(qū)0存放標志來區(qū)別是否進行過初始化?RTC->BKP0R=0x5A5AA5A5
*************************************************************************************************************************/
bool?RTC_Init(bool?SerIntEnable)
{
	u32?retry=0XFFFFFFF;?
	
	RCC->APB1ENR|=1<CR|=1<BKP0R?!=?0x5A5AA5A5)	//沒有進行過配置
	{
		info_printf("RTC沒有初始化,開始初始化...rn");
		RCC->BDCR|=1<BDCR&0X02)==0))//等待LSE準備好
		{
			retry--;
			nop;nop;nop;
		}
		if(retry==0)
		{
			info_printf("RTC時鐘初始化失敗了!rn");
			return?FALSE;		//LSE?開啟失敗.
		}
			?
		RCC->BDCR|=1<BDCR|=1<WPR=0xCA;
		RTC->WPR=0x53;?
		if(RTC_InitMode()?==?FALSE)//進入RTC初始化模式
		{
			info_printf("RTC進入初始化模式失敗了!rn");
			return?FALSE;			
		}
		//將32768?進行128x256分頻?得到1秒的?ck_spre頻率,用于產(chǎn)生秒喚醒中斷
		RTC->PRER=255;				//RTC同步分頻系數(shù)(0~7FFF),必須先設(shè)置同步分頻,再設(shè)置異步分頻,Frtc=Fclks/((Sprec+1)*(Asprec+1))
		RTC->PRER|=127<CR&=~(1<ISR&=~(1<WPR=0xFF;				//使能RTC寄存器寫保護??
		RTC_SetTime(6,6,6);			//設(shè)置初始時間
		RTC_SetDate(2017,6,6);		//設(shè)置初始日期
		RTC->BKP0R?=?0x5A5AA5A5;	//寫入備份區(qū)標記,標示已經(jīng)初始化過RTC
		
		
		info_printf("初始化RTC成功!rn");
		
		//RTC_Set_AlarmA(7,0,0,10);	//設(shè)置鬧鐘時間
	}?
	//RTC_Set_WakeUp(4,0);			
	if(RTC_Get()==FALSE)			//更新一次時間
	{
		info_printf("初始獲取時間失敗!rn");
	}
	RTC_SetWakeUp(SerIntEnable,?1);//配置WAKE?UP中斷,1秒鐘中斷一次?
	
	return?TRUE;
}

//設(shè)置秒中斷回調(diào)函數(shù)
void?RTC_SetWkupCallBack(void?(*pCallBack)(void))
{
	RTC_SerIntCallBack?=?pCallBack;
}


//RTC鬧鐘中斷服務(wù)函數(shù)
void?RTC_Alarm_IRQHandler(void)
{????
	if(RTC->ISR&(1<ISR&=~(1<PR|=1<ISR&(1<ISR&=~(1<19)yearL+=100;
	//?所過閏年數(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
u32?RTC_DECtoBCD(?u8?DEC)?
{
	return?((u8)(DEC/10)<>4)*10+(BCD&0x0f);
}







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

const?SYS_CMD_TYPE??CMD_GET_TIME		=	{"TIME?",?CMD_GetTime,?"tt獲取系統(tǒng)時間",?TRUE};
const?SYS_CMD_TYPE??CMD_GET_DATE		=	{"DATE?",?CMD_GetDate,?"tt獲取系統(tǒng)日期",?TRUE};
const?SYS_CMD_TYPE??CMD_SET_TIME		=	{"TIME=",?CMD_SetTime,?"tt設(shè)置系統(tǒng)時間?如(12:32:54):TIME=12?32?54",?TRUE};
const?SYS_CMD_TYPE??CMD_SET_DATE		=	{"DATE=",?CMD_SetDate,?"tt設(shè)置系統(tǒng)日期?如(2014?6?8):TIME=2014?6?8",?TRUE};

//獲取時間
void?CMD_GetTime(SYS_CMD_HANDLE?*pHandle,char?*pStr)
{
	RTC_Get();		//更新時間
	pHandle->DataPrintf("[獲取時間成功]:%02d:%02d:%02drn",g_timer.hour,?g_timer.min,?g_timer.sec);
}

//獲取日期
void?CMD_GetDate(SYS_CMD_HANDLE?*pHandle,char?*pStr)
{
	RTC_Get();		//更新時間
	pHandle->DataPrintf("[獲取日期成功]:%04d-%02d-%02drn",g_timer.year,?g_timer.month,?g_timer.date);
}

//設(shè)置時間
void?CMD_SetTime(SYS_CMD_HANDLE?*pHandle,char?*pStr)
{
	u8?hour,min,sec;
	u8?len;
	char?*p;
	u8?num;
	
	len?=?strlen(pStr);	//獲取長度
	if(isStrNumAndSpc(pStr,?len,?2)?==?FALSE)
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	//小時
	p?=?strstr(pStr,"?");	//搜索空格
	if(p?==?NULL)
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	num?=?p?-?pStr;
	if((num?>?2)?||?(num?==?0))
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	hour?=?SYS_CMD_StringToDec(pStr,?num);
	if(hour>23)
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	
	//分鐘
	pStr?=?p+1;
	p?=?strstr(pStr,"?");	//搜索空格
	if(p?==?NULL)
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	num?=?p?-?pStr;
	if((num?>?2)?||?(num?==?0))
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	min?=?SYS_CMD_StringToDec(pStr,?num);
	if(min>59)
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	//秒鐘
	pStr?=?p+1;
	num?=?strlen(pStr);
	if((num?>?2)?||?(num?==?0))
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	sec?=?SYS_CMD_StringToDec(pStr,?num);
	if(sec>59)
	{
		pHandle->DataPrintf("[時間設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	
	if(RTC_SetTime(hour,?min,?sec)?==?FALSE)
	{
		RTC_Get();		//更新時間
		pHandle->DataPrintf("[時間設(shè)置失敗]:%02d:%02d:%02drn",g_timer.hour,?g_timer.min,?g_timer.sec);
	}
	else
	{
		RTC_Get();		//更新時間
		pHandle->DataPrintf("[時間設(shè)置成功]:%02d:%02d:%02drn",g_timer.hour,?g_timer.min,?g_timer.sec);
	}
	
}?


//設(shè)置日期
void?CMD_SetDate(SYS_CMD_HANDLE?*pHandle,char?*pStr)
{
	u16?year;
	u8?month,?date;
	u8?len;
	char?*p;
	u8?num;
	
	len?=?strlen(pStr);	//獲取長度
	if(isStrNumAndSpc(pStr,?len,?2)?==?FALSE)
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	//年
	p?=?strstr(pStr,"?");	//搜索空格
	if(p?==?NULL)
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	num?=?p?-?pStr;
	if((num?>?4)?||?(num?==?0))
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	year?=?SYS_CMD_StringToDec(pStr,?num);
	if(year>9999)
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	
	//月
	pStr?=?p+1;
	p?=?strstr(pStr,"?");	//搜索空格
	if(p?==?NULL)
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	num?=?p?-?pStr;
	if((num?>?2)?||?(num?==?0))
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	month?=?SYS_CMD_StringToDec(pStr,?num);
	if(month>12)
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	//日
	pStr?=?p+1;
	num?=?strlen(pStr);
	if((num?>?2)?||?(num?==?0))
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	date?=?SYS_CMD_StringToDec(pStr,?num);
	if(date>31)
	{
		pHandle->DataPrintf("[日期設(shè)置錯誤]:格式不對或非法參數(shù)!rn");
		return;
	}
	

	if(RTC_SetDate(year,?month,?date)?==?FALSE)
	{
		RTC_Get();		//更新時間
		pHandle->DataPrintf("[日期設(shè)置失敗]:%04d-%02d-%02drn",g_timer.year,?g_timer.month,?g_timer.date);
	}
	else
	{
		RTC_Get();		//更新時間
		pHandle->DataPrintf("[日期設(shè)置成功]:%04d-%02d-%02drn",g_timer.year,?g_timer.month,?g_timer.date);
	}
	
}?


#endif?//SYS_CMD_EN_


/*************************************************************************************************************
?*?文件名		:	RTC.h
?*?功能			:	STM32F4?RTC驅(qū)動
?*?作者			:	cp1300@139.com
?*?創(chuàng)建時間		:	2017-07-01
?*?最后修改時間	:	2017-07-01
?*?詳細:			要正確讀取?RTC?日歷寄存器(RTC_SSR、RTC_TR?和?RTC_DR),APB1?時鐘頻率?(fPCLK1)?必須等于或大于?fRTCCLK?RTC?時鐘頻率的七倍。這可以確保同步機制行為的安全性。
					如果?APB1?時鐘頻率低于?RTC?時鐘頻率的七倍,則軟件必須分兩次讀取日歷時間寄存器和?日期寄存器。這樣,當兩次讀取的?RTC_TR?結(jié)果相同時,才能確保數(shù)據(jù)正確。
					否則必須執(zhí)?行第三次讀訪問。任何情況下,APB1?的時鐘頻率都不能低于?RTC?的時鐘頻率。
					RTC->BKP0R:用于標示是否進行了初始化RTC,請不要再使用了。
*************************************************************************************************************/
#ifndef?__RTC_H_
#define?__RTC_H_
#include?"system.h"?


//時間結(jié)構(gòu)體
typedef??struct?
{
	u8	hour;?		//小時
	u8	min;	?	//分鐘
	u8	sec;		//秒			
	u8??month;		//月
	u8??date;		//日
	u8??week;		//星期
	u16?year;	?	//年
}tm;
extern?volatile?tm?g_timer;



//函數(shù)接口
bool?RTC_SetTime(u8?hour,u8?min,u8?sec);	//RTC時間設(shè)置
bool?RTC_SetDate(u16?year,u8?month,u8?date);//RTC日期設(shè)置
bool?RTC_GetTime(u8?*hour,u8?*min,u8?*sec);	//獲取RTC時間
bool?RTC_GetDate(u16?*year,u8?*month,u8?*date,u8?*week);//獲取RTC日期
bool?RTC_Get(void);							//更新RTC時間
bool?RTC_Init(bool?SerIntEnable);			//RTC初始化
bool?RTC_SetWakeUp(bool?isEnableInt,?u16?WakeSecs);	//RTC喚醒中斷設(shè)置
void?RTC_SetWkupCallBack(void?(*pCallBack)(void));//設(shè)置秒中斷回調(diào)函數(shù)



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

extern?const?SYS_CMD_TYPE??CMD_GET_TIME;
extern?const?SYS_CMD_TYPE??CMD_GET_DATE;
extern?const?SYS_CMD_TYPE??CMD_SET_TIME;
extern?const?SYS_CMD_TYPE??CMD_SET_DATE;


//獲取時間
void?CMD_GetTime(SYS_CMD_HANDLE?*pHandle,char?*pStr);
//獲取日期
void?CMD_GetDate(SYS_CMD_HANDLE?*pHandle,char?*pStr);
//設(shè)置時間
void?CMD_SetTime(SYS_CMD_HANDLE?*pHandle,char?*pStr);
//設(shè)置日期
void?CMD_SetDate(SYS_CMD_HANDLE?*pHandle,char?*pStr);

#endif?//SYS_CMD_EN_




#endif?//__RTC_H_


使用時需要一個秒中斷回調(diào)函數(shù),比如我的秒中斷是用來喚醒一個線程,處理秒任務(wù)


RTC_Init(TRUE);




//任務(wù)2:負責(zé)后臺(RTC?1秒喚醒一次)
void?TaskBack(void?*pdata)
{
	RTC_SetWkupCallBack(RTC_WkupCallBack);					//設(shè)置RTC回調(diào)函數(shù)
	
	while(1)
	{
		RTC_Get();											//更新系統(tǒng)時間
		uart_printf("%04d-%02d-%02d?%02d:%02d:%02drn",g_timer.year,g_timer.month,g_timer.date,g_timer.hour,g_timer.min,g_timer.sec);
		OSTimeDlyHMSM(0,0,0,100);
		IWDG_Feed();

		OSTaskSuspend(BACK_TASK_Prio);						//掛起后臺進程
	}
}
//RTC秒中斷回調(diào)函數(shù)
void?RTC_WkupCallBack(void)
{
	OSTaskResume(BACK_TASK_Prio);						//喚醒后臺進程
}




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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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