STM32 -- RTC -- Alarm

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
RadioLab
Открыл глаза
Сообщения: 46
Зарегистрирован: Пт дек 25, 2009 12:29:51
Откуда: Н.Новгород
Контактная информация:

STM32 -- RTC -- Alarm

Сообщение RadioLab »

Привет Котам!!!

появились новые микропроцессоры от 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);
}
Последний раз редактировалось RadioLab Пт июн 10, 2011 12:34:40, всего редактировалось 3 раза.
Реклама
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

Re: STM32 -- RTC -- Alarm

Сообщение romazan »

Исходник давай.
Реклама
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

Re: STM32 -- RTC -- Alarm

Сообщение romazan »

В конце обработки прерывания нужно в регистр прерываний записать значение и считать статус регистр RTC, что означает, что работа с прерыванием закончена и из него можно выйти. Так как сейчас не дома не могу сказать, что и куда писать. Когда приеду домой скину пример.
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

Re: STM32 -- RTC -- Alarm

Сообщение romazan »

Так вообщем. У меня процессор AT91SAM7X, но сути не меняет. Открываешь даташит на свой процессор. На странице с описанием контроллера прерываний должна быть таблица, в ней найди что-то типа этого: End of Interrupt Command Register (AIC_EOICR).
Потом ищешь описание регистров RTT, нужен статус регистер (у меня:RTT_SR).
Как найдёшь, в конце обработки прерывания допишешь что-то типа этого: AIC->AIC_EOICR = RTT->RTT_SR;
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
RadioLab
Открыл глаза
Сообщения: 46
Зарегистрирован: Пт дек 25, 2009 12:29:51
Откуда: Н.Новгород
Контактная информация:

Re: STM32 -- RTC -- Alarm

Сообщение RadioLab »

спасибо за ответ, romazan :wink:

сегодня вечером попробую и отвечу :beer:
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»