[STM32L1] STM32L152 RTC 日历和定时中断使用

[复制链接]
1400|2
 楼主| gejigeji521 发表于 2017-6-10 20:42 | 显示全部楼层 |阅读模式
STM32L152 RTC 日历和自动唤醒功能配置1、开发平台:

STM32L1-Discovery Keil 4

2、RTC Calendar和wake up
  • STM32L152RC 带有一个硬件的实时时钟模块(RTC),可为用户提供日历功能,RTC也可以提供一个自动定时的功能,相当于是一个睡眠定时器,下面就看看该如何配置日历和定时:
  1. void SYS_RTCInit(void)
  2. {
  3.     static NVIC_InitTypeDef  NVIC_InitStructure;
  4.     static EXTI_InitTypeDef  EXTI_InitStructure;
  5.     static RTC_InitTypeDef RTC_InitStructure;
  6.     static RTC_TimeTypeDef RTC_TimeStructure;
  7.     static uint32_t AsynchPrediv = 0, SynchPrediv = 0;

  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  9.     /*!< Allow access to RTC */
  10.     PWR_RTCAccessCmd(ENABLE);

  11.     /*!< 使能外部低速时钟 */
  12.     RCC_LSEConfig(RCC_LSE_ON);

  13.     /*!< 等待外部低速时钟就绪 */
  14.     while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  15.     {}

  16.     /*!< 配置RTC时钟来源 */
  17.     RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  18.     /*!< 使能RTC时钟 */
  19.     RCC_RTCCLKCmd(ENABLE);

  20.     /*!< Wait for RTC APB registers synchronisation */
  21.     RTC_WaitForSynchro();

  22.     //配置日历
  23.     /* 配置RTC数据寄存器以及时钟分频 */
  24.     SynchPrediv = 0xFF;
  25.     AsynchPrediv = 0x7F;//分频为1Hz
  26.     RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
  27.     RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
  28.     RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//24小时制
  29.     /* 检查RTC初始化 */
  30.     if (RTC_Init(&RTC_InitStructure) == ERROR)
  31.     {
  32.         printf("\n\r        /!\\***** RTC Prescaler Config failed ********/!\\ \n\r");
  33.     }
  34.     //配置时间 9点15分01秒
  35.     RTC_TimeStructure.RTC_H12     = RTC_H12_AM;
  36.     RTC_TimeStructure.RTC_Hours = 0x09;
  37.     RTC_TimeStructure.RTC_Minutes = 0x15;
  38.     RTC_TimeStructure.RTC_Seconds = 0x01;
  39.     RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);

  40.     //配置自动定时功能
  41.     /* 中断配置 *******************************************************/
  42.     EXTI_ClearITPendingBit(EXTI_Line20);
  43.     EXTI_InitStructure.EXTI_Line = EXTI_Line20;
  44.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  45.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  46.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  47.     EXTI_Init(&EXTI_InitStructure);

  48.     /*使能 RTC Wakeup Interrupt */
  49.     NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
  50.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  51.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  52.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  53.     NVIC_Init(&NVIC_InitStructure);

  54.     /* RTC 唤醒中端配置: Clock Source: RTCDiv_16, Wakeup Time Base: 4s */
  55.     RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
  56.     RTC_SetWakeUpCounter(0x1FFF);//0x1FFF = 8191; 4s = (8191+1)*(1/(32768/16))

  57.     /* 使能 the Wakeup Interrupt */
  58.     RTC_ITConfig(RTC_IT_WUT, ENABLE);  
  59. }



 楼主| gejigeji521 发表于 2017-6-10 20:42 | 显示全部楼层

  • 使能了RTC的定时中断,那么就要编写中断服务子程序,如下:
  1. void RTC_WKUP_IRQHandler(void)
  2. {
  3.   if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
  4.   {
  5.     RTC_ClearITPendingBit(RTC_IT_WUT);
  6.     EXTI_ClearITPendingBit(EXTI_Line20);
  7.   }
  8. }



643757107 发表于 2017-6-10 23:33 | 显示全部楼层
学习学习,RTC,实时时钟。。系统的时间系统。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

2465

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部