Один раз запускаю будильник, например на 5 секунд - через 5 секунд попадаю в прерывание RTC_Alarm_IRQHandler(). Внутри прерывания добавил перезапуск будильника на тотже интервал. Далее будильник срабатывает через секунду. Почему?
перепробывал всё, перепроверил всё... пересчеты времени... делал массив в который кидал текущее время и время аларма.... вроде будильник правильно завожу, но он ПЕРВЫЙ раз срабатывает через 5 сек, как положенно, а все последующие разы через 1 сек.
потом, для дебага в прерывании, перед новым инитом алармы вставил строчку
RTC_GetAlarm(RTC_Format_BIN, RTC_Alarm_A, &alarm1);
ЗАРАБОТАЛО!!! Будильник как положенно раз в 5 сек срабатывает. Если эту строчку закоментить, то раз в 1 сек. Не могу понять, как RTC_GetAlarm() влияет на работу будильника?
CODE
int main()
{
RTC_InitTypeDef rtc;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //Включаем тактирование (PWR — Power Control):
PWR_BackupAccessCmd(ENABLE);
RCC_BackupResetCmd(ENABLE);
RCC_BackupResetCmd(DISABLE);
RCC_LSICmd(ENABLE);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
rtc.RTC_HourFormat = RTC_HourFormat_24;
rtc.RTC_SynchPrediv = 0x7FFF;
RTC_Init(&rtc);
EXTI_InitTypeDef exti;
EXTI_ClearITPendingBit(EXTI_Line17);
exti.EXTI_Line = EXTI_Line17;
exti.EXTI_Mode = EXTI_Mode_Interrupt;
exti.EXTI_Trigger = EXTI_Trigger_Rising;
exti.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti);
NVIC_EnableIRQ(RTC_Alarm_IRQn);
NVIC_SetPriority(RTC_Alarm_IRQn, 13);
setNewAlarmRTC(5);
while(1);
}
extern "C" void RTC_Alarm_IRQHandler()
{
if( RTC_GetITStatus(RTC_IT_ALRA) != RESET )
{
RTC_ClearITPendingBit(RTC_IT_ALRA);
EXTI_ClearITPendingBit(EXTI_Line17);
setNewAlarmRTC(5); //перезапустим таймер
}
}
//заводит будильник Alarm_A на время через seconds секунд
void setNewAlarmRTC(uint32_t seconds)
{
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
RTC_ITConfig(RTC_IT_ALRA, DISABLE);
RTC_ClearITPendingBit(RTC_IT_ALRA);
RTC_TimeTypeDef time;
RTC_GetTime(RTC_Format_BIN, &time);
RTC_AlarmTypeDef alarm1;
//RTC_GetAlarm(RTC_Format_BIN, RTC_Alarm_A, &alarm1);//если эту строку раскоментировать, то будильник будет работать нормально
RTC_TimeTypeDef alarmTime = time;
addSecToTime(&alarmTime, seconds);//добавим секунды к текущему времени
RTC_AlarmTypeDef alarm;
alarm.RTC_AlarmTime = alarmTime;
alarm.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &alarm);
//RTC_OutputConfig(RTC_Output_AlarmA, RTC_OutputPolarity_High);
RTC_ITConfig(RTC_IT_ALRA, ENABLE);
RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
RTC_ClearFlag(RTC_FLAG_ALRAF);
}
{
RTC_InitTypeDef rtc;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //Включаем тактирование (PWR — Power Control):
PWR_BackupAccessCmd(ENABLE);
RCC_BackupResetCmd(ENABLE);
RCC_BackupResetCmd(DISABLE);
RCC_LSICmd(ENABLE);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
rtc.RTC_HourFormat = RTC_HourFormat_24;
rtc.RTC_SynchPrediv = 0x7FFF;
RTC_Init(&rtc);
EXTI_InitTypeDef exti;
EXTI_ClearITPendingBit(EXTI_Line17);
exti.EXTI_Line = EXTI_Line17;
exti.EXTI_Mode = EXTI_Mode_Interrupt;
exti.EXTI_Trigger = EXTI_Trigger_Rising;
exti.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti);
NVIC_EnableIRQ(RTC_Alarm_IRQn);
NVIC_SetPriority(RTC_Alarm_IRQn, 13);
setNewAlarmRTC(5);
while(1);
}
extern "C" void RTC_Alarm_IRQHandler()
{
if( RTC_GetITStatus(RTC_IT_ALRA) != RESET )
{
RTC_ClearITPendingBit(RTC_IT_ALRA);
EXTI_ClearITPendingBit(EXTI_Line17);
setNewAlarmRTC(5); //перезапустим таймер
}
}
//заводит будильник Alarm_A на время через seconds секунд
void setNewAlarmRTC(uint32_t seconds)
{
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
RTC_ITConfig(RTC_IT_ALRA, DISABLE);
RTC_ClearITPendingBit(RTC_IT_ALRA);
RTC_TimeTypeDef time;
RTC_GetTime(RTC_Format_BIN, &time);
RTC_AlarmTypeDef alarm1;
//RTC_GetAlarm(RTC_Format_BIN, RTC_Alarm_A, &alarm1);//если эту строку раскоментировать, то будильник будет работать нормально
RTC_TimeTypeDef alarmTime = time;
addSecToTime(&alarmTime, seconds);//добавим секунды к текущему времени
RTC_AlarmTypeDef alarm;
alarm.RTC_AlarmTime = alarmTime;
alarm.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &alarm);
//RTC_OutputConfig(RTC_Output_AlarmA, RTC_OutputPolarity_High);
RTC_ITConfig(RTC_IT_ALRA, ENABLE);
RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
RTC_ClearFlag(RTC_FLAG_ALRAF);
}