• STM32:RTC闹钟唤醒


    想使用闹钟唤醒功能使系统从待机下唤醒,遇到一个问题:使用闹钟唤醒就不能使用wakeup pin唤醒。二者只能取其一。

    此问题解决,画了个板子wakeup pin 接下拉电阻解决。

    写新代码时候遇到一个问题:设置闹钟中断开启之后不要关闭:PWR_BackupAccessCmd(DISABLE);

    如果只有设置秒中断的话可以有这句比较安全,可是后面还要设置闹钟步长,千万不能有,不然会死掉,死掉。

    1,首先屏蔽掉:// PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能

         我的程序在wakeup_config.c中实现. 屏蔽后wakeup pin无法使机器唤醒

    2,使能RTC闹钟中断:  /* Enable the RTC Alarm interrupt */
                               RTC_ITConfig(RTC_IT_ALR, ENABLE);
                               /* Wait until last write operation on RTC registers has finished */
                               RTC_WaitForLastTask();

         这两句在RTC初始化时候加入即可。

    3,设置闹钟时长并进入待机   

        RTC_ClearFlag(RTC_FLAG_SEC);
        while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);
        RTC_SetAlarm(RTC_GetCounter() + 15);
        RTC_WaitForLastTask();

        Sys_Enter_Standby();

    4,中断服务函数:

     1 static void RTC_NVIC_Config(void)
     2 {    
     3     NVIC_InitTypeDef NVIC_InitStructure;
     4 
     5     NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;        //RTC全局中断
     6     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    //先占优先级1位,从优先级3位
     7     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //先占优先级0位,从优先级4位
     8     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能该通道中断
     9     NVIC_Init(&NVIC_InitStructure);        //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    10 }
    RTC_NVIC_Config
     1 void RTC_IRQHandler(void)
     2 {
     3   //RTC时钟中断
     4 //每秒触发一次  
     5    
     6  if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断
     7  {       
     8   RTC_Get();//更新时间   
     9   }
    10  if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断
    11  {
    12   RTC_ClearITPendingBit(RTC_IT_ALR);  //清闹钟中断
    13   printf("\n\rRTC Alarm \n\r"); 
    14   printf("\n\r Now is %d年 %d月 %d日 %d点 %d分 %d秒 ,星期%d\n\r",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec,calendar.week);      
    15        RTC_SetAlarm(RTC_GetCounter() + 8);
    16         RTC_WaitForLastTask(); 
    17  }                
    18  RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);  //清闹钟中断
    19  RTC_WaitForLastTask();                     
    20 
    21 }
    RTC_IRQHandler

    其实中断服务函数完全可以没有,因为待机后直接就是相当于reset,中断服务函数在运行时间可以对闹钟做出响应。

    5,STOP模式需要设置EXTI17,standby模式并不需要。这里void RTCAlarm_IRQHandler(void) 根本不用。

    折腾了一天,一直没调通居然是因为wakeup pin与RTC alarm同时开启造成的。难道ST只允许一种方式唤醒??

    根据网友答复,需要wakeup pin 接下拉电阻可以解决。还没有试验。

        

  • 相关阅读:
    IOC+AOP
    基础知识
    断点续传
    监听程序
    Action、View、ActionResult、ViewResult、ContentResult
    json的使用(JObect,JsonData,JArray)
    get/post 接口调用
    常见的加密和解密
    WebUtility(提供在处理 Web 请求时用于编码和解码 URL 的方法。)
    MyBatis动态SQL和缓存
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3119226.html
Copyright © 2020-2023  润新知