OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2075|回复: 3

有没有大神能帮忙看看这段选择LSI作为RTC时钟源,哪里配置有问题,找不到问题。感谢感谢。

[复制链接]

9

主题

11

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-9-4
在线时间
7 小时
发表于 2019-9-4 15:11:29 | 显示全部楼层 |阅读模式
1金钱
_calendar_obj calendar;//ê±Öó½á11ìå

static void RTC_NVIC_Config(void)
{       
  NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;                //RTC諾ÖÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //ÏèÕ¼óÅÏè¼¶1λ,′óóÅÏè¼¶3λ
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //ÏèÕ¼óÅÏè¼¶0λ,′óóÅÏè¼¶4λ
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //ê1Äü¸Ãí¨μàÖD¶Ï
        NVIC_Init(&NVIC_InitStructure);                //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
}

//êμê±ê±ÖóÅäÖÃ
//3õê¼»ˉRTCê±Öó,í¬ê±¼ì2aê±ÖóêÇ·ñ1¤×÷Õy3£
//BKP->DR1óÃóú±£′æêÇ·ñμúò»′ÎÅäÖÃμÄéèÖÃ
//·μ»Ø0:Õy3£
//ÆäËû:′íÎó′úÂë

u8 RTC_Init(void)
{
        //¼ì2éêÇ2»êÇμúò»′ÎÅäÖÃê±Öó
        u8 temp=0;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        //ê1ÄüPWRoíBKPíaéèê±Öó   
        PWR_BackupAccessCmd(ENABLE);        //ê1Äüo󱸼Ä′æÆ÷·ÃÎê  
        if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051)                //′óÖ¸¶¨μÄo󱸼Ä′æÆ÷ÖD¶á3öêy¾Y:¶á3öáËóëD′èëμÄÖ¸¶¨êy¾Y2»Ïàoõ
                {                                
                BKP_DeInit();        //¸′λ±¸·YÇøóò        
//                RCC_LSEConfig(RCC_LSE_OFF);        //éèÖÃía2¿μíËù¾§Õñ(LSE),ê1óÃíaéèμíËù¾§Õñ
                        RCC_LSICmd(ENABLE);//¿aÆôÄú2¿μíËùê±ÖóLSI
                while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET&&temp<250)        //&#188;ì2é&#214;&#184;&#182;¨μ&#196;RCC±ê&#214;&#190;&#206;&#187;éè&#214;&#195;ó&#235;·&#241;,μè′yμí&#203;ù&#190;§&#213;&#241;&#190;íD÷
                        {
                        temp++;
                        delay_ms(10);
                        }
                if(temp>=250)return 1;//3&#245;ê&#188;&#187;ˉê±&#214;óê§°ü,&#190;§&#213;&#241;óD&#206;êìa          
                       
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);                //éè&#214;&#195;RTCê±&#214;ó(RTCCLK),&#209;&#161;&#212;&#241;LSE×÷&#206;aRTCê±&#214;ó   
                RCC_RTCCLKCmd(ENABLE);        //ê1&#196;üRTCê±&#214;ó  
                       
                RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é
                RTC_WaitForSynchro();                //μè′yRTC&#188;&#196;′&#230;&#198;÷í&#172;2&#189;  
                RTC_ITConfig(RTC_IT_SEC, ENABLE);                //ê1&#196;üRTC&#195;&#235;&#214;D&#182;&#207;
                RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é
                RTC_ITConfig(RTC_IT_ALR, ENABLE);                //ê1&#196;üRTC&#196;&#214;&#214;ó&#214;D&#182;&#207;
                RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é       
                       
                RTC_EnterConfigMode();/// &#212;êDí&#197;&#228;&#214;&#195;       
                RTC_SetPrescaler(40000); //éè&#214;&#195;RTC&#212;¤·&#214;&#198;μμ&#196;&#214;μ
                RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é
                RTC_Set(2018,9,2,11,56,0);  //éè&#214;&#195; μ±&#199;° ê±&#188;&#228;
                RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é
                RTC_Alarm_Set(2018,9,2,11,56,10);  //éè&#214;&#195; &#196;&#214;&#214;ó ê±&#188;&#228;
                RTC_ExitConfigMode(); //í&#203;3&#246;&#197;&#228;&#214;&#195;&#196;£ê&#189;  
                BKP_WriteBackupRegister(BKP_DR1, 0X5051);        //&#207;ò&#214;&#184;&#182;¨μ&#196;oó±&#184;&#188;&#196;′&#230;&#198;÷&#214;DD′è&#235;ó&#195;&#187;§3ìDòêy&#190;Y
                }
        else//&#207;μí3&#188;ìD&#248;&#188;&#198;ê±
                {

                RTC_WaitForSynchro();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é
                RTC_EnterConfigMode();/// &#212;êDí&#197;&#228;&#214;&#195;
                RTC_ITConfig(RTC_IT_SEC, ENABLE);        //ê1&#196;üRTC&#195;&#235;&#214;D&#182;&#207;
                RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é
                RTC_ITConfig(RTC_IT_ALR, ENABLE);                //ê1&#196;üRTC&#196;&#214;&#214;ó&#214;D&#182;&#207;
                        RTC_ExitConfigMode(); //í&#203;3&#246;&#197;&#228;&#214;&#195;&#196;£ê&#189;
                RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é       
                }
        RTC_NVIC_Config();//RCT&#214;D&#182;&#207;·&#214;×ééè&#214;&#195;                                                         
        RTC_Get();//&#184;üD&#194;ê±&#188;&#228;       
        return 0; //ok

}                                                     
//RTCê±&#214;ó&#214;D&#182;&#207;
//&#195;&#191;&#195;&#235;′¥·¢ò&#187;′&#206;  
//extern u16 tcnt;
void RTC_IRQHandler(void)
{                 
        if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//&#195;&#235;&#214;ó&#214;D&#182;&#207;
        {                                                       
                RTC_Get();//&#184;üD&#194;ê±&#188;&#228;
//                printf("\r\n Current RTC Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);
        }
        if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//&#196;&#214;&#214;ó&#214;D&#182;&#207;
        {
                RTC_ClearITPendingBit(RTC_IT_ALR);                //&#199;&#229;&#196;&#214;&#214;ó&#214;D&#182;&#207;                 
          RTC_Get();                                //&#184;üD&#194;ê±&#188;&#228;   
          printf("\r\n WANG ZHONG HUI NB:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//ê&#228;3&#246;&#196;&#214;á&#229;ê±&#188;&#228;
               
          }                                                                                                    
        RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);                //&#199;&#229;&#195;&#235;&#161;¢ò&#231;3&#246;&#214;D&#182;&#207;
        RTC_WaitForLastTask();                                                                                           
}
//&#197;D&#182;&#207;ê&#199;·&#241;ê&#199;èò&#196;êoˉêy
//&#212;&#194;·Y   1  2  3  4  5  6  7  8  9  10 11 12
//èò&#196;ê   31 29 31 30 31 30 31 31 30 31 30 31
//·&#199;èò&#196;ê 31 28 31 30 31 30 31 31 30 31 30 31
//ê&#228;è&#235;:&#196;ê·Y
//ê&#228;3&#246;:&#184;&#195;&#196;ê·Yê&#199;2&#187;ê&#199;èò&#196;ê.1,ê&#199;.0,2&#187;ê&#199;
u8 Is_Leap_Year(u16 year)
{                          
        if(year%4==0) //±&#216;D&#235;&#196;ü±&#187;4&#213;&#251;3y
        {
                if(year%100==0)
                {
                        if(year%400==0)return 1;//è&#231;1&#251;ò&#212;00&#189;á&#206;2,&#187;1òa&#196;ü±&#187;400&#213;&#251;3y           
                        else return 0;   
                }else return 1;   
        }else return 0;       
}                                   
//éè&#214;&#195;ê±&#214;ó
//°&#209;ê&#228;è&#235;μ&#196;ê±&#214;ó×a&#187;&#187;&#206;a&#195;&#235;&#214;ó
//ò&#212;1970&#196;ê1&#212;&#194;1è&#213;&#206;a&#187;ù×&#188;
//1970~2099&#196;ê&#206;ao&#207;·¨&#196;ê·Y
//·μ&#187;&#216;&#214;μ:0,3é1|;&#198;&#228;&#203;&#251;:′í&#206;ó′ú&#194;&#235;.
//&#212;&#194;·Yêy&#190;Y±í                                                                                         
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //&#212;&#194;DT&#213;yêy&#190;Y±í          
//&#198;&#189;&#196;êμ&#196;&#212;&#194;·Yè&#213;&#198;ú±í
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++)        //°&#209;&#203;ùóD&#196;ê·Yμ&#196;&#195;&#235;&#214;ó&#207;à&#188;ó
        {
                if(Is_Leap_Year(t))seccount+=31622400;//èò&#196;êμ&#196;&#195;&#235;&#214;óêy
                else seccount+=31536000;                          //&#198;&#189;&#196;êμ&#196;&#195;&#235;&#214;óêy
        }
        smon-=1;
        for(t=0;t<smon;t++)           //°&#209;&#199;°&#195;&#230;&#212;&#194;·Yμ&#196;&#195;&#235;&#214;óêy&#207;à&#188;ó
        {
                seccount+=(u32)mon_table[t]*86400;//&#212;&#194;·Y&#195;&#235;&#214;óêy&#207;à&#188;ó
                if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//èò&#196;ê2&#212;&#194;·Y&#212;&#246;&#188;óò&#187;ììμ&#196;&#195;&#235;&#214;óêy          
        }
        seccount+=(u32)(sday-1)*86400;//°&#209;&#199;°&#195;&#230;è&#213;&#198;úμ&#196;&#195;&#235;&#214;óêy&#207;à&#188;ó
        seccount+=(u32)hour*3600;//D&#161;ê±&#195;&#235;&#214;óêy
    seccount+=(u32)min*60;         //·&#214;&#214;ó&#195;&#235;&#214;óêy
        seccount+=sec;//×&#238;oóμ&#196;&#195;&#235;&#214;ó&#188;óé&#207;è¥

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        //ê1&#196;üPWRoíBKPíaéèê±&#214;ó  
        PWR_BackupAccessCmd(ENABLE);        //ê1&#196;üRTCoíoó±&#184;&#188;&#196;′&#230;&#198;÷·&#195;&#206;ê
        RTC_SetCounter(seccount);        //éè&#214;&#195;RTC&#188;&#198;êy&#198;÷μ&#196;&#214;μ

        RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é         
        return 0;            
}

//3&#245;ê&#188;&#187;ˉ&#196;&#214;&#214;ó                  
//ò&#212;1970&#196;ê1&#212;&#194;1è&#213;&#206;a&#187;ù×&#188;
//1970~2099&#196;ê&#206;ao&#207;·¨&#196;ê·Y
//syear,smon,sday,hour,min,sec£o&#196;&#214;&#214;óμ&#196;&#196;ê&#212;&#194;è&#213;ê±·&#214;&#195;&#235;   
//·μ&#187;&#216;&#214;μ:0,3é1|;&#198;&#228;&#203;&#251;:′í&#206;ó′ú&#194;&#235;.
u8 RTC_Alarm_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++)        //°&#209;&#203;ùóD&#196;ê·Yμ&#196;&#195;&#235;&#214;ó&#207;à&#188;ó
        {
                if(Is_Leap_Year(t))seccount+=31622400;//èò&#196;êμ&#196;&#195;&#235;&#214;óêy
                else seccount+=31536000;                          //&#198;&#189;&#196;êμ&#196;&#195;&#235;&#214;óêy
        }
        smon-=1;
        for(t=0;t<smon;t++)           //°&#209;&#199;°&#195;&#230;&#212;&#194;·Yμ&#196;&#195;&#235;&#214;óêy&#207;à&#188;ó
        {
                seccount+=(u32)mon_table[t]*86400;//&#212;&#194;·Y&#195;&#235;&#214;óêy&#207;à&#188;ó
                if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//èò&#196;ê2&#212;&#194;·Y&#212;&#246;&#188;óò&#187;ììμ&#196;&#195;&#235;&#214;óêy          
        }
        seccount+=(u32)(sday-1)*86400;//°&#209;&#199;°&#195;&#230;è&#213;&#198;úμ&#196;&#195;&#235;&#214;óêy&#207;à&#188;ó
        seccount+=(u32)hour*3600;//D&#161;ê±&#195;&#235;&#214;óêy
    seccount+=(u32)min*60;         //·&#214;&#214;ó&#195;&#235;&#214;óêy
        seccount+=sec;//×&#238;oóμ&#196;&#195;&#235;&#214;ó&#188;óé&#207;è¥                             
        //éè&#214;&#195;ê±&#214;ó
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        //ê1&#196;üPWRoíBKPíaéèê±&#214;ó   
        PWR_BackupAccessCmd(ENABLE);        //ê1&#196;üoó±&#184;&#188;&#196;′&#230;&#198;÷·&#195;&#206;ê  
        //é&#207;&#195;&#230;èy2&#189;ê&#199;±&#216;D&#235;μ&#196;!
       
        RTC_SetAlarm(seccount);

        RTC_WaitForLastTask();        //μè′y×&#238;&#189;üò&#187;′&#206;&#182;&#212;RTC&#188;&#196;′&#230;&#198;÷μ&#196;D′2ù×÷íê3é         
       
        return 0;            
}


//μ&#195;μ&#189;μ±&#199;°μ&#196;ê±&#188;&#228;
//·μ&#187;&#216;&#214;μ:0,3é1|;&#198;&#228;&#203;&#251;:′í&#206;ó′ú&#194;&#235;.
u8 RTC_Get(void)
{
        static u16 daycnt=0;
        u32 timecount=0;
        u32 temp=0;
        u16 temp1=0;          
    timecount=RTC_GetCounter();         
        temp=timecount/86400;   //μ&#195;μ&#189;ììêy(&#195;&#235;&#214;óêy&#182;&#212;ó|μ&#196;)
        if(daycnt!=temp)//3&#172;1yò&#187;ììá&#203;
        {          
                daycnt=temp;
                temp1=1970;        //′ó1970&#196;ê&#191;aê&#188;
                while(temp>=365)
                {                                 
                        if(Is_Leap_Year(temp1))//ê&#199;èò&#196;ê
                        {
                                if(temp>=366)temp-=366;//èò&#196;êμ&#196;&#195;&#235;&#214;óêy
                                else {temp1++;break;}  
                        }
                        else temp-=365;          //&#198;&#189;&#196;ê
                        temp1++;  
                }   
                calendar.w_year=temp1;//μ&#195;μ&#189;&#196;ê·Y
                temp1=0;
                while(temp>=28)//3&#172;1yá&#203;ò&#187;&#184;&#246;&#212;&#194;
                {
                        if(Is_Leap_Year(calendar.w_year)&&temp1==1)//μ±&#196;êê&#199;2&#187;ê&#199;èò&#196;ê/2&#212;&#194;·Y
                        {
                                if(temp>=29)temp-=29;//èò&#196;êμ&#196;&#195;&#235;&#214;óêy
                                else break;
                        }
                        else
                        {
                                if(temp>=mon_table[temp1])temp-=mon_table[temp1];//&#198;&#189;&#196;ê
                                else break;
                        }
                        temp1++;  
                }
                calendar.w_month=temp1+1;        //μ&#195;μ&#189;&#212;&#194;·Y
                calendar.w_date=temp+1;          //μ&#195;μ&#189;è&#213;&#198;ú
        }
        temp=timecount%86400;                     //μ&#195;μ&#189;&#195;&#235;&#214;óêy             
        calendar.hour=temp/3600;             //D&#161;ê±
        calendar.min=(temp%3600)/60;         //·&#214;&#214;ó       
        calendar.sec=(temp%3600)%60;         //&#195;&#235;&#214;ó
        calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//&#187;&#241;è&#161;D&#199;&#198;ú   
        return 0;
}         
//&#187;&#241;μ&#195;&#207;&#214;&#212;úê&#199;D&#199;&#198;ú&#188;&#184;
//1|&#196;ü&#195;èê&#246;:ê&#228;è&#235;1&#171;àúè&#213;&#198;úμ&#195;μ&#189;D&#199;&#198;ú(&#214;&#187;&#212;êDí1901-2099&#196;ê)
//ê&#228;è&#235;2&#206;êy£o1&#171;àú&#196;ê&#212;&#194;è&#213;
//·μ&#187;&#216;&#214;μ£oD&#199;&#198;úo&#197;                                                                                                                                                                                 
u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{       
        u16 temp2;
        u8 yearH,yearL;
       
        yearH=year/100;        yearL=year%100;
        // è&#231;1&#251;&#206;a21êà&#188;í,&#196;ê·Yêy&#188;ó100  
        if (yearH>19)yearL+=100;
        // &#203;ù1yèò&#196;êêy&#214;&#187;&#203;&#227;1900&#196;ê&#214;&#174;oóμ&#196;  
        temp2=yearL+yearL/4;
        temp2=temp2%7;
        temp2=temp2+day+table_week[month-1];
        if (yearL%4==0&&month<3)temp2--;
        return(temp2%7);
}                         

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-9-5 02:39:32 | 显示全部楼层
什么开发板?我们战舰,探索都有加LSI作为RTC晶振的代码哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

11

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-9-4
在线时间
7 小时
 楼主| 发表于 2019-9-5 12:52:13 | 显示全部楼层
正点原子 发表于 2019-9-5 02:39
什么开发板?我们战舰,探索都有加LSI作为RTC晶振的代码哦

战舰版,F103ZET6
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-9-6 02:51:50 | 显示全部楼层

我们综合实验就有啊,你看看综合实验的RTC代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 19:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表