我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 360|回复: 3

RTC实验

[复制链接]

该用户从未签到

37

主题

172

回帖

0

积分

二级逆天

积分
0

终身成就奖

发表于 2020-12-3 09:06:55 | 显示全部楼层 |阅读模式
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "rtc.h"

_calendar_obj calendar;//ʱÖӽṹÌå

static void RTC_NVIC_Config(void)
{   
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;        //RTCÈ«¾ÖÖжÏ
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    //ÏÈÕ¼ÓÅÏȼ¶1λ,´ÓÓÅÏȼ¶3λ
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //ÏÈÕ¼ÓÅÏȼ¶0λ,´ÓÓÅÏȼ¶4λ
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //ʹÄܸÃͨµÀÖжÏ
    NVIC_Init(&NVIC_InitStructure);        //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
}

//ʵʱʱÖÓÅäÖÃ
//³õʼ»¯RTCʱÖÓ,ͬʱ¼ì²âʱÖÓÊÇ·ñ¹¤×÷Õý³£
//BKP->DR1ÓÃÓÚ±£´æÊÇ·ñµÚÒ»´ÎÅäÖõÄÉèÖÃ
//·µ»Ø0:Õý³£
//ÆäËû:´íÎó´úÂë




u8 RTC_Init(void)
{
    //¼ì²éÊDz»ÊǵÚÒ»´ÎÅäÖÃʱÖÓ
    u8 temp=0;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);    //ʹÄÜPWRºÍBKPÍâÉèʱÖÓ   
    PWR_BackupAccessCmd(ENABLE);    //ʹÄܺ󱸼ĴæÆ÷·ÃÎÊ  
    if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)//´ÓÖ¸¶¨µÄºó±¸¼Ä´æÆ÷ÖжÁ³öÊý¾Ý:¶Á³öÁËÓëдÈëµÄÖ¸¶¨Êý¾Ý²»Ïàºõ
        {                 
        BKP_DeInit();    //¸´Î»±¸·ÝÇøÓò     
        RCC_LSEConfig(RCC_LSE_ON);    //ÉèÖÃÍⲿµÍËÙ¾§Õñ(LSE),ʹÓÃÍâÉèµÍËÙ¾§Õñ
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)//¼ì²éÖ¸¶¨µÄRCC±ê־λÉèÖÃÓë·ñ,µÈ´ýµÍËÙ¾§Õñ¾ÍÐ÷
            {
            temp++;
            delay_ms(10);
            }
        if(temp>=250)return 1;//³õʼ»¯Ê±ÖÓʧ°Ü,¾§ÕñÓÐÎÊÌâ   

            
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);        //ÉèÖÃRTCʱÖÓ(RTCCLK),Ñ¡ÔñLSE×÷ΪRTCʱÖÓ   
        RCC_RTCCLKCmd(ENABLE);    //ʹÄÜRTCʱÖÓ  
            
        RTC_WaitForLastTask();    //µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
        RTC_WaitForSynchro();        //µÈ´ýRTC¼Ä´æÆ÷ͬ²½  
        RTC_ITConfig(RTC_IT_SEC, ENABLE);        //ʹÄÜRTCÃëÖжÏ
        RTC_WaitForLastTask();    //µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
            
        RTC_EnterConfigMode();/// ÔÊÐíÅäÖà  
        RTC_SetPrescaler(32767); //ÉèÖÃRTCÔ¤·ÖƵµÄÖµ
        RTC_WaitForLastTask();    //µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
        RTC_Set(2009,12,2,10,0,55);  //ÉèÖÃʱ¼ä   
        RTC_ExitConfigMode(); //Í˳öÅäÖÃģʽ  
            
        BKP_WriteBackupRegister(BKP_DR1, 0X5050);    //ÏòÖ¸¶¨µÄºó±¸¼Ä´æÆ÷ÖÐдÈëÓû§³ÌÐòÊý¾Ý
        }
    else//ϵͳ¼ÌÐø¼Æʱ
        {
        RTC_WaitForSynchro();    //µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄͬ²½Íê³É
        RTC_ITConfig(RTC_IT_SEC, ENABLE);    //ʹÄÜRTCÃëÖжÏ
        RTC_WaitForLastTask();    //µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É
        }
    RTC_NVIC_Config();//RCTÖжϷÖ×éÉèÖà                                
    RTC_Get();//¸üÐÂʱ¼ä   
    return 0; //ok

}                             
//RTCʱÖÓÖжÏ
//ÿÃë´¥·¢Ò»´Î  
//extern u16 tcnt;
void RTC_IRQHandler(void)
{         
    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//ÃëÖÓÖжÏ
    {                           
        RTC_Get();//¸üÐÂʱ¼ä   
     }
    if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//ÄÖÖÓÖжÏ
    {
        RTC_ClearITPendingBit(RTC_IT_ALR);        //ÇåÄÖÖÓÖжϠ           
      }                                                   
    RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);        //ÇåÄÖÖÓÖжÏ
    RTC_WaitForLastTask();                                                   
}
//ÅжÏÊÇ·ñÊÇÈòÄ꺯Êý
//Ô·ݠ  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
//ÊäÈë:Äê·Ý
//Êä³ö:¸ÃÄê·ÝÊDz»ÊÇÈòÄê.1,ÊÇ.0,²»ÊÇ
u8 Is_Leap_Year(u16 year)
{              
    if(year%4==0) //±ØÐëÄܱ»4Õû³ý
    {
        if(year%100==0)
        {
            if(year%400==0)return 1;//Èç¹ûÒÔ00½áβ,»¹ÒªÄܱ»400Õû³ý        
            else return 0;   
        }else return 1;   
    }else return 0;   
}                    
//ÉèÖÃʱÖÓ
//°ÑÊäÈëµÄʱÖÓת»»ÎªÃëÖÓ
//ÒÔ1970Äê1ÔÂ1ÈÕΪ»ù×¼
//1970~2099ÄêΪºÏ·¨Äê·Ý
//·µ»ØÖµ:0,³É¹¦;ÆäËû:´íÎó´úÂë.
//Ô·ÝÊý¾Ý±í                                             
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //ÔÂÐÞÕýÊý¾Ý±í      
//ƽÄêµÄÔ·ÝÈÕÆÚ±í
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<syear;t++)    //°ÑËùÓÐÄê·ÝµÄÃëÖÓÏà¼Ó
    {
        if(Is_Leap_Year(t))seccount+=31622400;//ÈòÄêµÄÃëÖÓÊý
        else seccount+=31536000;              //ƽÄêµÄÃëÖÓÊý
    }
    smon-=1;
    for(t=0;t<smon;t++)       //°ÑÇ°ÃæÔ·ݵÄÃëÖÓÊýÏà¼Ó
    {
        seccount+=(u32)mon_table[t]*86400;//Ô·ÝÃëÖÓÊýÏà¼Ó
        if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//ÈòÄê2Ô·ÝÔö¼ÓÒ»ÌìµÄÃëÖÓÊý      
    }
    seccount+=(u32)(sday-1)*86400;//°ÑÇ°ÃæÈÕÆÚµÄÃëÖÓÊýÏà¼Ó
    seccount+=(u32)hour*3600;//СʱÃëÖÓÊý
    seccount+=(u32)min*60;     //·ÖÖÓÃëÖÓÊý
    seccount+=sec;//×îºóµÄÃëÖÓ¼ÓÉÏÈ¥

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);    //ʹÄÜPWRºÍBKPÍâÉèʱÖÓ  
    PWR_BackupAccessCmd(ENABLE);    //ʹÄÜRTCºÍºó±¸¼Ä´æÆ÷·ÃÎÊ
    RTC_SetCounter(seccount);    //ÉèÖÃRTC¼ÆÊýÆ÷µÄÖµ

    RTC_WaitForLastTask();    //µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É      
    RTC_Get();
    return 0;        
}
//µÃµ½µ±Ç°µÄʱ¼ä
//·µ»ØÖµ:0,³É¹¦;ÆäËû:´íÎó´úÂë.
u8 RTC_Get(void)
{
    static u16 daycnt=0;
    u32 timecount=0;
    u32 temp=0;
    u16 temp1=0;      
    timecount=RTC_GetCounter();     
     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 {temp1++;break;}  
            }
            else temp-=365;      //ƽÄê
            temp1++;  
        }   
        calendar.w_year=temp1;//µÃµ½Äê·Ý
        temp1=0;
        while(temp>=28)//³¬¹ýÁËÒ»¸öÔÂ
        {
            if(Is_Leap_Year(calendar.w_year)&&temp1==1)//µ±ÄêÊDz»ÊÇÈòÄê/2Ô·Ý
            {
                if(temp>=29)temp-=29;//ÈòÄêµÄÃëÖÓÊý
                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;             //µÃµ½ÃëÖÓÊý         
    calendar.hour=temp/3600;         //Сʱ
    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;
}     
//»ñµÃÏÖÔÚÊÇÐÇÆÚ¼¸
//¹¦ÄÜÃèÊö:ÊäÈ빫ÀúÈÕÆڵõ½ÐÇÆÚ(Ö»ÔÊÐí1901-2099Äê)
//ÊäÈë²ÎÊý£º¹«ÀúÄêÔÂÈÕ
//·µ»ØÖµ£ºÐÇÆںŠ                                                                                        
u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{   
    u16 temp2;
    u8 yearH,yearL;
   
    yearH=year/100;    yearL=year%100;
    // Èç¹ûΪ21ÊÀ¼Í,Äê·ÝÊý¼Ó100  
    if (yearH>19)yearL+=100;
    // Ëù¹ýÈòÄêÊýÖ»Ëã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);
}              



#ifndef __RTC_H
#define __RTC_H      

//ʱ¼ä½á¹¹Ìå
typedef struct
{
    vu8 hour;
    vu8 min;
    vu8 sec;            
    //¹«ÀúÈÕÔÂÄêÖÜ
    vu16 w_year;
    vu8  w_month;
    vu8  w_date;
    vu8  week;         
}_calendar_obj;   


extern _calendar_obj calendar;    //ÈÕÀú½á¹¹Ìå

extern u8 const mon_table[12];    //Ô·ÝÈÕÆÚÊý¾Ý±í
void Disp_Time(u8 x,u8 y,u8 size);//ÔÚÖƶ¨Î»ÖÿªÊ¼ÏÔʾʱ¼ä
void Disp_Week(u8 x,u8 y,u8 size,u8 lang);//ÔÚÖ¸¶¨Î»ÖÃÏÔʾÐÇÆÚ
u8 RTC_Init(void);        //³õʼ»¯RTC,·µ»Ø0,ʧ°Ü;1,³É¹¦;
u8 Is_Leap_Year(u16 year);//ƽÄê,ÈòÄêÅжÏ
u8 RTC_Get(void);         //¸üÐÂʱ¼ä   
u8 RTC_Get_Week(u16 year,u8 month,u8 day);
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec);//ÉèÖÃʱ¼ä            
#endif



#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "usmart.h"
#include "rtc.h"

int main(void)
{
    u8 t;   
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// ÉèÖÃÖжÏÓÅÏȼ¶·Ö×é2
    delay_init();             //ÑÓʱº¯Êý³õʼ»¯      
    uart_init(9600);         //´®¿Ú³õʼ»¯Îª9600
    LED_Init();                //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
     LCD_Init();                //³õʼ»¯LCD
    usmart_dev.init(72);    //³õʼ»¯USMART                     
    POINT_COLOR=RED;//ÉèÖÃ×ÖÌåΪºìÉ«
    LCD_ShowString(60,50,200,16,16,"Mini STM32");   
    LCD_ShowString(60,70,200,16,16,"RTC TEST");   
    LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
    LCD_ShowString(60,110,200,16,16,"2014/3/8");   
    while(RTC_Init())        //RTC³õʼ»¯    £¬Ò»¶¨Òª³õʼ»¯³É¹¦
    {
        LCD_ShowString(60,130,200,16,16,"RTC ERROR!   ");   
        delay_ms(800);
        LCD_ShowString(60,130,200,16,16,"RTC Trying...");   
    }                                    
    //ÏÔʾʱ¼ä
    POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É«                     
    LCD_ShowString(60,130,200,16,16,"    -  -     ");      
    LCD_ShowString(60,162,200,16,16,"  :  :  ");                 
    while(1)
    {                                    
        if(t!=calendar.sec)
        {
            t=calendar.sec;
            LCD_ShowNum(60,130,calendar.w_year,4,16);                                      
            LCD_ShowNum(100,130,calendar.w_month,2,16);                                      
            LCD_ShowNum(124,130,calendar.w_date,2,16);     
            switch(calendar.week)
            {
                case 0:
                    LCD_ShowString(60,148,200,16,16,"Sunday   ");
                    break;
                case 1:
                    LCD_ShowString(60,148,200,16,16,"Monday   ");
                    break;
                case 2:
                    LCD_ShowString(60,148,200,16,16,"Tuesday  ");
                    break;
                case 3:
                    LCD_ShowString(60,148,200,16,16,"Wednesday");
                    break;
                case 4:
                    LCD_ShowString(60,148,200,16,16,"Thursday ");
                    break;
                case 5:
                    LCD_ShowString(60,148,200,16,16,"Friday   ");
                    break;
                case 6:
                    LCD_ShowString(60,148,200,16,16,"Saturday ");
                    break;  
            }
            LCD_ShowNum(60,162,calendar.hour,2,16);                                      
            LCD_ShowNum(84,162,calendar.min,2,16);                                      
            LCD_ShowNum(108,162,calendar.sec,2,16);
            LED0=!LED0;
        }   
        delay_ms(10);                                 
    };                                                  
}   
回复

使用道具 举报

  • TA的每日心情

    3 天前
  • 签到天数: 58 天

    [LV.5]常住居民I

    3

    主题

    2951

    回帖

    1116

    积分

    二级逆天

    积分
    1116

    社区居民终身成就奖特殊贡献奖优秀斑竹奖

    QQ
    发表于 2020-12-3 09:51:38 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    4703

    回帖

    5

    积分

    二级逆天

    积分
    5

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-12-3 10:51:37 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 107 天

    [LV.6]常住居民II

    5

    主题

    6751

    回帖

    1万

    积分

    三级逆天

    积分
    14185

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2020-12-4 08:46:43 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表