📄 stm32f0xx_rtc.c
字号:
if (RTC_WaitForSynchro() == ERROR)
{
status = ERROR;
}
else
{
status = SUCCESS;
}
}
/* Enable the write protection for RTC registers */
RTC->WPR = 0xFF;
return status;
}
/**
* @brief Initializes the RTC registers according to the specified parameters
* in RTC_InitStruct.
* @param RTC_InitStruct: pointer to a RTC_InitTypeDef structure that contains
* the configuration information for the RTC peripheral.
* @note The RTC Prescaler register is write protected and can be written in
* initialization mode only.
* @retval An ErrorStatus enumeration value:
* - SUCCESS: RTC registers are initialized
* - ERROR: RTC registers are not initialized
*/
ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)
{
ErrorStatus status = ERROR;
/* Check the parameters */
assert_param(IS_RTC_HOUR_FORMAT(RTC_InitStruct->RTC_HourFormat));
assert_param(IS_RTC_ASYNCH_PREDIV(RTC_InitStruct->RTC_AsynchPrediv));
assert_param(IS_RTC_SYNCH_PREDIV(RTC_InitStruct->RTC_SynchPrediv));
/* Disable the write protection for RTC registers */
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
/* Set Initialization mode */
if (RTC_EnterInitMode() == ERROR)
{
status = ERROR;
}
else
{
/* Clear RTC CR FMT Bit */
RTC->CR &= ((uint32_t)~(RTC_CR_FMT));
/* Set RTC_CR register */
RTC->CR |= ((uint32_t)(RTC_InitStruct->RTC_HourFormat));
/* Configure the RTC PRER */
RTC->PRER = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv);
RTC->PRER |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16);
/* Exit Initialization mode */
RTC_ExitInitMode();
status = SUCCESS;
}
/* Enable the write protection for RTC registers */
RTC->WPR = 0xFF;
return status;
}
/**
* @brief Fills each RTC_InitStruct member with its default value.
* @param RTC_InitStruct: pointer to a RTC_InitTypeDef structure which will be
* initialized.
* @retval None
*/
void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct)
{
/* Initialize the RTC_HourFormat member */
RTC_InitStruct->RTC_HourFormat = RTC_HourFormat_24;
/* Initialize the RTC_AsynchPrediv member */
RTC_InitStruct->RTC_AsynchPrediv = (uint32_t)0x7F;
/* Initialize the RTC_SynchPrediv member */
RTC_InitStruct->RTC_SynchPrediv = (uint32_t)0xFF;
}
/**
* @brief Enables or disables the RTC registers write protection.
* @note All the RTC registers are write protected except for RTC_ISR[13:8],
* RTC_TAFCR and RTC_BKPxR.
* @note Writing a wrong key reactivates the write protection.
* @note The protection mechanism is not affected by system reset.
* @param NewState: new state of the write protection.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void RTC_WriteProtectionCmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the write protection for RTC registers */
RTC->WPR = 0xFF;
}
else
{
/* Disable the write protection for RTC registers */
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
}
}
/**
* @brief Enters the RTC Initialization mode.
* @note The RTC Initialization mode is write protected, use the
* RTC_WriteProtectionCmd(DISABLE) before calling this function.
* @param None
* @retval An ErrorStatus enumeration value:
* - SUCCESS: RTC is in Init mode
* - ERROR: RTC is not in Init mode
*/
ErrorStatus RTC_EnterInitMode(void)
{
__IO uint32_t initcounter = 0x00;
ErrorStatus status = ERROR;
uint32_t initstatus = 0x00;
/* Check if the Initialization mode is set */
if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t)RESET)
{
/* Set the Initialization mode */
RTC->ISR = (uint32_t)RTC_INIT_MASK;
/* Wait till RTC is in INIT state and if Time out is reached exit */
do
{
initstatus = RTC->ISR & RTC_ISR_INITF;
initcounter++;
} while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));
if ((RTC->ISR & RTC_ISR_INITF) != RESET)
{
status = SUCCESS;
}
else
{
status = ERROR;
}
}
else
{
status = SUCCESS;
}
return (status);
}
/**
* @brief Exits the RTC Initialization mode.
* @note When the initialization sequence is complete, the calendar restarts
* counting after 4 RTCCLK cycles.
* @note The RTC Initialization mode is write protected, use the
* RTC_WriteProtectionCmd(DISABLE) before calling this function.
* @param None
* @retval None
*/
void RTC_ExitInitMode(void)
{
/* Exit Initialization mode */
RTC->ISR &= (uint32_t)~RTC_ISR_INIT;
}
/**
* @brief Waits until the RTC Time and Date registers (RTC_TR and RTC_DR) are
* synchronized with RTC APB clock.
* @note The RTC Resynchronization mode is write protected, use the
* RTC_WriteProtectionCmd(DISABLE) before calling this function.
* @note To read the calendar through the shadow registers after Calendar
* initialization, calendar update or after wakeup from low power modes
* the software must first clear the RSF flag.
* The software must then wait until it is set again before reading
* the calendar, which means that the calendar registers have been
* correctly copied into the RTC_TR and RTC_DR shadow registers.
* @param None
* @retval An ErrorStatus enumeration value:
* - SUCCESS: RTC registers are synchronised
* - ERROR: RTC registers are not synchronised
*/
ErrorStatus RTC_WaitForSynchro(void)
{
__IO uint32_t synchrocounter = 0;
ErrorStatus status = ERROR;
uint32_t synchrostatus = 0x00;
if ((RTC->CR & RTC_CR_BYPSHAD) != RESET)
{
/* Bypass shadow mode */
status = SUCCESS;
}
else
{
/* Disable the write protection for RTC registers */
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
/* Clear RSF flag */
RTC->ISR &= (uint32_t)RTC_RSF_MASK;
/* Wait the registers to be synchronised */
do
{
synchrostatus = RTC->ISR & RTC_ISR_RSF;
synchrocounter++;
} while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00));
if ((RTC->ISR & RTC_ISR_RSF) != RESET)
{
status = SUCCESS;
}
else
{
status = ERROR;
}
/* Enable the write protection for RTC registers */
RTC->WPR = 0xFF;
}
return (status);
}
/**
* @brief Enables or disables the RTC reference clock detection.
* @param NewState: new state of the RTC reference clock.
* This parameter can be: ENABLE or DISABLE.
* @retval An ErrorStatus enumeration value:
* - SUCCESS: RTC reference clock detection is enabled
* - ERROR: RTC reference clock detection is disabled
*/
ErrorStatus RTC_RefClockCmd(FunctionalState NewState)
{
ErrorStatus status = ERROR;
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
/* Disable the write protection for RTC registers */
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
/* Set Initialization mode */
if (RTC_EnterInitMode() == ERROR)
{
status = ERROR;
}
else
{
if (NewState != DISABLE)
{
/* Enable the RTC reference clock detection */
RTC->CR |= RTC_CR_REFCKON;
}
else
{
/* Disable the RTC reference clock detection */
RTC->CR &= ~RTC_CR_REFCKON;
}
/* Exit Initialization mode */
RTC_ExitInitMode();
status = SUCCESS;
}
/* Enable the write protection for RTC registers */
RTC->WPR = 0xFF;
return status;
}
/**
* @brief Enables or Disables the Bypass Shadow feature.
* @note When the Bypass Shadow is enabled the calendar value are taken
* directly from the Calendar counter.
* @param NewState: new state of the Bypass Shadow feature.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void RTC_BypassShadowCmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
/* Disable the write protection for RTC registers */
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
if (NewState != DISABLE)
{
/* Set the BYPSHAD bit */
RTC->CR |= (uint8_t)RTC_CR_BYPSHAD;
}
else
{
/* Reset the BYPSHAD bit */
RTC->CR &= (uint8_t)~RTC_CR_BYPSHAD;
}
/* Enable the write protection for RTC registers */
RTC->WPR = 0xFF;
}
/**
* @}
*/
/** @defgroup RTC_Group2 Time and Date configuration functions
* @brief Time and Date configuration functions
*
@verbatim
===============================================================================
##### Time and Date configuration functions #####
===============================================================================
[..] This section provide functions allowing to program and read the RTC
Calendar (Time and Date).
@endverbatim
* @{
*/
/**
* @brief Set the RTC current time.
* @param RTC_Format: specifies the format of the entered parameters.
* This parameter can be one of the following values:
* @arg RTC_Format_BIN: Binary data format
* @arg RTC_Format_BCD: BCD data format
* @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that contains
* the time configuration information for the RTC.
* @retval An ErrorStatus enumeration value:
* - SUCCESS: RTC Time register is configured
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -