|
版主好,最近在做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;
};
不知道有没有问题 |
|