mbed library sources
Dependents: frdm_kl05z_gpio_test
Fork of mbed-src by
targets/cmsis/TARGET_STM/TARGET_NUCLEO_F103RB/stm32f10x_rtc.c
- Committer:
- shaoziyang
- Date:
- 2014-09-13
- Revision:
- 323:9e901b0a5aa1
- Parent:
- 84:f54042cbc282
File content as of revision 323:9e901b0a5aa1:
/** ****************************************************************************** * @file stm32f10x_rtc.c * @author MCD Application Team * @version V3.6.1 * @date 05-March-2012 * @brief This file provides all the RTC firmware functions. ******************************************************************************* * Copyright (c) 2014, STMicroelectronics * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************* */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_rtc.h" /** @addtogroup STM32F10x_StdPeriph_Driver * @{ */ /** @defgroup RTC * @brief RTC driver modules * @{ */ /** @defgroup RTC_Private_TypesDefinitions * @{ */ /** * @} */ /** @defgroup RTC_Private_Defines * @{ */ #define RTC_LSB_MASK ((uint32_t)0x0000FFFF) /*!< RTC LSB Mask */ #define PRLH_MSB_MASK ((uint32_t)0x000F0000) /*!< RTC Prescaler MSB Mask */ /** * @} */ /** @defgroup RTC_Private_Macros * @{ */ /** * @} */ /** @defgroup RTC_Private_Variables * @{ */ /** * @} */ /** @defgroup RTC_Private_FunctionPrototypes * @{ */ /** * @} */ /** @defgroup RTC_Private_Functions * @{ */ /** * @brief Enables or disables the specified RTC interrupts. * @param RTC_IT: specifies the RTC interrupts sources to be enabled or disabled. * This parameter can be any combination of the following values: * @arg RTC_IT_OW: Overflow interrupt * @arg RTC_IT_ALR: Alarm interrupt * @arg RTC_IT_SEC: Second interrupt * @param NewState: new state of the specified RTC interrupts. * This parameter can be: ENABLE or DISABLE. * @retval None */ void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RTC_IT(RTC_IT)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RTC->CRH |= RTC_IT; } else { RTC->CRH &= (uint16_t)~RTC_IT; } } /** * @brief Enters the RTC configuration mode. * @param None * @retval None */ void RTC_EnterConfigMode(void) { /* Set the CNF flag to enter in the Configuration Mode */ RTC->CRL |= RTC_CRL_CNF; } /** * @brief Exits from the RTC configuration mode. * @param None * @retval None */ void RTC_ExitConfigMode(void) { /* Reset the CNF flag to exit from the Configuration Mode */ RTC->CRL &= (uint16_t)~((uint16_t)RTC_CRL_CNF); } /** * @brief Gets the RTC counter value. * @param None * @retval RTC counter value. */ uint32_t RTC_GetCounter(void) { uint16_t high1 = 0, high2 = 0, low = 0; high1 = RTC->CNTH; low = RTC->CNTL; high2 = RTC->CNTH; if (high1 != high2) { /* In this case the counter roll over during reading of CNTL and CNTH registers, read again CNTL register then return the counter value */ return (((uint32_t) high2 << 16 ) | RTC->CNTL); } else { /* No counter roll over during reading of CNTL and CNTH registers, counter value is equal to first value of CNTL and CNTH */ return (((uint32_t) high1 << 16 ) | low); } } /** * @brief Sets the RTC counter value. * @param CounterValue: RTC counter new value. * @retval None */ void RTC_SetCounter(uint32_t CounterValue) { RTC_EnterConfigMode(); /* Set RTC COUNTER MSB word */ RTC->CNTH = CounterValue >> 16; /* Set RTC COUNTER LSB word */ RTC->CNTL = (CounterValue & RTC_LSB_MASK); RTC_ExitConfigMode(); } /** * @brief Sets the RTC prescaler value. * @param PrescalerValue: RTC prescaler new value. * @retval None */ void RTC_SetPrescaler(uint32_t PrescalerValue) { /* Check the parameters */ assert_param(IS_RTC_PRESCALER(PrescalerValue)); RTC_EnterConfigMode(); /* Set RTC PRESCALER MSB word */ RTC->PRLH = (PrescalerValue & PRLH_MSB_MASK) >> 16; /* Set RTC PRESCALER LSB word */ RTC->PRLL = (PrescalerValue & RTC_LSB_MASK); RTC_ExitConfigMode(); } /** * @brief Sets the RTC alarm value. * @param AlarmValue: RTC alarm new value. * @retval None */ void RTC_SetAlarm(uint32_t AlarmValue) { RTC_EnterConfigMode(); /* Set the ALARM MSB word */ RTC->ALRH = AlarmValue >> 16; /* Set the ALARM LSB word */ RTC->ALRL = (AlarmValue & RTC_LSB_MASK); RTC_ExitConfigMode(); } /** * @brief Gets the RTC divider value. * @param None * @retval RTC Divider value. */ uint32_t RTC_GetDivider(void) { uint32_t tmp = 0x00; tmp = ((uint32_t)RTC->DIVH & (uint32_t)0x000F) << 16; tmp |= RTC->DIVL; return tmp; } /** * @brief Waits until last write operation on RTC registers has finished. * @note This function must be called before any write to RTC registers. * @param None * @retval None */ void RTC_WaitForLastTask(void) { /* Loop until RTOFF flag is set */ while ((RTC->CRL & RTC_FLAG_RTOFF) == (uint16_t)RESET) { } } /** * @brief Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL) * are synchronized with RTC APB clock. * @note This function must be called before any read operation after an APB reset * or an APB clock stop. * @param None * @retval None */ void RTC_WaitForSynchro(void) { /* Clear RSF flag */ RTC->CRL &= (uint16_t)~RTC_FLAG_RSF; /* Loop until RSF flag is set */ while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET) { } } /** * @brief Checks whether the specified RTC flag is set or not. * @param RTC_FLAG: specifies the flag to check. * This parameter can be one the following values: * @arg RTC_FLAG_RTOFF: RTC Operation OFF flag * @arg RTC_FLAG_RSF: Registers Synchronized flag * @arg RTC_FLAG_OW: Overflow flag * @arg RTC_FLAG_ALR: Alarm flag * @arg RTC_FLAG_SEC: Second flag * @retval The new state of RTC_FLAG (SET or RESET). */ FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG) { FlagStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_RTC_GET_FLAG(RTC_FLAG)); if ((RTC->CRL & RTC_FLAG) != (uint16_t)RESET) { bitstatus = SET; } else { bitstatus = RESET; } return bitstatus; } /** * @brief Clears the RTC's pending flags. * @param RTC_FLAG: specifies the flag to clear. * This parameter can be any combination of the following values: * @arg RTC_FLAG_RSF: Registers Synchronized flag. This flag is cleared only after * an APB reset or an APB Clock stop. * @arg RTC_FLAG_OW: Overflow flag * @arg RTC_FLAG_ALR: Alarm flag * @arg RTC_FLAG_SEC: Second flag * @retval None */ void RTC_ClearFlag(uint16_t RTC_FLAG) { /* Check the parameters */ assert_param(IS_RTC_CLEAR_FLAG(RTC_FLAG)); /* Clear the corresponding RTC flag */ RTC->CRL &= (uint16_t)~RTC_FLAG; } /** * @brief Checks whether the specified RTC interrupt has occurred or not. * @param RTC_IT: specifies the RTC interrupts sources to check. * This parameter can be one of the following values: * @arg RTC_IT_OW: Overflow interrupt * @arg RTC_IT_ALR: Alarm interrupt * @arg RTC_IT_SEC: Second interrupt * @retval The new state of the RTC_IT (SET or RESET). */ ITStatus RTC_GetITStatus(uint16_t RTC_IT) { ITStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_RTC_GET_IT(RTC_IT)); bitstatus = (ITStatus)(RTC->CRL & RTC_IT); if (((RTC->CRH & RTC_IT) != (uint16_t)RESET) && (bitstatus != (uint16_t)RESET)) { bitstatus = SET; } else { bitstatus = RESET; } return bitstatus; } /** * @brief Clears the RTC's interrupt pending bits. * @param RTC_IT: specifies the interrupt pending bit to clear. * This parameter can be any combination of the following values: * @arg RTC_IT_OW: Overflow interrupt * @arg RTC_IT_ALR: Alarm interrupt * @arg RTC_IT_SEC: Second interrupt * @retval None */ void RTC_ClearITPendingBit(uint16_t RTC_IT) { /* Check the parameters */ assert_param(IS_RTC_IT(RTC_IT)); /* Clear the corresponding RTC pending bit */ RTC->CRL &= (uint16_t)~RTC_IT; } /** * @} */ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/