/STM32F0xx_StdPeriph_Lib_V1.0.0/Project/STM32F0xx_StdPeriph_Examples/RTC/RTC_LSI/main.c
https://github.com/rurume/stm32-test · C · 276 lines · 107 code · 50 blank · 119 comment · 8 complexity · 0827150f376ad6de339dd7171f37c54d MD5 · raw file
- /**
- ******************************************************************************
- * @file RTC/RTC_LSI/main.c
- * @author MCD Application Team
- * @version V1.0.0
- * @date 18-May-2012
- * @brief Main program body
- ******************************************************************************
- * @attention
- *
- * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
- *
- * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************
- */
-
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
-
- /** @addtogroup STM32F0xx_StdPeriph_Examples
- * @{
- */
-
- /** @addtogroup RTC_LSI
- * @{
- */
-
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- RTC_InitTypeDef RTC_InitStructure;
- __IO uint32_t LsiFreq = 0;
- __IO uint32_t CaptureNumber = 0, PeriodValue = 0;
-
- /* Private function prototypes -----------------------------------------------*/
- void RTC_Config(void);
- uint32_t GetLSIFrequency(void);
-
- /* Private functions ---------------------------------------------------------*/
-
- /**
- * @brief Main program.
- * @param None
- * @retval None
- */
- int main(void)
- {
- /*!< At this stage the microcontroller clock setting is already configured,
- this is done through SystemInit() function which is called from startup
- file (startup_stm32f0xx.s) before to branch to application main.
- To reconfigure the default setting of SystemInit() function, refer to
- system_stm32f0xx.c file
- */
-
- /* Initialize LEDs mounted on STM320518-EVAL board --------------------------*/
- STM_EVAL_LEDInit(LED1);
- STM_EVAL_LEDInit(LED2);
- STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO);
-
- /* RTC Configuration -------------------------------------------------------*/
- RTC_Config();
-
- /* Wait Until KEY BUTTON is pressed */
- while(STM_EVAL_PBGetState(BUTTON_KEY) != RESET)
- {
- }
-
- /* Get the LSI frequency: TIM14 is used to measure the LSI frequency */
- LsiFreq = GetLSIFrequency();
-
- /* Turn on LED2 */
- STM_EVAL_LEDOn(LED2);
-
- /* Calendar Configuration */
- RTC_InitStructure.RTC_AsynchPrediv = 99;
- RTC_InitStructure.RTC_SynchPrediv = (LsiFreq/100) - 1;
- RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
- RTC_Init(&RTC_InitStructure);
-
- /* Infinite loop */
- while (1)
- {
- }
- }
-
- /**
- * @brief Configure the RTC peripheral by selecting the clock source.
- * @param None
- * @retval None
- */
- void RTC_Config(void)
- {
- RTC_TimeTypeDef RTC_TimeStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- RTC_AlarmTypeDef RTC_AlarmStructure;
- /* Enable the PWR clock */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
-
- /* Allow access to RTC */
- PWR_BackupAccessCmd(ENABLE);
-
- /* LSI used as RTC source clock */
- /* The RTC Clock may varies due to LSI frequency dispersion. */
- /* Enable the LSI OSC */
- RCC_LSICmd(ENABLE);
-
- /* Wait till LSI is ready */
- while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
- {
- }
-
- /* Select the RTC Clock Source */
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
-
- /* Enable the RTC Clock */
- RCC_RTCCLKCmd(ENABLE);
-
- /* Wait for RTC APB registers synchronisation */
- RTC_WaitForSynchro();
-
- /* Calendar Configuration */
- RTC_InitStructure.RTC_AsynchPrediv = 99;
- RTC_InitStructure.RTC_SynchPrediv = 399; /* (40KHz / 100) - 1 = 399*/
- RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
- RTC_Init(&RTC_InitStructure);
-
- /* EXTI configuration *******************************************************/
- EXTI_ClearITPendingBit(EXTI_Line17);
- EXTI_InitStructure.EXTI_Line = EXTI_Line17;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
-
- /* Enable the RTC Wakeup Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- /* Set the alarm X+5s */
- RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM;
- RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 0x00;
- RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0x00;
- RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0x01;
- RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;
- RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
- RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;
- RTC_SetAlarm(RTC_Format_BCD, RTC_Alarm_A, &RTC_AlarmStructure);
-
- RTC_ITConfig(RTC_IT_ALRA, ENABLE);
-
- /* Enable the alarm */
- RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
-
- /* Set the time to 00h 00mn 00s AM */
- RTC_TimeStructure.RTC_H12 = RTC_H12_AM;
- RTC_TimeStructure.RTC_Hours = 0x00;
- RTC_TimeStructure.RTC_Minutes = 0x00;
- RTC_TimeStructure.RTC_Seconds = 0x00;
-
- RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);
- }
-
- /**
- * @brief Configures TIM14 to measure the LSI oscillator frequency.
- * @param None
- * @retval LSI Frequency
- */
- uint32_t GetLSIFrequency(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- RCC_ClocksTypeDef RCC_ClockFreq;
-
- /* TIM14 configuration *******************************************************/
- /* Enable TIM14 clock */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
-
- /* Reset TIM14 registers */
- TIM_DeInit(TIM14);
-
- /* Configure TIM14 prescaler */
- TIM_PrescalerConfig(TIM14, 0, TIM_PSCReloadMode_Immediate);
-
- /* Connect internally the TIM14_CH1 to the RTC clock output */
- TIM_RemapConfig(TIM14, TIM14_RTC_CLK);
-
- /* TIM14 configuration: Input Capture mode ---------------------
- The reference clock(LSE or external) is connected to TIM14 CH1
- The Rising edge is used as active edge,
- The TIM14 CCR1 is used to compute the frequency value
- ------------------------------------------------------------ */
- TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
- TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV8;
- TIM_ICInitStructure.TIM_ICFilter = 0x0;
- TIM_ICInit(TIM14, &TIM_ICInitStructure);
-
- /* Enable the TIM14 global Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = TIM14_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- /* Enable TIM14 counter */
- TIM_Cmd(TIM14, ENABLE);
-
- /* Reset the flags */
- TIM14->SR = 0;
-
- /* Enable the CC1 Interrupt Request */
- TIM_ITConfig(TIM14, TIM_IT_CC1, ENABLE);
-
-
- /* Wait until the TIM14 get 2 LSI edges (refer to TIM14_IRQHandler() in
- stm32F0xx_it.c file) ******************************************************/
- while(CaptureNumber != 2)
- {
- }
- /* Deinitialize the TIM14 peripheral registers to their default reset values */
- TIM_DeInit(TIM14);
-
-
- /* Compute the LSI frequency, depending on TIM14 input clock frequency (PCLK1)*/
- /* Get SYSCLK, HCLK and PCLKx frequency */
- RCC_GetClocksFreq(&RCC_ClockFreq);
-
- /* PCLK1 prescaler equal to 1 => TIMCLK = PCLK1 */
- return ((RCC_ClockFreq.PCLK_Frequency / PeriodValue) * 8);
- }
-
- #ifdef USE_FULL_ASSERT
-
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(uint8_t* file, uint32_t line)
- {
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
-
- /* Infinite loop */
- while (1)
- {
- }
- }
- #endif
-
- /**
- * @}
- */
-
- /**
- * @}
- */
-
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/