项目场景:
提示:休眠定时唤醒
问题描述:
设置唤醒时间后休眠,设置时间为每个月最后一天,然后次月某天无法唤醒。其他时间正常唤醒。
@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 版权协议,转载请附上原文出处链接和本声明。