in CORTEX_M0_FT32F072_KEIL/Source/Libraries/FT32F0xx_Driver/Src/ft32f0xx_rtc.c [605:687]
ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
{
uint32_t tmpreg = 0;
ErrorStatus status = ERROR;
/* Check the parameters */
assert_param(IS_RTC_FORMAT(RTC_Format));
if ((RTC_Format == RTC_Format_BIN) && ((RTC_DateStruct->RTC_Month & 0x10) == 0x10))
{
RTC_DateStruct->RTC_Month = (RTC_DateStruct->RTC_Month & (uint32_t)~(0x10)) + 0x0A;
}
if (RTC_Format == RTC_Format_BIN)
{
assert_param(IS_RTC_YEAR(RTC_DateStruct->RTC_Year));
assert_param(IS_RTC_MONTH(RTC_DateStruct->RTC_Month));
assert_param(IS_RTC_DATE(RTC_DateStruct->RTC_Date));
}
else
{
assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year)));
tmpreg = RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month);
assert_param(IS_RTC_MONTH(tmpreg));
tmpreg = RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date);
assert_param(IS_RTC_DATE(tmpreg));
}
assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
/* Check the input parameters format */
if (RTC_Format != RTC_Format_BIN)
{
tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
(((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
((uint32_t)RTC_DateStruct->RTC_Date) | \
(((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
}
else
{
tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \
((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \
((uint32_t)RTC_DateStruct->RTC_WeekDay << 13));
}
/* 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_DR register */
RTC->DR = (uint32_t)(tmpreg & RTC_DR_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;
}