OpenEdv-开源电子网

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

STM32F407 RTC设置日期时间,重启才能生效!

[复制链接]

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-1-31
在线时间
13 小时
发表于 2016-4-27 16:32:57 | 显示全部楼层 |阅读模式
10金钱
开发环境:IAR
MCU:STM32F407ZGT6
问题描述:RTC初始化后,通过串口发送时间来更新,RTC日期时间信息。更新后读取RTC时间,还是原来的时间,更新失败!这时复位MCU,在读取RTC时间,显示更新后的时间!
代码:
1.RTC初始化代码:
u8 My_RTC_Init(void)
{
        RTC_InitTypeDef RTC_InitStructure;
        u16 retry = 0X1FFF;
        RTC_TimeTypeDef time;
        RTC_DateTypeDef date;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
        PWR_BackupAccessCmd(ENABLE);        //使能后备寄存器访问

        if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x1050)                //是否第一次配置?
        {
                RCC_LSEConfig(RCC_LSE_ON);//LSE 开启   
                while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)        //检查指定的RCC标志位设置与否,等待低速晶振就绪
                {
                        retry++;
                        delay_ms(10);
                }
                if (retry == 0)return 1;                //LSE 开启失败.

                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟   
                RCC_RTCCLKCmd(ENABLE);        //使能RTC时钟

                RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//RTC异步分频系数(1~0X7F)
                RTC_InitStructure.RTC_SynchPrediv = 0xFF;//RTC同步分频系数(0~7FFF)
                RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//RTC设置为,24小时格式
                RTC_Init(&RTC_InitStructure);

                RTC_Set_Time(23, 59, 56, RTC_H12_AM);        //设置时间
                RTC_Set_Date(14, 5, 5, 1);                //设置日期

                RTC_WriteBackupRegister(RTC_BKP_DR0, 0x1050);        //标记已经初始化过了
        }
        RTC_GetDate(RTC_Format_BIN, &date);
        RTC_GetTime(RTC_Format_BIN, &time);
        printf("当前时间:%d-%d-%d %d:%d:%d\r\n", date.RTC_Year, date.RTC_Month, date.RTC_Date, time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds);
        return 0;
}

2.更新RTC时间代码(部分)
  if(crc_check==crc_get&&U5_DMA_R_BUF[0]==0xF2)
        {
          RTC_GetDate(RTC_Format_BIN, &date);
          RTC_GetTime(RTC_Format_BIN, &time);
          printf("当前时间:%d-%d-%d %d:%d:%d\r\n", date.RTC_Year, date.RTC_Month, date.RTC_Date, time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds);
          date.RTC_Year = U5_DMA_R_BUF[1] * 256 + U5_DMA_R_BUF[2] - 2000;
          date.RTC_Month = U5_DMA_R_BUF[3];
          date.RTC_Date = U5_DMA_R_BUF[4];
          date.RTC_WeekDay = RTC_Get_Week(date.RTC_Year+2000,date.RTC_Month,date.RTC_Date);
          time.RTC_Hours = U5_DMA_R_BUF[5];
          time.RTC_Minutes = U5_DMA_R_BUF[6];
          time.RTC_Seconds = U5_DMA_R_BUF[7];
          printf("网络时间:%d-%d-%d %d:%d:%d\r\n", date.RTC_Year, date.RTC_Month, date.RTC_Date, time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds);
          RTC_SetDate(RTC_Format_BIN, &date);
          RTC_SetTime(RTC_Format_BIN, &time);
          printf("网络校时....\r\n");
          RTC_GetDate(RTC_Format_BIN, &date);
          RTC_GetTime(RTC_Format_BIN, &time);
          printf("当前时间:%d-%d-%d %d:%d:%d\r\n", date.RTC_Year, date.RTC_Month, date.RTC_Date, time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds);
        }


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

使用道具 举报

10

主题

254

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2015-10-17
在线时间
145 小时
发表于 2016-4-27 17:24:22 | 显示全部楼层
这个用硬件仿真的方式,看下数据发过来之后,是卡到哪里了
开着单片机翱翔在天空
回复

使用道具 举报

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-1-31
在线时间
13 小时
 楼主| 发表于 2016-4-27 17:27:59 | 显示全部楼层
原_子_哥门徒 发表于 2016-4-27 17:24
这个用硬件仿真的方式,看下数据发过来之后,是卡到哪里了

程序没有卡,设置断点,单步调试,所有函数执行正常
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-9-22
在线时间
7 小时
发表于 2016-10-18 15:47:28 | 显示全部楼层
蓝翔辍学生 发表于 2016-4-27 17:27
程序没有卡,设置断点,单步调试,所有函数执行正常

你好,请问你的问题解决了吗?
回复

使用道具 举报

48

主题

208

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1371
金钱
1371
注册时间
2015-3-24
在线时间
190 小时
发表于 2016-10-18 16:03:13 | 显示全部楼层
\\\\\这种问题也是第一次遇到过,个人觉得估计是你的RTC芯片问题?用的啥子芯?
小时在工地上玩,捡了一个根木棒回家,麻麻问我捡这破玩意回来有什么用?我脑子一热,就说“你可以用它来打我啊!!”
于是,一根木棒伴随了我很多年。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-10-18 21:02:02 | 显示全部楼层
我们开发板么?试试MDK版本代码。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-10-26
在线时间
2 小时
发表于 2018-10-26 16:27:32 | 显示全部楼层
在读写之前,加上函数
RTC_WaitForSynchro();
应该就可以了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-9-25
在线时间
0 小时
发表于 2019-9-25 15:20:27 | 显示全部楼层
将RTC_GetDate(RTC_Format_BIN, &date); RTC_GetTime(RTC_Format_BIN, &time);两函数位置颠倒一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 18:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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