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

2019-07-20 05:32发布

开发环境: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 ", 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 ", 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 ", 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("网络校时.... ");
          RTC_GetDate(RTC_Format_BIN, &date);
          RTC_GetTime(RTC_Format_BIN, &time);
          printf("当前时间:%d-%d-%d %d:%d:%d ", date.RTC_Year, date.RTC_Month, date.RTC_Date, time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds);
        }


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
原_子_哥门徒
1楼-- · 2019-07-20 07:11
 精彩回答 2  元偷偷看……
蓝翔辍学生
2楼-- · 2019-07-20 12:31
原_子_哥门徒 发表于 2016-4-27 17:24
这个用硬件仿真的方式,看下数据发过来之后,是卡到哪里了

程序没有卡,设置断点,单步调试,所有函数执行正常
sddzycnq
3楼-- · 2019-07-20 13:35
蓝翔辍学生 发表于 2016-4-27 17:27
程序没有卡,设置断点,单步调试,所有函数执行正常

你好,请问你的问题解决了吗?
1206447373
4楼-- · 2019-07-20 15:04
 精彩回答 2  元偷偷看……
正点原子
5楼-- · 2019-07-20 19:19
 精彩回答 2  元偷偷看……
冰融潇
6楼-- · 2019-07-20 20:46
在读写之前,加上函数
RTC_WaitForSynchro();
应该就可以了

一周热门 更多>