STM32F407修改RTC时间
初次配置RTC时间完成以后,再次修改时间方法
1、正确调用设置时间的库函数
ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
{
uint32_t tmpreg = 0;
ErrorStatus status = ERROR;
/* Check the parameters */
assert_param(IS_RTC_FORMAT(RTC_Format));
if (RTC_Format == RTC_Format_BIN)
{
if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
{
assert_param(IS_RTC_HOUR12(RTC_TimeStruct->RTC_Hours));
assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12));
}
else
{
RTC_TimeStruct->RTC_H12 = 0x00;
assert_param(IS_RTC_HOUR24(RTC_TimeStruct->RTC_Hours));
}
assert_param(IS_RTC_MINUTES(RTC_TimeStruct->RTC_Minutes));
assert_param(IS_RTC_SECONDS(RTC_TimeStruct->RTC_Seconds));
}
else
{
if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
{
tmpreg = RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours);
assert_param(IS_RTC_HOUR12(tmpreg));
assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12));
}
else
{
RTC_TimeStruct->RTC_H12 = 0x00;
assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours)));
}
assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes)));
assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds)));
}
/* Check the input parameters format */
if (RTC_Format != RTC_Format_BIN)
{
tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
}
else
{
tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \
((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \
(((uint32_t)RTC_TimeStruct->RTC_H12) << 16));
}
/* Disable the write protection for RTC registers */
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
/* Set Initialization mode */
if (RTC_EnterInitMode() == ERROR)
{
status = ERROR;
}
else
{
/* Set the RTC_TR register */
RTC->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK);
/* Exit Initialization mode */
RTC_ExitInitMode();
/* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
if ((RTC->CR & RTC_CR_BYPSHAD) == RESET)
{
if(RTC_WaitForSynchro() == ERROR)
{
status = ERROR;
}
else
{
status = SUCCESS;
}
}
else
{
status = SUCCESS;
}
}
/* Enable the write protection for RTC registers */
RTC->WPR = 0xFF;
return status;
}
2、在初始化过程中一般会设置是否是第一次配置的标志位RTC_BKP_DR0)是否等于0x5050
if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050) //是否第一次配置?
然后在初始化结尾将标志位0x5050赋予RTC_BKP_DR0
RTC_WriteBackupRegister(RTC_BKP_DR0,0x5051); //标记已经初始化过了
再次配置时间需要修改标志位RTC_BKP_DR0的值比如0x5051
RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5051
这样就可以完成修改