реклама на сайте
подробности

 
 
> stm32 RTC Alarm
juvf
сообщение Oct 14 2015, 08:21
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Проблемы с будильником на STM32F401VCT6. Нужно переодически делать полезную работу. Решил сделать по будильнику. часы и будильник поднял легко, как вот тут
Один раз запускаю будильник, например на 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);
}


Сообщение отредактировал IgorKossak - Oct 14 2015, 16:18
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post



Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 13:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016