STM32,RTC周期性唤醒(wakeup)中断

STM32L151:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
    LED_ON();
  MX_DMA_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_TIM3_Init();
  MX_USART2_UART_Init();
  //MX_IWDG_Init();
  MX_RTC_Init();
  MX_USART3_UART_Init();
  MX_USART1_UART_Init();
    printf("init complete...\r\n ");
    LED_OFF();
    unsigned int i=0;
  while (1)
  {
        HAL_Delay(1000);
        i++;
        printf("i am alive...%d \r\n ",i);
  }
}


static void MX_RTC_Init(void)
{

  RTC_TimeTypeDef sTime;
  RTC_DateTypeDef sDate;

    /**Initialize RTC Only
    */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

/*

在这个函数中的配置过程:1、禁止写保护寄存拿起:WPR = 0XCA..0X53

2、设置初始化模式,检查时钟源是否正常(LES\LSI),轮询ISR寄存器的第六位是否为1,为1就表示可以往下执行,否则就死了。

3、对CR寄存器操作,对选择RTC计数器的频率、是否输出时钟,时钟极性、等最后把ISR的第六位清0,表示退出初始化模式,还有加上写保护

*/

  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Enable the WakeUp
    */

/*

//配置RTC CR寄存器的低两位,选择RTC计数器时钟的频率这里是1HZ,CR寄存器的第十四位使能wakeup唤醒中断,给wakeup定时器赋值为10,这里就是没过一秒定时器的值减一,当定时器减到0的时候就是是ISR寄存器的相应标志位置1并且中断挂起寄存器也会置1 EXTI->PR,所以写中断服务程序的时候需要清除ISR的标志位还有PR的标志位。在当前的函数配置过程:

1、写保护破除

2、请0CR中的WUTE位,禁止唤醒定时器

3、选择1HZ的时钟,使能中断

4、开启中断线20-----对应的就是RTC唤醒,中断线17----对应RTC闹钟

这里RTC_WAKEUPCLOCK_CK_SPRE_16BITS是设置CR寄存器中的低三位,唤醒时钟选择,这里选择1HZ,10表示工作10S后进入唤醒中断

*/

  if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 10, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}





你可能感兴趣的:(STM32)