衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32入門學習筆記之RTC實驗(下)

jf_78858299 ? 來源:滑小稽筆記 ? 作者:電子技術園地 ? 2023-02-16 11:22 ? 次閱讀

(2)創建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時鐘
    RCC->APB1ENR |= 1<<27 ;                                      //使能BKP時鐘,RTC校準在BKP相關寄存器
    PWR->CR |= 1<<8 ;                                        //取消BKP相關寄存器寫保護
    RCC->BDCR |= 1<<16 ;                                      //備份區域軟復位
    RCC->BDCR &= ~( 1<<16 ) ;                                    //備份區域軟復位結束
    RCC->BDCR |= 1<<0 ;                                        //開啟外部低速振蕩器
    while( ( RCC->BDCR&0x02 )!=0x02 ) ;                                //等待外部時鐘就緒
    RCC->BDCR |= 1<<8 ;                                        //LSI作為RTC時鐘
    RCC->BDCR |= 1<<15 ;                                      //RTC時鐘使能
    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 ;                                        //進入配置模式
    RTC->PRLH = 0 ;
    RTC->PRLL = 32767 ;                                        //設定分頻值
    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    :設置時間
Parameter  :
      year:年
      month:月
      date:日
      hour:時
      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 ;                                    //閏年的秒鐘數
    else
      seccount += 31536000 ;                                    //平年的秒鐘數
  }
  month -= 1 ;
  for( t=0; t//把前面月份的秒鐘數相加
  {
    seccount += ( u32 )mon_table[ t ]*86400 ;                            //月份秒鐘數相加
    if( Is_Leap_Year( year+2000 )&&( t==1 ) )
      seccount += 86400 ;                                      //閏年2月份增加一天的秒鐘數     
  }
  seccount += ( date-1 )*86400 ;                                    //把前面日期的秒鐘數相加
  seccount += hour*3600 ;                                        //小時秒鐘數
    seccount += minute*60 ;                                        //分鐘秒鐘數
  seccount += second ;                                        //最后的秒鐘加上去
  //設置時鐘
    RCC->APB1ENR |= 1<<28 ;                                        //使能電源時鐘
    RCC->APB1ENR |= 1<<27 ;                                        //使能備份時鐘
  PWR->CR |= 1<<8 ;                                          //取消備份區寫保護
  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() ;                                          //設置完之后更新一下數據
}
/***************************************************
Name    :RTC_Get_Time
Fuction    :獲取時間
Parameter  :None
Return    :None
***************************************************/
RTC_Data RTC_Time;
void RTC_Get_Time()
{
  u16 daycnt=0;
  u32 timecount=0;
  u32 temp=0;
  u16 temp1=0;
  //得到計數器中的值
  timecount = RTC->CNTH ;
  timecount <<= 16 ;
  timecount += RTC->CNTL ;
  //得到天數
   temp = timecount/86400 ;
  //超過一天了
  if( daycnt!=temp )
  {    
    daycnt = temp ;
    temp1 = 1970 ;                                          //從1970年開始
    while( temp>=365 )
    {
      //閏年
      if( Is_Leap_Year( temp1 ) )
      {
        if( temp>=366 )
          temp -= 366 ;                                    //閏年的秒鐘數
        else
          break ;
      }
      else
        temp -= 365;                                      //平年
      temp1 ++ ;
    }
    RTC_Time.year = temp1-2000 ;                                  //得到年份
    temp1 = 0 ;
    //超過了一個月
    while( temp>=28 )
    {
      if( Is_Leap_Year( RTC_Time.year+2000 )&&( temp1==1 ) )//當年是不是閏年/2月份
      {
        if( temp>=29 )
          temp -= 29 ;//閏年的秒鐘數
        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 ;                                      //得到秒鐘數
  RTC_Time.hour = temp/3600 ;                                      //小時
  RTC_Time.minute = ( temp%3600 )/60 ;                                //分鐘
  RTC_Time.second = ( temp%3600 )%60 ;                                //秒鐘
}

(3)創建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時鐘初始化
  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 ) ;
  }
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電源
    +關注

    關注

    184

    文章

    17841

    瀏覽量

    251815
  • 晶體振蕩器
    +關注

    關注

    9

    文章

    631

    瀏覽量

    29253
  • 時鐘芯片
    +關注

    關注

    2

    文章

    253

    瀏覽量

    39975
  • RTC
    RTC
    +關注

    關注

    2

    文章

    544

    瀏覽量

    67032
收藏 人收藏

    評論

    相關推薦

    STM32學習筆記(初學者快速入門)

    STM32學習筆記(初學者快速入門)資料來自網絡資源
    發表于 06-11 20:23

    STM32RTC實時時鐘實驗講解,從入門到放棄 精選資料分享

    STM32RTC實時時鐘實驗講解,從入門到放棄。文章目錄STM32RTC實時時鐘實驗講解,從入門
    發表于 08-03 06:38

    Stm32RTC時鐘

    Stm32RTC時鐘1.時鐘框圖:先將之前沒做筆記的時候的時間框架圖補上:同樣源自正點原子的PPT,圖中紅框的部分為RTC的時鐘源,有三種
    發表于 08-11 07:04

    CubeMX入門STM32 HAL庫的學習筆記

    STM32CubeMX是ST官方開發的一款很好用的軟件,主要用于STM32系列單片機的硬件驅動層的配置。網上也有一些關于STM32CubeMX的相關教程,對它的相關操作進行說明。從今天起,小柯希望能將自己從CubeMX
    發表于 08-17 06:55

    STM32入門學習筆記 精選資料分享

    STM32入門學習筆記本文為筆者入門學習過程的記錄,只是零散的記錄了一些個人不太懂得,覺得需要經
    發表于 08-24 07:56

    DSPRTC教程

    DSPRTC教程,很好的DSP自學資料,快來學習吧。
    發表于 04-15 14:14 ?14次下載

    STM32各模塊學習筆記

    STM32個模塊學習筆記 目錄 STM32筆記之一 中斷優先級.......................................
    發表于 11-30 03:32 ?3177次閱讀

    STM32學習筆記1——軟硬件基礎keil5編程與GPIO開發

    STM32學習筆記1——軟硬件基礎keil5編程與GPIO開發
    發表于 11-30 12:36 ?4次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>1——軟硬件基礎<b class='flag-5'>之</b>keil5編程與GPIO開發

    STM32學習STM32cubeMX軟件安裝與使用(附STM32cubeMX5.2.1載地址)

    STM32學習STM32cubeMX軟件安裝與使用(附STM32cubeMX5.2.1載地址
    發表于 12-07 11:51 ?28次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>學習</b><b class='flag-5'>之</b><b class='flag-5'>STM32</b>cubeMX軟件安裝與使用(附<b class='flag-5'>STM32</b>cubeMX5.2.1<b class='flag-5'>下</b>載地址)

    STM32內部RTC時鐘脈沖實驗參考程序

    STM32內部RTC時鐘脈沖實驗參考程序
    發表于 12-30 10:45 ?13次下載

    STM32學習筆記:跑馬燈實驗

    跑馬燈實驗放寒假了,最近在學習STM32所以想寫寫一些筆記,剛剛好也能和大家分享一下學習心得體會,希望能夠對和我一樣在
    發表于 01-17 10:57 ?2次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>:跑馬燈<b class='flag-5'>實驗</b>

    STM32入門學習筆記基礎定時器實驗

    STM32內部共有8個定時器,其中Timer1和Timer8屬于高級定時器,Timer2~Timer5屬于通用定時器,8個定時器的資源獨立,互不影響。
    的頭像 發表于 02-16 10:14 ?829次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>入門</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b>基礎定時器<b class='flag-5'>實驗</b>(<b class='flag-5'>下</b>)

    STM32入門學習筆記RTC實驗(上)

    實時時鐘Real TimeClock(簡稱RTC),實時時鐘芯片是日常生活中應用最為廣泛的消費類電子產品之一。它為人們提供精確的實時時間,或者為電子系統提供精確的時間基準,目前實時時鐘芯片大多采用精度較高的晶體振蕩器作為時鐘源。有些時鐘芯片為了在主電源掉電時,還可以工作,需要外加電池供電。
    的頭像 發表于 02-16 11:22 ?1511次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>入門</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>RTC</b><b class='flag-5'>實驗</b>(上)

    STM32學習筆記RTC實時時鐘1

    STM32 的實時時鐘(RTC)是一個獨立的定時器。 STM32RTC 模塊擁有一組連續計數的計數器,在相應軟件配置,可提供時鐘日歷
    的頭像 發表于 05-26 14:26 ?1991次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>RTC</b>實時時鐘1

    STM32學習筆記RTC實時時鐘2

    STM32 的實時時鐘(RTC)是一個獨立的定時器。 STM32RTC 模塊擁有一組連續計數的計數器,在相應軟件配置,可提供時鐘日歷
    的頭像 發表于 05-26 14:26 ?1227次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>RTC</b>實時時鐘2
    环球百家乐官网娱乐城| 先锋百家乐官网的玩法技巧和规则 | 百家乐使用技法| 诺贝尔百家乐的玩法技巧和规则| 博彩网站源码| 真人百家乐官网是啥游戏| 百家乐官网评测| 百家乐平注常赢法| 棋牌游戏平台| 百家乐官网做庄家必赢诀窍| 澳门百家乐海洋阿强| 大发888娱乐场 东南网| 澳门百家乐官网皇冠网| 大佬百家乐官网娱乐城| 全讯网qtqnet好玩| 互博百家乐官网现金网| 在线百家乐赌场| 大发888游戏平台 46| 赌场百家乐官网投注公式| 百家乐开户送彩金28| 娱乐城大全| 百家乐官网棋牌游| 国美百家乐的玩法技巧和规则| 章丘市| 百家乐四式正反路| 凯旋门娱乐城开户网址| 百家乐官网视频二人雀神| 百家乐路单破解软件| 中国足球竞猜| 香港百家乐官网娱乐场开户注册| 女优百家乐的玩法技巧和规则| 百家乐官网高手qq| gt百家乐平台| 欧博娱乐| 百家乐技巧之写路| 大发888黄金版下载| 百家乐官网五湖四海娱乐| 大发888有银钱的吗| 百家乐官网赌场方法| 伟易博百家乐娱乐城| 百家乐官网赌博机有鬼吗|