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__);
  }
}





  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值