(2)創(chuàng)建rtc.c文件并輸入以下代碼。
#include "rtc.h"
/***************************************************
Name :RTC_Init
Fuction :RTC初始化
Parameter :None
Return :None
***************************************************/
void RTC_Init()
{
if( BKP->DR1!=0x5050 )
{
RCC->APB1ENR |= 1<<28 ; //使能PWR時(shí)鐘
RCC->APB1ENR |= 1<<27 ; //使能BKP時(shí)鐘,RTC校準(zhǔn)在BKP相關(guān)寄存器中
PWR->CR |= 1<<8 ; //取消BKP相關(guān)寄存器寫(xiě)保護(hù)
RCC->BDCR |= 1<<16 ; //備份區(qū)域軟復(fù)位
RCC->BDCR &= ~( 1<<16 ) ; //備份區(qū)域軟復(fù)位結(jié)束
RCC->BDCR |= 1<<0 ; //開(kāi)啟外部低速振蕩器
while( ( RCC->BDCR&0x02 )!=0x02 ) ; //等待外部時(shí)鐘就緒
RCC->BDCR |= 1<<8 ; //LSI作為RTC時(shí)鐘
RCC->BDCR |= 1<<15 ; //RTC時(shí)鐘使能
while( !( RTC->CRL&( 1<<5 ) ) ) ; //等待RTC寄存器最后一次操作完成
while( !( RTC->CRL&( 1<<3 ) ) ) ; //等待RTC寄存器同步完成
RTC->CRH &= ~( 7<<0 ) ; //不允許中斷,CRH寄存器低三位有效
while( !( RTC->CRL&( 1<<5 ) ) ) ; //等待RTC寄存器最后一次操作完成
RTC->CRL |= 1<<4 ; //進(jìn)入配置模式
RTC->PRLH = 0 ;
RTC->PRLL = 32767 ; //設(shè)定分頻值
RTC->CRL &= ~( 1<<4 ) ; //退出配置模式
while( !( RTC->CRL&( 1<<5 ) ) ) ; //等待RTC寄存器最后一次操作完成
BKP->DR1 = 0x5050 ;
}
else
{
while( !( RTC->CRL&( 1<<3 ) ) ) ; //等待RTC寄存器同步
while( !( RTC->CRL&( 1<<5 ) ) ) ; //等待RTC寄存器操作完成
}
}
/***************************************************
Name :Is_Leap_Year
Function :閏年判定
Parameter :
year:年份
Return :閏年
***************************************************/
u8 Is_Leap_Year( u16 year )
{
//必須能被4整除
if( year%4==0 )
{
if( year%100==0 )
{
if( year%400==0 )
return 1 ;
else
return 0 ;
}
else
return 1 ;
}
else
return 0;
}
/***************************************************
Name :RTC_Set_Time
Fuction :設(shè)置時(shí)間
Parameter :
year:年
month:月
date:日
hour:時(shí)
minute:分
second:秒
Return :None
***************************************************/
u8 mon_table[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } ;
void RTC_Set_Time( u8 year, u8 month, u8 date, u8 hour, u8 minute, u8 second )
{
u16 t ;
u32 seccount = 0 ;
//把所有年份的秒鐘相加
for( t=1970; t2000; t++ )
{
if( Is_Leap_Year( t ) )
seccount += 31622400 ; //閏年的秒鐘數(shù)
else
seccount += 31536000 ; //平年的秒鐘數(shù)
}
month -= 1 ;
for( t=0; t//把前面月份的秒鐘數(shù)相加
{
seccount += ( u32 )mon_table[ t ]*86400 ; //月份秒鐘數(shù)相加
if( Is_Leap_Year( year+2000 )&&( t==1 ) )
seccount += 86400 ; //閏年2月份增加一天的秒鐘數(shù)
}
seccount += ( date-1 )*86400 ; //把前面日期的秒鐘數(shù)相加
seccount += hour*3600 ; //小時(shí)秒鐘數(shù)
seccount += minute*60 ; //分鐘秒鐘數(shù)
seccount += second ; //最后的秒鐘加上去
//設(shè)置時(shí)鐘
RCC->APB1ENR |= 1<<28 ; //使能電源時(shí)鐘
RCC->APB1ENR |= 1<<27 ; //使能備份時(shí)鐘
PWR->CR |= 1<<8 ; //取消備份區(qū)寫(xiě)保護(hù)
RTC->CRL |= 1<<4 ; //允許配置
RTC->CNTL = seccount&0xFFFF ;
RTC->CNTH = seccount>>16 ;
RTC->CRL &= ~( 1<<4 ) ; //配置更新
while( ( RTC->CRL&0x20 )!=0x20 ) ; //等待RTC寄存器操作完成
RTC_Get_Time() ; //設(shè)置完之后更新一下數(shù)據(jù)
}
/***************************************************
Name :RTC_Get_Time
Fuction :獲取時(shí)間
Parameter :None
Return :None
***************************************************/
RTC_Data RTC_Time;
void RTC_Get_Time()
{
u16 daycnt=0;
u32 timecount=0;
u32 temp=0;
u16 temp1=0;
//得到計(jì)數(shù)器中的值
timecount = RTC->CNTH ;
timecount <<= 16 ;
timecount += RTC->CNTL ;
//得到天數(shù)
temp = timecount/86400 ;
//超過(guò)一天了
if( daycnt!=temp )
{
daycnt = temp ;
temp1 = 1970 ; //從1970年開(kāi)始
while( temp>=365 )
{
//閏年
if( Is_Leap_Year( temp1 ) )
{
if( temp>=366 )
temp -= 366 ; //閏年的秒鐘數(shù)
else
break ;
}
else
temp -= 365; //平年
temp1 ++ ;
}
RTC_Time.year = temp1-2000 ; //得到年份
temp1 = 0 ;
//超過(guò)了一個(gè)月
while( temp>=28 )
{
if( Is_Leap_Year( RTC_Time.year+2000 )&&( temp1==1 ) )//當(dāng)年是不是閏年/2月份
{
if( temp>=29 )
temp -= 29 ;//閏年的秒鐘數(shù)
else
break;
}
else
{
if( temp>=mon_table[ temp1 ] )
temp -= mon_table[ temp1 ] ; //平年
else
break ;
}
temp1 ++ ;
}
RTC_Time.month = temp1+1 ; //得到月份
RTC_Time.date = temp+1 ; //得到日期
}
temp = timecount%86400 ; //得到秒鐘數(shù)
RTC_Time.hour = temp/3600 ; //小時(shí)
RTC_Time.minute = ( temp%3600 )/60 ; //分鐘
RTC_Time.second = ( temp%3600 )%60 ; //秒鐘
}
(3)創(chuàng)建1.c文件并輸入以下代碼。
#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "lcd.h"
#include "rtc.h"
int main()
{
u8 Str[ 50 ] ;
STM32_Clock_Init( 9 ) ; //STM32時(shí)鐘初始化
SysTick_Init( 72 ) ; //SysTick初始化
USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200
LCD_Init() ; //LCD初始化
RTC_Init() ;
RTC_Set_Time( 20, 12, 10, 10, 8, 0 ) ;
while( 1 )
{
RTC_Get_Time() ;
sprintf( ( char * )Str, "20%02d-%02d-%02d %02d:%02d:%02d", RTC_Time.year, RTC_Time.month, RTC_Time.date, RTC_Time.hour, RTC_Time.minute, RTC_Time.second ) ;
LCD_ShowString( 10, 10, Str ) ;
delay_ms( 500 ) ;
}
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
電源
+關(guān)注
關(guān)注
184文章
17426瀏覽量
248868 -
晶體振蕩器
+關(guān)注
關(guān)注
9文章
611瀏覽量
28990 -
時(shí)鐘芯片
+關(guān)注
關(guān)注
2文章
242瀏覽量
39791 -
RTC
+關(guān)注
關(guān)注
2文章
519瀏覽量
66151
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
STM32學(xué)習(xí)筆記(初學(xué)者快速入門(mén))
STM32學(xué)習(xí)筆記(初學(xué)者快速入門(mén))資料來(lái)自網(wǎng)絡(luò)資源
發(fā)表于 06-11 20:23
STM32RTC實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)講解,從入門(mén)到放棄 精選資料分享
STM32RTC實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)講解,從入門(mén)到放棄。文章目錄STM32RTC實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)講解,從入門(mén)
發(fā)表于 08-03 06:38
Stm32之RTC時(shí)鐘
Stm32之RTC時(shí)鐘1.時(shí)鐘框圖:先將之前沒(méi)做筆記的時(shí)候的時(shí)間框架圖補(bǔ)上:同樣源自正點(diǎn)原子的PPT,圖中紅框的部分為RTC的時(shí)鐘源,有三種
發(fā)表于 08-11 07:04
CubeMX入門(mén)STM32 HAL庫(kù)的學(xué)習(xí)筆記
STM32CubeMX是ST官方開(kāi)發(fā)的一款很好用的軟件,主要用于STM32系列單片機(jī)的硬件驅(qū)動(dòng)層的配置。網(wǎng)上也有一些關(guān)于STM32CubeMX的相關(guān)教程,對(duì)它的相關(guān)操作進(jìn)行說(shuō)明。從今天起,小柯希望能將自己從CubeMX
發(fā)表于 08-17 06:55
STM32入門(mén)學(xué)習(xí)筆記 精選資料分享
STM32入門(mén)學(xué)習(xí)筆記本文為筆者入門(mén)學(xué)習(xí)過(guò)程的記錄,只是零散的記錄了一些個(gè)人不太懂得,覺(jué)得需要經(jīng)
發(fā)表于 08-24 07:56
STM32各模塊學(xué)習(xí)筆記
STM32個(gè)模塊學(xué)習(xí)筆記 目錄 STM32筆記之一 中斷優(yōu)先級(jí).......................................
發(fā)表于 11-30 03:32
?3120次閱讀
STM32學(xué)習(xí)筆記1——軟硬件基礎(chǔ)之keil5編程與GPIO開(kāi)發(fā)
STM32學(xué)習(xí)筆記1——軟硬件基礎(chǔ)之keil5編程與GPIO開(kāi)發(fā)
發(fā)表于 11-30 12:36
?4次下載
STM32學(xué)習(xí)之STM32cubeMX軟件安裝與使用(附STM32cubeMX5.2.1下載地址)
STM32學(xué)習(xí)之STM32cubeMX軟件安裝與使用(附STM32cubeMX5.2.1下載地址
發(fā)表于 12-07 11:51
?28次下載
STM32內(nèi)部RTC時(shí)鐘脈沖實(shí)驗(yàn)參考程序
STM32內(nèi)部RTC時(shí)鐘脈沖實(shí)驗(yàn)參考程序
發(fā)表于 12-30 10:45
?13次下載
STM32學(xué)習(xí)筆記:跑馬燈實(shí)驗(yàn)
跑馬燈實(shí)驗(yàn)放寒假了,最近在學(xué)習(xí)STM32所以想寫(xiě)寫(xiě)一些筆記,剛剛好也能和大家分享一下學(xué)習(xí)心得體會(huì),希望能夠?qū)臀乙粯釉?/div>
發(fā)表于 01-17 10:57
?2次下載
STM32入門(mén)學(xué)習(xí)筆記之基礎(chǔ)定時(shí)器實(shí)驗(yàn)(下)
STM32內(nèi)部共有8個(gè)定時(shí)器,其中Timer1和Timer8屬于高級(jí)定時(shí)器,Timer2~Timer5屬于通用定時(shí)器,8個(gè)定時(shí)器的資源獨(dú)立,互不影響。
STM32入門(mén)學(xué)習(xí)筆記之RTC實(shí)驗(yàn)(上)
實(shí)時(shí)時(shí)鐘Real TimeClock(簡(jiǎn)稱RTC),實(shí)時(shí)時(shí)鐘芯片是日常生活中應(yīng)用最為廣泛的消費(fèi)類(lèi)電子產(chǎn)品之一。它為人們提供精確的實(shí)時(shí)時(shí)間,或者為電子系統(tǒng)提供精確的時(shí)間基準(zhǔn),目前實(shí)時(shí)時(shí)鐘芯片大多采用精度較高的晶體振蕩器作為時(shí)鐘源。有些時(shí)鐘芯片為了在主電源掉電時(shí),還可以工作,需要外加電池供電。
STM32學(xué)習(xí)筆記之RTC實(shí)時(shí)時(shí)鐘1
STM32 的實(shí)時(shí)時(shí)鐘(RTC)是一個(gè)獨(dú)立的定時(shí)器。 STM32 的 RTC 模塊擁有一組連續(xù)計(jì)數(shù)的計(jì)數(shù)器,在相應(yīng)軟件配置下,可提供時(shí)鐘日歷
STM32學(xué)習(xí)筆記之RTC實(shí)時(shí)時(shí)鐘2
STM32 的實(shí)時(shí)時(shí)鐘(RTC)是一個(gè)獨(dú)立的定時(shí)器。 STM32 的 RTC 模塊擁有一組連續(xù)計(jì)數(shù)的計(jì)數(shù)器,在相應(yīng)軟件配置下,可提供時(shí)鐘日歷
評(píng)論