RTC重新设置了时间后,RTC的CNT计数器还在工作,但是RTC_Get()函数却取不出来值

2019-07-20 23:09发布

各位大师好,我写了这样一段代码,通过串口数据来更改RTC定时器的年,月,日,时,分,秒.现在的情况是发送串口指令后,RTC的时间确实被改了,我用MDK查看RTC->CNTL寄存器的值也在每秒发生变化,但就是RTC_Get()函数取不出RTC->CNTL的值,观察了RTC的全部寄存器也没看到发串口指令前和发串口指令后有什么不同,百思不得其解,跪求大师们帮忙给看看,已经在这个坑里爬了两天了

这是主函数代码:
#include <string.h>
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h"
#include "adc.h"
#include "timer.h"
#include "rtc.h"
u8 flag1;
u8 flag2;
u8 flag3;

u32 timecount=0;
u32 temp=0;
u16 temp1=0;

u16 Current_year;
u8 Current_yearH;
u8 Current_yearL;
u8 Current_month;
u8 Current_day;
u8 Current_hour;
u8 Current_min;
u8 Current_sec;

u8 get_10sec_flag=0;

u16 Target_TDS;
u8 Target_TDSH;
u8 Target_TDSL;
u8 Target_PH;

u16 Target_Light;
u8 Target_LightH;
u8 Target_LightL;

u16 Current_TDS;
u8 Current_TDSH;
u8 Current_TDSL;
u8 Current_PH;

u16 Current_TMP;
u8 Current_TMPH;
u8 Current_TMPL;

u16 Current_Light;
u8 Current_LightH;
u8 Current_LightL;
u8 Level_sensor_H;
u8 Level_sensor_L;
u8 i0=1;
u8 i1=1;
u8 CommandFromPc[18];
u8 CommandFromTDS[7];
u8 CommandFromTMP[7];
u8 CommandFromlight[12];

u8 ADD;
u8 ADD1;
u8 RXD_OK_flag;
u8 RXD_TDS_OK_flag;
u8 RXD_TMP_OK_flag;
u8 tmp;
u8 tmp1;
u8 len;
u8 AnswertoPc[17];
u8 Start_flag=0;

u16 cnt1;
u8 arrive_time_flag=0;
u8 System_mode=0;
u8 flow_water=0;
u8 Pump_time_flag=0;

u8 i2=1;
u8 ADD2=0;
u8 tmp2=0;
u8 RXD_light_OK_flag=0;

u8 cnt_answer=0;
u8 arrive_answer=0;
u8 TDS_Rec_flag=0;
u8 TMP_Rec_flag=0;

int main(void)
{        
        Initparameter();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// éè&#214;&#195;&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é2
        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
        uart_init(9600);                 //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a9600
  uart_init2(9600);       
        uart_init4(9600);
        LED_Init();         //LED3&#245;ê&#188;&#187;ˉ       
        Adc_Init();
        uart_send_light_cut();
  uart_send_light_GUANDENG();
  uart_send_light_GUANDENG_SAVE();
        TIM3_Int_Init(9999,7199);
        TIM4_Int_Init(9999,7199);
        while(RTC_Init())                //RTC3&#245;ê&#188;&#187;ˉ        £&#172;ò&#187;&#182;¨òa3&#245;ê&#188;&#187;ˉ3é1|
        {
                delay_ms(800);
        }               
        delay_ms(500);
        while(1)
        {
                if(arrive_answer==1)
                {
                        arrive_answer=0;
                        uart_send_answer_system_state();
                }
                if(RXD_OK_flag==1)
                {
                        RXD_OK_flag=0;
                        switch(CommandFromPc[3])
                        {                         
                                 case 0x11 :         //此处是收到指令后,修改RTC的计数值为当前时间
                                   Current_yearH=CommandFromPc[5];
                                   Current_yearL=CommandFromPc[6];
                                   Current_year=Current_yearH*256+Current_yearL;
                                   Current_month=CommandFromPc[7];
                                   Current_day=CommandFromPc[8];
                                   Current_hour=CommandFromPc[9];
                                   Current_min=CommandFromPc[10];
                                   Current_sec=CommandFromPc[11];
                                   RTC_WaitForSynchro();       
                                   RTC_Set(Current_year,Current_month,Current_day,Current_hour,Current_min,Current_sec);  //éè&#214;&#195;ê±&#188;&#228;
                                   RTC_ExitConfigMode();
                                   RTC_WaitForSynchro();                                         
                                   uart_send_answer(0X11);
                                   break ;  
                                 
                                 case 0x19 :
                                 uart_send_answer(0X19);
                                Start_flag=1;
                                break ;
                         }                                 
                }  
                 if(get_10sec_flag==1)
                 {
                                flag1=1;
                                get_10sec_flag=0;
                                RTC_Get();
                                RTC_SetAlarm(RTC_GetCounter()+10);
                                RTC_WaitForLastTask();
                                flag1=1;                                                 
                                if((calendar.hour>=8)&&(calendar.hour<=20))
                                {
                                                 flag2=1;
                                }
                                if((calendar.hour>=7)&&(calendar.hour<8))
                                {
                                                 flag3=1;       
                                }
                 }
                delay_ms(200);                                           
                LED0=!LED0;
        }
}

这是RTC代码,我参照了原子哥的代码,做了部分修改,把中断里的秒中断去掉了,然后把timecount做成了全局变量,以方便调试时候观察。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "rtc.h"                     
//Mini STM32&#191;a·¢°&#229;
//RTCêμê±ê±&#214;ó &#199;y&#182;ˉ′ú&#194;&#235;                         
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//2010/6/6
extern u32 timecount;
extern u32 temp;
extern u16 temp1;
extern u8 get_10sec_flag;   
extern u16 Current_year;
extern u8 Current_month;
extern u8 Current_day;
extern u8 Current_hour;
extern u8 Current_min;
extern u8 Current_sec;
_calendar_obj calendar;//ê±&#214;ó&#189;á11ì&#229;

static void RTC_NVIC_Config(void)
{       
  NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;                //RTCè&#171;&#190;&#214;&#214;D&#182;&#207;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //&#207;è&#213;&#188;ó&#197;&#207;è&#188;&#182;1&#206;&#187;,′óó&#197;&#207;è&#188;&#182;3&#206;&#187;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //&#207;è&#213;&#188;ó&#197;&#207;è&#188;&#182;0&#206;&#187;,′óó&#197;&#207;è&#188;&#182;4&#206;&#187;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //ê1&#196;ü&#184;&#195;í¨μà&#214;D&#182;&#207;
        NVIC_Init(&NVIC_InitStructure);                //&#184;ù&#190;YNVIC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèNVIC&#188;&#196;′&#230;&#198;÷
}

//êμê±ê±&#214;ó&#197;&#228;&#214;&#195;
//3&#245;ê&#188;&#187;ˉRTCê±&#214;ó,í&#172;ê±&#188;ì2aê±&#214;óê&#199;·&#241;1¤×÷&#213;y3£
//BKP->DR1ó&#195;óú±£′&#230;ê&#199;·&#241;μúò&#187;′&#206;&#197;&#228;&#214;&#195;μ&#196;éè&#214;&#195;
//·μ&#187;&#216;0:&#213;y3£
//&#198;&#228;&#203;&#251;:′í&#206;ó′ú&#194;&#235;
u8 RTC_Init(void)
{
        //&#188;ì2éê&#199;2&#187;ê&#199;μúò&#187;′&#206;&#197;&#228;&#214;&#195;ê±&#214;ó
        u8 temp=0;
        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;ê  
        if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)                //′ó&#214;&#184;&#182;¨μ&#196;oó±&#184;&#188;&#196;′&#230;&#198;÷&#214;D&#182;á3&#246;êy&#190;Y:&#182;á3&#246;á&#203;ó&#235;D′è&#235;μ&#196;&#214;&#184;&#182;¨êy&#190;Y2&#187;&#207;ào&#245;
                {                                

                BKP_DeInit();        //&#184;′&#206;&#187;±&#184;·Y&#199;&#248;óò        
                RCC_LSEConfig(RCC_LSE_ON);        //éè&#214;&#195;ía2&#191;μí&#203;ù&#190;§&#213;&#241;(LSE),ê1ó&#195;íaéèμí&#203;ù&#190;§&#213;&#241;
                while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)        //&#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_LSE);                //éè&#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_ALR, 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_EnterConfigMode();/// &#212;êDí&#197;&#228;&#214;&#195;       
                RTC_SetPrescaler(32767); //éè&#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(Current_year,Current_month,Current_day,Current_hour,Current_min,Current_sec);  //éè&#214;&#195;ê±&#188;&#228;                       
                RTC_ExitConfigMode(); //í&#203;3&#246;&#197;&#228;&#214;&#195;&#196;£ê&#189;  
                BKP_WriteBackupRegister(BKP_DR1, 0X5050);        //&#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_ITConfig(RTC_IT_ALR, ENABLE);        //ê1&#196;ü&#196;&#214;&#214;ó&#195;&#235;&#214;D&#182;&#207;
                RTC_ClearITPendingBit(RTC_IT_ALR);
                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;
  RTC_SetAlarm(RTC_GetCounter()+10);
  RTC_WaitForLastTask();               
        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_ALR)!= RESET)//&#196;&#214;&#214;ó&#214;D&#182;&#207;
        {
                RTC_ClearITPendingBit(RTC_IT_ALR);                //&#199;&#229;&#196;&#214;&#214;ó&#214;D&#182;&#207;
    get_10sec_flag=1;               
  }                
  RTC_ClearITPendingBit(RTC_IT_OW);       
        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_WaitForLastTask();
        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é         
        RTC_Get();

        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;ó
        return 0;
}       

我发送的指令是:ED 27 11 0D 07 E3 07 03 06 3A 00 34 EA,也就是把当前时间改为2019年7月3日6点58分0秒
就是发出这条指令后,我观察到RTC CNT计数器的值在变,但是RTC_Get就是取不出这个变化的值,想了半天我真不知道是什么原因。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
C919WAY
1楼-- · 2019-07-20 23:10
已经搞定了,我修改了RTC时间,却没有修改闹钟唤醒的时间,导致逻辑错误
为什么每次发完帖子就搞定了?
难道论坛真是神一般的存在,已经好几次出现这种情况了。
潭子里有大神。。。。。。
1208
2楼-- · 2019-07-21 01:58
整理发帖过程梳理一下思路吧!弄好的帖子可以的话,也一起分享出来
C919WAY
3楼-- · 2019-07-21 07:02
 精彩回答 2  元偷偷看……

一周热门 更多>