Вітання.
З ALARM трішки є просування.
Зрозумів помилку. Підглянув тут http://www.diygoodies.org.ua/?p=634
Як виявилось, моя помилка в тому, що не існує якогось окремого переривання для ALARM. Всі можливі події RTC в одному перериванні, тільки треба перевірити регістри, щоб виявити, що викликало переривання.
Тут дозволяємо переривання по секундам і будильнику:
RCC_ITConfig(RTC_IT_ALR, ENABLE);//дозволити переривання при збігу рахункового і сигнального регістра
RTC_WaitForLastTask();//Чекаємо поки останні операції запису у регистри RTC завершаться
RTC_ITConfig(RTC_IT_SEC, ENABLE);//Вмикаємо відлік RTC по секундам
RTC_WaitForLastTask();//Чекаємо поки останні операції запису у регистри RTC завершаться
NVIC_EnableIRQ (RTC_IRQn);//
Встановлюю будильник на 10 сек:
Обробник переривань (кожну секунду міняємо стан синього вогника, по будильнику світимо зелений вогник):
void RTC_IRQHandler(void)
{
if (RTC_GetFlagStatus(RTC_IT_SEC) == SET)//якщо минула секунда
{
RTC_ClearITPendingBit(RTC_IT_SEC);//очистити RTC переривання по секундам
RTC_WaitForLastTask();//чекаємо поки останні операції запису до RTC закінчаться
LCD_PORT->ODR ^= LED_BLUE;//перемикаємо стан голубого світлодіода
}
if (RTC_GetFlagStatus(RTC_IT_ALR) == SET)//як стався збіг рахункового і сигнального регістра
{
RTC_ClearITPendingBit(RTC_IT_ALR);//очистка ALR переривання по збігу
RTC_WaitForLastTask();//чекаємо поки останні операції запису до RTC закінчаться
LCD_PORT->BSRR = LED_GREEN;//засвітимо зелений світлодіод
}
}
Це працює.
Але є одне але. Коли я задаю певну дату і час для таймера, та ту саму дату і час, плюс 10 секунд, то зелений вогник не запалюється. Функція cal_get_timer повертає кількість секунд від 1.1.1970 00:00 до дати і часу що задаю.
Так не працює:
RTC_SetCounter(cal_get_timer(2014,12,29,19,38,00));
RTC_SetAlarm(cal_get_timer(2014,12,29,19,38,10));
Що не так?