STM32F407 休眠RTC闹钟跨月不能唤醒

  • Post author:
  • Post category:其他




项目场景:


提示:休眠定时唤醒




问题描述:


设置唤醒时间后休眠,设置时间为每个月最后一天,然后次月某天无法唤醒。其他时间正常唤醒。

@Override
        public void run() {
            bytes = mmInStream.read(buffer);
            mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
        }



原因分析:


其他时间可以闹钟正常,但是跨月后无法唤醒,怀疑闹钟函数有问题。参考过正点原子和其他大神的闹钟函数代码,均出现过这样的现象,对闹钟函数代码进行修改。



解决方案:

加入对月份天数判断

void RTC_Set_AlarmA(u8 week,u8 hour,u8 min,u8 sec)
{ 
    RTC_AlarmTypeDef sAlarm = {0};
	u8 mon_date_time = 0;
    RTC_DateTypeDef sdate = {0};  

    //读取当前时间 
    HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
    //获取设置中断时的时间
    sAlarm.Alarm = RTC_ALARM_A;
    sAlarm.AlarmTime.Hours   = hour;
    sAlarm.AlarmTime.Minutes = min;
    sAlarm.AlarmTime.Seconds = sec;
		
    mon_date_time = YearMonth_to_day(sdate.Year + 1970, sdate.Month);  //加入对月份天数判断函数
    if(sAlarm.AlarmTime.Seconds >= 60)
    {
        sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;
        sAlarm.AlarmTime.Minutes += 1;
        if(sAlarm.AlarmTime.Minutes >= 60)
        {
            sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
            sAlarm.AlarmTime.Hours += 1;
            if(sAlarm.AlarmTime.Hours >= 24)
            {
              sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
              sdate.Date += 1;
            }
        }
    }
		
	if(sAlarm.AlarmTime.Hours >= 24)
	{
	  sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
	  sdate.Date = (sdate.Date+1)%mon_date_time;
	}

    sAlarm.AlarmTime.SubSeconds = 0;
	sAlarm.AlarmTime.TimeFormat=RTC_HOURFORMAT12_AM;
	sAlarm.AlarmMask=RTC_ALARMMASK_DATEWEEKDAY;
    sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
		
    sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL ;//RTC_ALARMSUBSECONDMASK_NONE;
    sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意
    sAlarm.AlarmSubSecondMask=RTC_ALARMSUBSECONDMASK_NONE;

    if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
    {
        Error_Handler();
    }
    HAL_NVIC_SetPriority(RTC_Alarm_IRQn,0x00,0x00); //抢占优先级1,子优先级2
    HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);				
}

u8 YearMonth_to_day(u16 year, u8 month)
{
	int day = 0;
	if (month==1 || month==3 ||month==5 || month==7 || month==8 || month==10 ||month==12){
	  day = 31;
	}
	else if (month == 4 || month == 6 || month == 9 || month == 11){
	  day = 30;
	}
	else if (month == 2){
		if (((year % 4 == 0) && (year % 4 != 0)) || year % 400 == 0){
			day = 29; 
		}
		else{
			day = 28; 
		}
	}
	return day;
}

个人遇到无脑问题,仅供新手参考,避免不必要的错误。



版权声明:本文为weixin_39254821原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。