一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

jf_78858299 ? 來源:TECHTIMES ? 作者:霽風(fēng)AI ? 2023-05-26 14:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

5. 程序?qū)崿F(xiàn)

5.1 初始化

u8 RTC_Init(void)
{
    u8 temp=0;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);    //使能PWR和BKP外設(shè)時(shí)鐘   
    PWR_BackupAccessCmd(ENABLE);    //使能后備寄存器訪問  
    if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)      //從指定的后備寄存器中讀出數(shù)據(jù):讀出了與寫入的指定數(shù)據(jù)不相乎
        {               

        BKP_DeInit();   //復(fù)位備份區(qū)域    
        RCC_LSEConfig(RCC_LSE_ON);  //設(shè)置外部低速晶振(LSE),使用外設(shè)低速晶振
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //檢查指定的RCC標(biāo)志位設(shè)置與否,等待低速晶振就緒
            {
            temp++;
            delay_ms(10);
            }
        if(temp>=250)
            return 1;//初始化時(shí)鐘失敗,晶振有問題        
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);     //設(shè)置RTC時(shí)鐘(RTCCLK),選擇LSE作為RTC時(shí)鐘    
        RCC_RTCCLKCmd(ENABLE);  //使能RTC時(shí)鐘  
        RTC_WaitForLastTask();  //等待最近一次對RTC寄存器的寫操作完成
        RTC_WaitForSynchro();       //等待RTC寄存器同步  
        RTC_ITConfig(RTC_IT_SEC, ENABLE);       //使能RTC秒中斷
        RTC_WaitForLastTask();  //等待最近一次對RTC寄存器的寫操作完成
        RTC_EnterConfigMode();/// 允許配置  
        RTC_SetPrescaler(32767); //設(shè)置RTC預(yù)分頻的值
        RTC_WaitForLastTask();  //等待最近一次對RTC寄存器的寫操作完成
        RTC_Set(1972,1,2,1,1,1);  //設(shè)置時(shí)間    
        RTC_ExitConfigMode(); //退出配置模式  
        BKP_WriteBackupRegister(BKP_DR1, 0X5050);   //向指定的后備寄存器中寫入用戶程序數(shù)據(jù)
        }
    else//系統(tǒng)繼續(xù)計(jì)時(shí)
        {

        RTC_WaitForSynchro();   //等待最近一次對RTC寄存器的寫操作完成
        RTC_ITConfig(RTC_IT_SEC, ENABLE);   //使能RTC秒中斷
        RTC_WaitForLastTask();  //等待最近一次對RTC寄存器的寫操作完成
        }
    RTC_NVIC_Config();//RCT中斷分組設(shè)置                                
    RTC_Get();//更新時(shí)間    
    return 0; //ok

}
static void RTC_NVICConfig(void)
{    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;      //RTC全局中斷
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //先占優(yōu)先級1位,從優(yōu)先級3位
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //先占優(yōu)先級0位,從優(yōu)先級4位
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     //使能該通道中斷
    NVIC_Init(&NVIC_InitStructure);     //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器
}
中斷服務(wù)函數(shù):

void RTC_IRQHandler(void)
{         
    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒鐘中斷
    {                           
        RTC_Get();//更新時(shí)間   
     }
    if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//鬧鐘中斷
    {
        RTC_ClearITPendingBit(RTC_IT_ALR);      //清鬧鐘中斷        
      }                                                
    RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);        //清鬧鐘中斷
    RTC_WaitForLastTask();                                           
}

5.2 RTC部分實(shí)現(xiàn)

閏年判斷:

//判斷是否是閏年函數(shù)
//月份   1  2  3  4  5  6  7  8  9  10 11 12
//閏年   31 29 31 30 31 30 31 31 30 31 30 31
//非閏年 31 28 31 30 31 30 31 31 30 31 30 31
//輸入:年份
//輸出:該年份是不是閏年.1,是.0,不是
u8 Is_Leap_Year(u16 year)
{              
    if(year%4==0) //必須能被4整除
    { 
        if(year%100==0) 
        { 
            if(year%400==0)
                return 1;//如果以00結(jié)尾,還要能被400整除       
            else 
                return 0;   
        }
        else 
            return 1;   
    }
    else 
        return 0;   
}

時(shí)鐘設(shè)置:

//設(shè)置時(shí)鐘
//把輸入的時(shí)鐘轉(zhuǎn)換為秒鐘
//以1970年1月1日為基準(zhǔn)
//1970~2099年為合法年份
//返回值:0,成功;其他:錯誤代碼.
//月份數(shù)據(jù)表    

u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數(shù)據(jù)表      
//平年的月份日期表
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};

u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
    u16 t;
    u32 seccount=0;

    if(syear<1970||syear>2099)
        return 1;      
    for(t=1970;t
得到當(dāng)前時(shí)間:

//得到當(dāng)前的時(shí)間
//返回值:0,成功;其他:錯誤代碼.
u8 RTC_Get(void)
{
    static u16 daycnt=0;
    u32 timecount=0; 
    u32 temp=0;
    u16 temp1=0;

    timecount = RTC_GetCounter();     
    //timecount = 86400*4+88;
     temp = timecount / 86400;   //得到天數(shù)(秒鐘數(shù)對應(yīng)的)
    if(daycnt!=temp)//超過一天了
    {     
        daycnt = temp;
        temp1 = 1970;   //從1970年開始
        while(temp>=365)
        {                
            if(Is_Leap_Year(temp1))//是閏年
            {
                if(temp>=366)
                    temp -= 366;//減去一閏年,還剩下的天數(shù)
                else 
                    {   
                        temp1 ++;
                        break;
                    }  
            }
            else 
                temp -= 365;      //減去一平年 ,還剩下的天數(shù)
            temp1 ++;  
        }   
        calendar.w_year = temp1;//得到年份
        temp1=0;
        while(temp>=28)//28天,超過了最小的一個(gè)月
        {
            if(Is_Leap_Year(calendar.w_year)&&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++;  
        }
        calendar.w_month = temp1+1; //得到月份
        calendar.w_date = temp+1;   //得到日期 
    }
    temp = timecount%86400;             //得到秒鐘數(shù)        
    calendar.hour = temp/3600;      //小時(shí)
    calendar.min = (temp%3600)/60;  //分鐘    
    calendar.sec = (temp%3600)%60;  //秒鐘
    calendar.week = RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//獲取星期 

    return 0;
}
得到星期幾:

//獲得現(xiàn)在是星期幾
//功能描述:輸入公歷日期得到星期(只允許1901-2099年)
//輸入?yún)?shù):公歷年月日 
//返回值:星期號                                                                                         
u8 RTC_GetWeek(u16 year,u8 month,u8 day)
{    
    u16 temp2;
    u8 yearH,yearL;

    yearH = year/100;
    yearL = year%100; 
    // 如果為21世紀(jì),年份數(shù)加100  
    if (yearH>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--;

    return(temp2%7);
}

6. 附錄:

STM32 時(shí)鐘樹:

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5434

    瀏覽量

    124550
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    365075
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2291

    瀏覽量

    96426
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    622

    瀏覽量

    68882
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32 RTC實(shí)時(shí)時(shí)鐘(一)

    STM32處理器內(nèi)部集成了實(shí)時(shí)時(shí)鐘控制器(RTC),因此在實(shí)現(xiàn)實(shí)時(shí)時(shí)鐘功能時(shí),無須外擴(kuò)時(shí)鐘芯片即可構(gòu)建實(shí)
    的頭像 發(fā)表于 07-22 15:41 ?5578次閱讀
    <b class='flag-5'>STM32</b> <b class='flag-5'>RTC</b><b class='flag-5'>實(shí)時(shí)時(shí)鐘</b>(一)

    RTC實(shí)時(shí)時(shí)鐘簡介

    RTC實(shí)時(shí)時(shí)鐘1. RTC實(shí)時(shí)時(shí)鐘簡介2. 硬件設(shè)計(jì)3. 軟件設(shè)計(jì)3.1 STM32CubeMX
    發(fā)表于 08-18 06:55

    談一談STM32RTC實(shí)時(shí)時(shí)鐘

    STM32RTC實(shí)時(shí)時(shí)鐘...
    發(fā)表于 08-18 06:39

    如何去使用STM32實(shí)時(shí)時(shí)鐘RTC

    實(shí)時(shí)時(shí)鐘RTC是什么?如何去使用STM32實(shí)時(shí)時(shí)鐘RTC呢?有哪些注意事項(xiàng)?
    發(fā)表于 11-22 08:05

    RTC是什么?RTC實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)

    文章目錄前言一、RTC是什么?二、RTC實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)1.引入庫2.讀入數(shù)據(jù)總結(jié)前言前面我們說了OLED實(shí)驗(yàn),是一個(gè)比較好的顯示測試代碼的方法?,F(xiàn)在我們
    發(fā)表于 01-13 07:19

    RTC實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)的相關(guān)資料分享

    STM32CubMX自學(xué)筆記(六)—RTC實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)主要介紹RTCSTM32單片機(jī)的內(nèi)置外設(shè)
    發(fā)表于 03-02 07:34

    STM32F2技術(shù)培訓(xùn)_實(shí)時(shí)時(shí)鐘_RTC

    STM32F2 技術(shù)培訓(xùn)_實(shí)時(shí)時(shí)鐘_RTC
    發(fā)表于 12-03 17:35 ?0次下載

    STM32F0xx_ RTC實(shí)時(shí)時(shí)鐘配置詳細(xì)過程

    STM32F0xx_RTC實(shí)時(shí)時(shí)鐘配置詳細(xì)過程
    的頭像 發(fā)表于 04-07 11:50 ?8799次閱讀
    <b class='flag-5'>STM32</b>F0xx_ <b class='flag-5'>RTC</b><b class='flag-5'>實(shí)時(shí)時(shí)鐘</b>配置詳細(xì)過程

    淺談RTC實(shí)時(shí)時(shí)鐘特征與原理

    一、RTC實(shí)時(shí)時(shí)鐘特征與原理 查看STM32中文手冊 16 實(shí)時(shí)時(shí)鐘RTC)(308頁) RTC
    的頭像 發(fā)表于 06-30 15:54 ?1.1w次閱讀

    STM32CubeMX | 40 - 實(shí)時(shí)時(shí)鐘RTC的使用(日歷和鬧鐘)

    STM32CubeMX | 40 - 實(shí)時(shí)時(shí)鐘RTC的使用(日歷和鬧鐘)
    發(fā)表于 11-23 18:06 ?19次下載
    <b class='flag-5'>STM32</b>CubeMX | 40 - <b class='flag-5'>實(shí)時(shí)時(shí)鐘</b><b class='flag-5'>RTC</b>的使用(日歷和鬧鐘)

    stm32f4 RTC實(shí)時(shí)時(shí)鐘解析

    應(yīng)用最為廣泛的消費(fèi)類電子產(chǎn)品之一。它為人們提供精確的實(shí)時(shí)時(shí)間,或者為電子系統(tǒng)提供精確的時(shí)間基準(zhǔn),目前實(shí)時(shí)時(shí)鐘芯片大多采用精度較高的晶體振蕩器作為時(shí)鐘源。對于STM32F的
    發(fā)表于 12-04 18:06 ?19次下載
    <b class='flag-5'>stm32</b>f4 <b class='flag-5'>RTC</b><b class='flag-5'>實(shí)時(shí)時(shí)鐘</b>解析

    STM32CubeMX學(xué)習(xí)筆記(14)——RTC實(shí)時(shí)時(shí)鐘使用

    一、RTC簡介實(shí)時(shí)時(shí)鐘RTC) 是一個(gè)獨(dú)立的 BCD 定時(shí)器/計(jì)數(shù)器。 RTC 提供具有可編程鬧鐘中斷功能的日歷時(shí)鐘/日歷。
    發(fā)表于 12-05 21:06 ?13次下載
    <b class='flag-5'>STM32</b>CubeMX<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>(14)——<b class='flag-5'>RTC</b><b class='flag-5'>實(shí)時(shí)時(shí)鐘</b>使用

    STM32CubeMX系列|RTC實(shí)時(shí)時(shí)鐘

    RTC實(shí)時(shí)時(shí)鐘1. RTC實(shí)時(shí)時(shí)鐘簡介2. 硬件設(shè)計(jì)3. 軟件設(shè)計(jì)3.1 STM32CubeMX
    發(fā)表于 12-24 19:15 ?16次下載
    <b class='flag-5'>STM32</b>CubeMX系列|<b class='flag-5'>RTC</b><b class='flag-5'>實(shí)時(shí)時(shí)鐘</b>

    基于STM32單片機(jī)RTC實(shí)時(shí)時(shí)鐘使用庫文件設(shè)計(jì)

    基于STM32單片機(jī)RTC實(shí)時(shí)時(shí)鐘使用庫文件設(shè)計(jì)源代碼
    發(fā)表于 04-26 14:28 ?5次下載

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

    STM32實(shí)時(shí)時(shí)鐘RTC)是一個(gè)獨(dú)立的定時(shí)器。 STM32RTC 模塊擁有一組連續(xù)計(jì)數(shù)的計(jì)數(shù)器,在相應(yīng)軟件配置下,可提供
    的頭像 發(fā)表于 05-26 14:26 ?2364次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>RTC</b><b class='flag-5'>實(shí)時(shí)時(shí)鐘</b>1