STM32 -- RTC -- Alarm
Добавлено: Пт июн 10, 2011 10:44:02
Привет Котам!!!
появились новые микропроцессоры от ST.
и вот первый проект - реализация часов реального времени.
взял готовый демо проект, немножко под себя поправил, запустил. всё работает.
и всё же не всё получается.
при помощи стандартного мастера сконфигурировал RTC,
установил внешний кварц 32 кГц,
прерывание от Alarm
значение Alarm - 5 сек.
проц отсчитывает 5 сек входит в прерывание и повисает. Как правильно обработать прерывание?
хотелось бы менять значения Alarm . Как это правильно делать?
и пытаюсь обработать прерывание так
появились новые микропроцессоры от ST.
и вот первый проект - реализация часов реального времени.
взял готовый демо проект, немножко под себя поправил, запустил. всё работает.
и всё же не всё получается.
при помощи стандартного мастера сконфигурировал RTC,
установил внешний кварц 32 кГц,
прерывание от Alarm
значение Alarm - 5 сек.
проц отсчитывает 5 сек входит в прерывание и повисает. Как правильно обработать прерывание?
хотелось бы менять значения Alarm . Как это правильно делать?
Код: Выделить всё
int main(void)
{
stm32_Init (); // STM32 setup
TimeVar[0]=19;
TimeVar[1]=704;
TimeVar[2]=500;
TimeVar[3]=5107;
// перебирал варианты ... //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RTC->CRL |= RTC_CRL_CNF;
// RTC->ALRL = 30;
/*PWR->CR |= PWR_CR_DBP; // enable access to RTC, BDC registers
PWR->CR &= ~PWR_CR_DBP; */
// перебирал варианты ... //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
RTC_SetAlarm(5);
RTC_SetCounter(0);
RTC_ClearFlag(RTC_FLAG_SEC);
RTC_ClearFlag(RTC_FLAG_ALR);
// перебирал варианты ... //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* RCC->APB1ENR |= RCC_APB1ENR_PWREN; // enable clock for Power interface
PWR->CR |= PWR_CR_DBP; // enable access to RTC, BDC registers
// if ((__RTC_CLKSRC_VAL & RCC_BDCR_RTCSEL) == 0x00000100) { // LSE is RTC clock source
// RCC->BDCR |= RCC_BDCR_LSEON; // enable LSE
// while ((RCC->BDCR & RCC_BDCR_LSERDY) == 0); // Wait for LSERDY = 1 (LSE is ready)
// }
// if ((__RTC_CLKSRC_VAL & RCC_BDCR_RTCSEL) == 0x00000200) { // LSI is RTC clock source
// RCC->CSR |= RCC_CSR_LSION; // enable LSI
// while ((RCC->CSR & RCC_CSR_LSIRDY) == 0); // Wait for LSERDY = 1 (LSE is ready)
// }
//RCC->BDCR |= (__RTC_CLKSRC_VAL | RCC_BDCR_RTCEN); // set RTC clock source, enable RTC clock
// RTC->CRL &= ~(1<<3); // reset Registers Synchronized Flag
// while ((RTC->CRL & (1<<3)) == 0); // wait until registers are synchronized
RTC->CRL |= RTC_CRL_CNF; // set configuration mode
// RTC->PRLH = ((__RTC_PERIOD*__RTCCLK/1000-1)>>16) & 0x00FF; // set prescaler load register high
// RTC->PRLL = ((__RTC_PERIOD*__RTCCLK/1000-1) ) & 0xFFFF; // set prescaler load register low
// RTC->CNTH = ((__RTC_CNT)>>16) & 0xFFFF; // set counter high
// RTC->CNTL = ((__RTC_CNT) ) & 0xFFFF; // set counter low
//RTC->ALRH = ((__RTC_ALR)>>16) & 0xFFFF; // set alarm high
RTC->ALRL = 10; // set alarm low
// if (__RTC_INTERRUPTS) { // RTC interrupts used
// RTC->CRH = __RTC_CRH; // enable RTC interrupts
// NVIC->ISER[0] = (1 << (RTC_IRQChannel & 0x1F)); // enable interrupt
// }
RTC->CRL &= ~RTC_CRL_CNF; // reset configuration mode
while ((RTC->CRL & RTC_CRL_RTOFF) == 0); // wait until write is finished
PWR->CR &= ~PWR_CR_DBP;
*/
// перебирал варианты ... //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
while (1)
{
IWDG->KR = 0xAAAA; // Reload the watchdog
// clock_decoder(((uint32_t)RTC->CNTH << 16) | RTC->CNTL, &clock);
}
}
Код: Выделить всё
// RTC_IRQHandler
void RTCAlarm_IRQHandler(void)
{
// RTC_ClearITPendingBit(RTC_IT_ALR);
/* If counter is equal to 86339: one day was elapsed */
// if((RTC_GetCounter()/3600 == 23)&&(((RTC_GetCounter()%3600)/60) == 59)&&
// (((RTC_GetCounter()%3600)%60) == 59)) /* 23*3600 + 59*60 + 59 = 86339 */
// {
/* Wait until last write operation on RTC registers has finished */
// RTC_WaitForLastTask();
/* Reset counter value */
// RTC_SetCounter(0x0);
/* Wait until last write operation on RTC registers has finished */
// RTC_WaitForLastTask();
/* Increment the date */
// Date_Update();
// }
/* Clear the RTC Second Interrupt pending bit */
// RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_SetAlarm(10);
RTC_SetCounter(0);
RTC_ClearFlag(RTC_FLAG_SEC);
RTC_ClearFlag(RTC_FLAG_ALR);
}