硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5990|回复: 4
收起左侧

[有问必答] RTC问题的请教

[复制链接]

3

主题

4

回帖

13

积分

新手上路

积分
13
发表于 2016-10-24 22:54:32 | 显示全部楼层 |阅读模式
版主好,最近在做stm32F407 VGT6的RTC 实验。测试发现,重新配置时间时,时分秒参数写入后能立即生效,但是年月日参数写入后却不能立刻生效。
并且我监视了 RTC-DR寄存器,发现写入前后该寄存器值没有发生变化。更为奇葩的是,我复位后,再次读取得RTC-DR  寄存器值,竟然和我写入的一致。
比如: 写入前 读   RTC-DR寄存器值 为 0x103212,写入0x113212后再读 RTC-DR寄存器值还是 0x103212。复位重启后,读RTC-DR寄存器值则是0x113212。希望版主能帮忙解答下。
程序

static uint8_t RTC_WakeUP(void);

RTC_TimeTypeDef RTC_TimeStructure;
RTC_DateTypeDef RTC_DateStructure;

void RTC_Init_Config(void)
{
    RTC_InitTypeDef RTC_InitStructure;   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
    PWR_BackupAccessCmd(ENABLE);
    RTC_WakeUP();

    if(0xA5A1!=RTC_ReadBackupRegister(RTC_BKP_DR0))
    {
        RCC_LSEConfig(RCC_LSE_ON);
            while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
                    {
                    }

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
        RCC_RTCCLKCmd(ENABLE);
        RTC_InitStructure.RTC_AsynchPrediv = 0x7f;
        RTC_InitStructure.RTC_SynchPrediv  = 0xff;
        RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
        RTC_Init(&RTC_InitStructure);   
        Set_RTC_Time(19,12,24,16,20,20,2);
        RTC_WriteBackupRegister(RTC_BKP_DR0, 0xA5A1);
    }
    else
    {
            
   
    }
}

uint8_t RTC_Param_Config(uint16_t year,
                                        uint8_t month,
                                        uint8_t day,
                                        uint8_t hour,
                                        uint8_t minute,
                                        uint8_t second,
                                        uint8_t week)
{

    RTC_InitTypeDef RTC_InitStructure;   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
    PWR_BackupAccessCmd(ENABLE);
    RTC_WakeUP();

        RCC_LSEConfig(RCC_LSE_ON);
            while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
                    {
                    }

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
        RCC_RTCCLKCmd(ENABLE);
        //RTC_WaitForSynchro();
        RTC_InitStructure.RTC_AsynchPrediv = 0x7f;
        RTC_InitStructure.RTC_SynchPrediv  = 0xff;
        RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
        RTC_Init(&RTC_InitStructure);   
        //RTC_Param_Config(16,12,24,16,20,20,2);



    Set_RTC_Time(year,month,day,hour,minute,second,week);

        return 0;
}


void Set_RTC_Time(uint16_t year,
                                        uint8_t month,
                                        uint8_t day,
                                        uint8_t hour,
                                        uint8_t minute,
                                        uint8_t second,
                                        uint8_t week)
{

    RTC_TimeStructure.RTC_Hours=hour;
    RTC_TimeStructure.RTC_Minutes=minute;
    RTC_TimeStructure.RTC_Seconds=second;
   
    RTC_DateStructure.RTC_Year=year;
    RTC_DateStructure.RTC_Month=month;
    RTC_DateStructure.RTC_Date=day;
    RTC_DateStructure.RTC_WeekDay=week;
    while (RTC_SetDate(RTC_Format_BIN,&RTC_DateStructure)==ERROR) {};
    while (RTC_SetTime(RTC_Format_BIN,&RTC_TimeStructure)==ERROR ){};         
}

static uint8_t RTC_WakeUP(void)
{
    EXTI_InitTypeDef  EXTI_InitStructure;
    NVIC_InitTypeDef  NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
    RTC_WakeUpCmd(DISABLE);
    RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div8);
    RTC_SetWakeUpCounter(4096);
    RTC_ClearITPendingBit(RTC_IT_WUT);
    EXTI_ClearITPendingBit(EXTI_Line22);
    RTC_ITConfig(RTC_IT_WUT,ENABLE);
    RTC_WakeUpCmd(ENABLE);
   
    EXTI_InitStructure.EXTI_Line=EXTI_Line22;
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
   
    EXTI_Init(&EXTI_InitStructure);
   
    NVIC_InitStructure.NVIC_IRQChannel=RTC_WKUP_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
   
    NVIC_Init(&NVIC_InitStructure);
    return 0;
}


uint8_t  Read_RealTime(Time_Def_Structure *pTime_Struct_Instance)
{
//    RTC_TimeTypeDef RTC_TimeStructure;
//    RTC_DateTypeDef RTC_DateStructure;
    RTC_GetDate(RTC_Format_BIN,&RTC_DateStructure);
    RTC_GetTime(RTC_Format_BIN,&RTC_TimeStructure);
   
    pTime_Struct_Instance->RTC_Year            =        RTC_DateStructure.RTC_Year;
    pTime_Struct_Instance->RTC_Month        =        RTC_DateStructure.RTC_Month;
    pTime_Struct_Instance->RTC_Date            =        RTC_DateStructure.RTC_Date;
    pTime_Struct_Instance->RTC_WeekDay    =        RTC_DateStructure.RTC_WeekDay;

    pTime_Struct_Instance->RTC_Hours            =        RTC_TimeStructure.RTC_Hours;
    pTime_Struct_Instance->RTC_Minutes        =        RTC_TimeStructure.RTC_Minutes;
    pTime_Struct_Instance->RTC_Seconds        =        RTC_TimeStructure.RTC_Seconds;
    return 0;

};



不知道有没有问题
回复

使用道具 举报

3

主题

4

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2016-10-24 22:55:46 | 显示全部楼层
在吗,版主
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-10-25 10:27:22 | 显示全部楼层
你用的是F407吗,F407有个bug,你设置完毕时间和日期后,读取的时候一定要先读取时间,然后读取日期才可以

    RTC_GetTime(RTC_Format_BIN,&RTC_TimeStructure);
    RTC_GetDate(RTC_Format_BIN,&RTC_DateStructure);
回复

使用道具 举报

3

主题

4

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2016-10-25 10:33:28 | 显示全部楼层

回 eric2013 的帖子

eric2013:你用的是F407吗,F407有个bug,你设置完毕时间和日期后,读取的时候一定要先读取时间,然后读取日期才可以

    RTC_GetTime(RTC_Format_BIN,&RTC_TimeStructure);
    RTC_GetDate(RTC_Format_BIN,&RTC_DateStructure);
 (2016-10-25 10:27) 
果然是这样,解决了。有官方文档说明这个问题吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-10-25 10:34:43 | 显示全部楼层

回 406178052 的帖子

406178052:果然是这样,解决了。有官方文档说明这个问题吗? (2016-10-25 10:33) 
没有,这个是问的人多了,才发现这个奇葩的问题。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 21:31 , Processed in 0.040994 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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