搜索
bottom↓
回复: 13

stm32L Alarm唤醒问题

[复制链接]

出0入0汤圆

发表于 2013-10-15 21:59:21 | 显示全部楼层 |阅读模式
    有用过stm32L闹钟的朋友吗,我最近做stm32L低功耗唤醒实验,想设置成每天闹钟唤醒一次,但是实际发现闹钟只有本次设置起作用,之后就不起作用了。有朋友知道怎么使用stm32L的闹钟吗。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-10-16 07:18:17 | 显示全部楼层
RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; // Nonspecific
RTC_AlarmStructure.RTC_AlarmDateWeekDaySel =RTC_AlarmDateWeekDaySel_Date;
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay; // Everyday
不知有没有设置RTC

出0入0汤圆

 楼主| 发表于 2013-10-16 08:54:00 | 显示全部楼层
hjgqx 发表于 2013-10-16 07:18
RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; // Nonspecific
RTC_AlarmStructure.RTC_AlarmDateWeekD ...

谢谢。我就是这样设置的,的确是只能进一次alarm中断,第二天就不进了。你这样设置连续几天都能唤醒么,还是还有什么别的要设置。

出0入0汤圆

 楼主| 发表于 2013-10-18 09:17:36 | 显示全部楼层
顶一下,stm32l的alarm有大侠用过吗,求指导。

出0入0汤圆

发表于 2013-11-4 20:45:56 | 显示全部楼层
void rtcAlarmTime(alaramTypeDef type,eAlarm_Period ePeriod,RTC_TimeTypeDef *pTime)
{
        /* Disable the Alarm A */
        if(type == ALARM_A)
        RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
    else
        RTC_AlarmCmd(RTC_Alarm_B, DISABLE);

        RTC_AlarmTypeDef RTC_AlarmStructure;

        if(pTime->RTC_Hours >=12)
        RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_PM;
    else
        RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM;
   
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = pTime->RTC_Hours;
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = pTime->RTC_Minutes;
        RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = pTime->RTC_Seconds;
        switch (ePeriod)
        {
        case _EVERY_MINUTE_: //-- alarm every minute
        {
                RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; // Nonspecific
                RTC_AlarmStructure.RTC_AlarmDateWeekDaySel =
                                RTC_AlarmDateWeekDaySel_Date;
                RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_Minutes;
                break;
        }
        case _EVERY_HOUR_: //-- alarm every hour
        {
                RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; // Nonspecific
                RTC_AlarmStructure.RTC_AlarmDateWeekDaySel =
                                RTC_AlarmDateWeekDaySel_Date;
                RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_Hours;
                break;
        }
        case _EVERY_DAY_: //-- alarm every day at 00:00:04
        {
                RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; // Nonspecific
                RTC_AlarmStructure.RTC_AlarmDateWeekDaySel =
                                RTC_AlarmDateWeekDaySel_Date;
                //RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None;
        RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay; // Everyday
                break;
        }
        case _EVERY_WEEK_: //-- alarm at Monday of every month
        {
                RTC_AlarmStructure.RTC_AlarmDateWeekDay = RTC_Weekday_Monday;
                RTC_AlarmStructure.RTC_AlarmDateWeekDaySel =
                                RTC_AlarmDateWeekDaySel_WeekDay;
                RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None;
                break;
        }
        case _EVERY_MONTH_: //-- alarm on first of every month
        {
                RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x01;
                RTC_AlarmStructure.RTC_AlarmDateWeekDaySel =
                                RTC_AlarmDateWeekDaySel_Date;
                RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None;
                break;
        }
        default:
        {

                break;
        }

        }
   
        if(type == ALARM_A)
        RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
    else
        RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_B, &RTC_AlarmStructure);
   
    rtcAlarmConfig();

        /* Enable RTC Alarm A Interrupt: this Interrupt will wake-up the system from
         STANDBY mode (RTC Alarm IT not enabled in NVIC) */
        if(type == ALARM_A)
    {
        RTC_ITConfig(RTC_IT_ALRA, ENABLE);
        RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
        RTC_ClearFlag(RTC_FLAG_ALRAF );
    }
    else
    {
        RTC_ITConfig(RTC_IT_ALRB, ENABLE);
        RTC_AlarmCmd(RTC_Alarm_B, ENABLE);
        RTC_ClearFlag(RTC_FLAG_ALRBF );
    }
}

出0入0汤圆

发表于 2015-11-3 22:34:41 | 显示全部楼层
hjgqx 发表于 2013-11-4 20:45
void rtcAlarmTime(alaramTypeDef type,eAlarm_Period ePeriod,RTC_TimeTypeDef *pTime)
{
        /* Disable the ...

谢谢分享,刚好用上

出0入0汤圆

发表于 2015-11-4 15:01:46 来自手机 | 显示全部楼层
是不是唤醒后需要再次设置下一次唤醒时间呢

出0入0汤圆

发表于 2015-11-4 15:31:40 | 显示全部楼层
尝试每次设置完闹钟中断后清一下ISR寄存器,我之前用RTC的内部唤醒,每次设置完中断之后都要清一下ISR,不然下次进不了中断

出0入0汤圆

发表于 2017-6-26 13:31:39 | 显示全部楼层
我的程序进入alarm中断几次就不会进入中断了,这是为什么呢?
void RTC_AlarmA(void)
{  
                /* 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 Alarm Interrupt */
                NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);


                /* Disable the Alarm A ???*/
                RTC_AlarmCmd(RTC_Alarm_A, DISABLE);//²»¿ÉÉÙ

                RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
    /* Set the alarm X+5s */
    RTC_AlarmStructure.RTC_AlarmTime.RTC_H12     = RTC_TimeStructure.RTC_H12;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours   = RTC_TimeStructure.RTC_Hours;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = RTC_TimeStructure.RTC_Minutes;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = (RTC_TimeStructure.RTC_Seconds + 0x2) % 60;
                printf("Year    :%d  ",RTC_TimeStructure.RTC_Hours );
                printf("Month   :%d  ",RTC_TimeStructure.RTC_Minutes );
                printf("Date    :%d  ",RTC_TimeStructure.RTC_Seconds );
    RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;
    RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
    RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;//ÆÁ±ÎDate
    RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);

                /* Clear PWR WakeUp flag */
                PWR_ClearFlag(PWR_FLAG_WU);
                /* Clear RTC Alarm A flag */
                RTC_ClearFlag(RTC_FLAG_ALRAF);

                /* Enable RTC Alarm A Interrupt: this Interrupt will wake-up the system from
                 STANDBY mode (RTC Alarm IT not enabled in NVIC) */
                RTC_ITConfig(RTC_IT_ALRA, ENABLE);
                /* Enable the Alarm A */
                RTC_AlarmCmd(RTC_Alarm_A, ENABLE);

                /* Enable WKUP pin 1 ???*/
                PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE);  
}

void RTC_Alarm_IRQHandler(void)
{     
  if(RTC_GetITStatus(RTC_IT_ALRA) != RESET)
  {
    LD4^=1;
          LD3^=1;
                /* Disable the Alarm A ???*/
                RTC_AlarmCmd(RTC_Alarm_A, DISABLE);//²»¿ÉÉÙ

                RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
    /* Set the alarm X+5s */
    RTC_AlarmStructure.RTC_AlarmTime.RTC_H12     = RTC_TimeStructure.RTC_H12;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours   = RTC_TimeStructure.RTC_Hours;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = RTC_TimeStructure.RTC_Minutes;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = (RTC_TimeStructure.RTC_Seconds + 0x2) % 60;
                printf("Year    :%d  ",RTC_TimeStructure.RTC_Hours );
                printf("Month   :%d  ",RTC_TimeStructure.RTC_Minutes );
                printf("Date    :%d  ",RTC_TimeStructure.RTC_Seconds );
    RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;
    RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
    RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;
    RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);

    /* Clear PWR WakeUp flag */
    PWR_ClearFlag(PWR_FLAG_WU);
    /* Clear RTC Alarm A flag */
    RTC_ClearFlag(RTC_FLAG_ALRAF);
  
    /* Enable RTC Alarm A Interrupt: this Interrupt will wake-up the system from
       STANDBY mode (RTC Alarm IT not enabled in NVIC) */
    RTC_ITConfig(RTC_IT_ALRA, ENABLE);
    /* Enable the Alarm A */
    RTC_AlarmCmd(RTC_Alarm_A, ENABLE);

    RTC_ClearITPendingBit(RTC_IT_ALRA);
    EXTI_ClearITPendingBit(EXTI_Line17);
  }
}

出0入0汤圆

发表于 2017-6-26 14:54:29 | 显示全部楼层
先检查下STM32的RTC晶振是不是有效可靠工作的

出100入143汤圆

发表于 2018-8-16 18:26:27 | 显示全部楼层
兄弟,最后解决了吗,我现在也遇到这个现象。。。

出0入0汤圆

发表于 2018-8-17 03:24:44 | 显示全部楼层
我想来应该是过了一天后,日期不一样了.

出0入0汤圆

发表于 2018-8-18 08:49:09 来自手机 | 显示全部楼层
设置alarm的时候,匹配条件把年月日mask就行了。

出10入12汤圆

发表于 2018-11-4 19:14:55 | 显示全部楼层
需要定时啊!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 12:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表