本文引用地址:http://m.butianyuan.cn/article/201611/322893.htm//通過該例程,學(xué)會RTC的配置和讀取計數(shù)值,數(shù)值格式的轉(zhuǎn)換的方法,要想控制好的話,要多看資料,多看程序
#include"stm32f10x_lib.h"
vu32TimeDisplay=0;
ErrorStatusHSEStartUpStatus;
u32THH=0,TMM=0,TSS=0;
unsignedintjj=0;
unsignedintLedNumVal=0,LedNumVal1=0;//變量定義
//此表為LED的字模,共陰數(shù)碼管0-9-
unsignedcharDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段碼控制
//此表為8個數(shù)碼管位選控制,共陰數(shù)碼管1-8個-
unsignedchardispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//位選控制查表的方法控制
unsignedintLedOut[10];//變量定義
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidUSART_Configuration(void);
voidRTC_Configuration(void);
voidNVIC_Configuration(void);
u32Time_Regulate(void);
voidTime_Adjust(void);
voidTime_Show(void);
voidTime_Display(u32TimeVar);
voidDelay(vu32nCount);
intmain(void)
{
#ifdefDEBUG
debug();
#endif
RCC_Configuration();//系統(tǒng)時鐘配置函數(shù)
NVIC_Configuration();//NVIC配置函數(shù)
GPIO_Configuration();//配置GPIO
//從指定的后備寄存器中讀取數(shù)據(jù),參數(shù)用來選擇后備寄存器,可以是BKP_DR1~BKP_DR1010個后備寄存器
if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)//???為什么要檢測0xA5A5
{
//配置RTC
RTC_Configuration();
Time_Adjust();
BKP_WriteBackupRegister(BKP_DR1,0xA5A5);//向指定的后備寄存器中寫入用戶程序數(shù)據(jù)這里是向BKP_DR1中寫入0xA5A5
}
else
{
if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!=RESET)//檢查指定的RCC標(biāo)志位設(shè)置與否,這里檢查POR/PDR復(fù)位
//{
RTC_WaitForSynchro();//等待最近一次對RTC寄存器的寫操作完成,也即等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能或失能指定的RTC中斷第一個參數(shù)指定待配置的RTC中斷源,可以是RTC_IT_SEC:秒中斷
//RTC_IT_OW:溢出中斷,RTC_IT_ALR:鬧鐘中斷。第二個參數(shù)可以是ENABLE或DISABLE
RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成
}
#ifdefRTCClockOutput_Enable
//使能或失能APB1外設(shè)時鐘具體說明詳見《STM32函數(shù)說明》P208
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);//使能或失能RTC和后備寄存器訪問
//該函數(shù)使能或失能管腳的侵入檢測功能這里是失能
BKP_TamperPinCmd(DISABLE);
//調(diào)用該函數(shù)前必須先失能管腳的侵入檢測功能
BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);//選擇在侵入檢測管腳上輸出的RTC時鐘源
//參數(shù)指定RTC輸出時鐘源,可以是:BKP_RTCOutputSource_CalibClock:侵入檢測管腳上輸出,其時鐘頻率為RTC時鐘除以64
//BKP_RTCOutputSource_None:侵入檢測管腳上無RTC輸出,BKP_RTCOutputSource_Alarm:侵入檢測管腳上輸出RTC鬧鐘脈沖
//BKP_RTCOutputSource_Second:侵入檢測管腳上輸出RTC秒脈沖
#endif
//清除復(fù)位標(biāo)志
RCC_ClearFlag();
while(1)
{unsignedinti;
//if(++jj>=0x01ff)
//{LedNumVal1++;
//jj=0;
//}
//得到時間并顯示RTC_GetCounter():獲得RTC計數(shù)器的值返回值是u32類型的RTC計數(shù)器的值
Time_Display(RTC_GetCounter());
LedOut[0]=Disp_Tab[THH0/10];//時
LedOut[1]=Disp_Tab[THH];
LedOut[2]=~0XBF;//橫線
LedOut[3]=Disp_Tab[TMM0/10];//分
LedOut[4]=Disp_Tab[TMM];
LedOut[5]=~0XBF;//橫線
LedOut[6]=Disp_Tab[TSS0/10];//十位秒
LedOut[7]=Disp_Tab[TSS];//個位
for(i=0;i<8;i++)
{
//BSRR:端口位設(shè)置/復(fù)位寄存器,詳細(xì)的GPIO寄存器結(jié)構(gòu)體說明見《STM32函數(shù)說明》P120
GPIOB->BSRR=LedOut[i]<<8&0xFF00;
GPIOB->BRR=(~(LedOut[i]<<8))&0xFF00;//BRR:端口位復(fù)位寄存器
GPIOB->BSRR=dispbit[i]&0x00FF;//使用查表法進(jìn)行位選
GPIOB->BRR=(~dispbit[i])&0x00FF;
Delay(0x000ff);//掃描間隔時間
}
}//while
}
voidDelay(vu32nCount)
{
for(;nCount!=0;nCount--);
}
voidRCC_Configuration(void)
{
//復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值
RCC_DeInit();
//打開外部高速晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速時鐘準(zhǔn)備好
HSEStartUpStatus=RCC_WaitForHSEStartUp();
評論