新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32學(xué)習(xí)筆記——實(shí)時(shí)時(shí)鐘RTC

STM32學(xué)習(xí)筆記——實(shí)時(shí)時(shí)鐘RTC

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/201611/322893.htm

//通過(guò)該例程,學(xué)會(huì)RTC的配置和讀取計(jì)數(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個(gè)數(shù)碼管位選控制,共陰數(shù)碼管1-8個(gè)-

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í)鐘配置函數(shù)

NVIC_Configuration();//NVIC配置函數(shù)

GPIO_Configuration();//配置GPIO

//從指定的后備寄存器中讀取數(shù)據(jù),參數(shù)用來(lái)選擇后備寄存器,可以是BKP_DR1~BKP_DR1010個(gè)后備寄存器

if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)//???為什么要檢測(cè)0xA5A5

{

//配置RTC

RTC_Configuration();

Time_Adjust();

BKP_WriteBackupRegister(BKP_DR1,0xA5A5);//向指定的后備寄存器中寫(xiě)入用戶(hù)程序數(shù)據(jù)這里是向BKP_DR1中寫(xiě)入0xA5A5

}

else

{

if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!=RESET)//檢查指定的RCC標(biāo)志位設(shè)置與否,這里檢查POR/PDR復(fù)位

//{

RTC_WaitForSynchro();//等待最近一次對(duì)RTC寄存器的寫(xiě)操作完成,也即等待RTC寄存器同步

RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能或失能指定的RTC中斷第一個(gè)參數(shù)指定待配置的RTC中斷源,可以是RTC_IT_SEC:秒中斷

//RTC_IT_OW:溢出中斷,RTC_IT_ALR:鬧鐘中斷。第二個(gè)參數(shù)可以是ENABLE或DISABLE

RTC_WaitForLastTask();//等待最近一次對(duì)RTC寄存器的寫(xiě)操作完成

}

#ifdefRTCClockOutput_Enable

//使能或失能APB1外設(shè)時(shí)鐘具體說(shuō)明詳見(jiàn)《STM32函數(shù)說(shuō)明》P208

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);

PWR_BackupAccessCmd(ENABLE);//使能或失能RTC和后備寄存器訪問(wèn)

//該函數(shù)使能或失能管腳的侵入檢測(cè)功能這里是失能

BKP_TamperPinCmd(DISABLE);

//調(diào)用該函數(shù)前必須先失能管腳的侵入檢測(cè)功能

BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);//選擇在侵入檢測(cè)管腳上輸出的RTC時(shí)鐘源

//參數(shù)指定RTC輸出時(shí)鐘源,可以是:BKP_RTCOutputSource_CalibClock:侵入檢測(cè)管腳上輸出,其時(shí)鐘頻率為RTC時(shí)鐘除以64

//BKP_RTCOutputSource_None:侵入檢測(cè)管腳上無(wú)RTC輸出,BKP_RTCOutputSource_Alarm:侵入檢測(cè)管腳上輸出RTC鬧鐘脈沖

//BKP_RTCOutputSource_Second:侵入檢測(cè)管腳上輸出RTC秒脈沖

#endif

//清除復(fù)位標(biāo)志

RCC_ClearFlag();

while(1)

{unsignedinti;

//if(++jj>=0x01ff)

//{LedNumVal1++;

//jj=0;

//}

//得到時(shí)間并顯示RTC_GetCounter():獲得RTC計(jì)數(shù)器的值返回值是u32類(lèi)型的RTC計(jì)數(shù)器的值

Time_Display(RTC_GetCounter());

LedOut[0]=Disp_Tab[THH0/10];//時(shí)

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];//個(gè)位

for(i=0;i<8;i++)

{

//BSRR:端口位設(shè)置/復(fù)位寄存器,詳細(xì)的GPIO寄存器結(jié)構(gòu)體說(shuō)明見(jiàn)《STM32函數(shù)說(shuō)明》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);//掃描間隔時(shí)間

}

}//while

}

voidDelay(vu32nCount)

{

for(;nCount!=0;nCount--);

}

voidRCC_Configuration(void)

{

//復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值

RCC_DeInit();

//打開(kāi)外部高速晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速時(shí)鐘準(zhǔn)備好

HSEStartUpStatus=RCC_WaitForHSEStartUp();


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉