求助,RTC_SetDate() 无法修改日期!

2019-10-15 20:54发布

本帖最后由 amulet116 于 2016-11-14 18:18 编辑

原子哥,小弟在用RTC的时候出现一个问题,百思不得其解,希望赐教。

RTC初始化正常,可以设置日期,时间。可是运行一段时间后,通过RTC_SetDate()重新设置日期失败,日期总是上次的日期。同时用RTC_SetTime(),可以成功修改时间。
对比RTC_SetDate() 和 RTC_SetTime(),操作基本一致,为什么呢? 修改日期是否还需要什么额外操作?

原子哥,是否碰到过同样问题 ?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
大流士一世
1楼-- · 2019-10-16 11:03
我刚刚也遇到了同样的问题,后来想明白了。
程序里面的u8 RTC_Init(void)函数中有这样一句:

if(RTC_Read_BKR(0)!=0x5050)                //是否第一次配置?
       那么在配置完成之后,RTC_Read_BKR(0)的值被设置为0x5050,所以假如我们想要在开机之后再次修改时间,进不去这个if循环,所以没法修改,时间还是上次修改之后的结果。
如果想要每次都可以修改时间,只需要去掉这个if循环,将这个函数改成:
u8 RTC_Init(void)
{
        u16 retry=0X1FFF;
        RCC->APB1ENR|=1<<28;                        //使能电源接口时钟
        PWR->CR|=1<<8;                                        //后备区域访问使能(RTC+SRAM)
        //if(RTC_Read_BKR(0)==0x5050)                //是否第一次配置?
        //{
                RCC->BDCR|=1<<0;                        //LSE 开启  
                while(retry&&((RCC->BDCR&0X02)==0))//等待LSE准备好
                {
                        retry--;
                        delay_ms(5);
                }
                if(retry==0)return 1;                //LSE 开启失败.
                RCC->BDCR|=1<<8;                        //选择LSE,作为RTC的时钟
                RCC->BDCR|=1<<15;                        //使能RTC时钟
                //关闭RTC寄存器写保护
                RTC->WPR=0xCA;
                RTC->WPR=0x53;
                if(RTC_Init_Mode())return 2;//进入RTC初始化模式
                RTC->PRER=0XFF;                                //RTC同步分频系数(0~7FFF),必须先设置同步分频,再设置异步分频,Frtc=Fclks/((Sprec+1)*(Asprec+1))
                RTC->PRER|=0X7F<<16;                //RTC异步分频系数(1~0X7F)
                RTC->CR&=~(1<<6);                        //RTC设置为,24小时格式
                RTC->ISR&=~(1<<7);                        //退出RTC初始化模式
                RTC->WPR=0xFF;                                //使能RTC寄存器写保护  
                RTC_Set_Time(21,5,12,0);        //设置时间
                RTC_Set_Date(16,7,25,3);                //设置日期
                //RTC_Set_AlarmA(7,0,0,10);        //设置闹钟时间
                //RTC_Write_BKR(0,0X5050);        //标记已经初始化过了
        //}
        //RTC_Set_WakeUp(4,0);                        //配置WAKE UP中断,1秒钟中断一次
        return 0;
}
只不过这样修改之后,每次开机都需要自己重新修改时间值。




正点原子
2楼-- · 2019-10-16 01:40
没遇到过,你直接用我们的RTC例程,测试下看看
amulet116
3楼-- · 2019-10-16 03:30
请问具体的是哪个例子?
可否给个链接,多谢了。
dingyu000111
4楼-- · 2019-10-16 06:36
我用的战舰代码,,f103,,完全不存在你说的问题,,,你去下载个库函数,,,很多demo,,这边不能给你发压缩包
正点原子
5楼-- · 2019-10-16 08:42
amulet116 发表于 2016-11-14 19:44
请问具体的是哪个例子?
可否给个链接,多谢了。

usmart实验,就可以直接修改
雨雪纷纷
6楼-- · 2019-10-16 10:51
 精彩回答 2  元偷偷看……

一周热门 更多>