stm32f4 rtc

Başlatan justice_for_all, 26 Nisan 2015, 00:35:46

justice_for_all

Merhaba arkadaslar,

stm32f4 kitiyle RTC ornegi yapiyorum.Normalde calisiyor ama ben surekli rtc datalarini okumak istemiyorum.zaman degisince okumak istiyorum.Bunu yapabilmek icin bir kesme secenegi varmi bu seride.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123

1 saniyelik kesme oluştur.O kesmede kontrol et zaten saniyede bir değişeceğinde main için sürekli RTC okuyarak meşgul etme

justice_for_all

systick i kullanmak istemiyorum onu baska bi is icin kullaniyorum.rtcnin kendi kutuphanesinde varmi kullanabilecegim boyle bise?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123

Bu tarz bir şey bilmiyorum ama systic de sayaç aç girer girmez arttırsın sayacın hesabı 1 saniyeye denk gelince bir flagı set et.Bu flag extern olsun yani her yerden erişebilesin.Ana programda da flagı kontrol et set olunca okusun.Systick i kullan yada Timer ekle bir tane 32 bit işlemci çekinme yaymalı yaymalı yap :D

mesaj birleştirme:: 26 Nisan 2015, 00:53:38

Not : Yaymalı derken paldır küldür değil tabi.İmkanlarını değerlendir :)

justice_for_all

tamamdir hocam ben biraz daha karistirayim olmazsan oyle yaparim.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

FxDev

Bu konuda bir şey var mı araştırmadım yalnız RTC Alarm özelliğini kullanmıyorsan, her saniye değişikliğinde alarm'ı bir sonraki saniyeye kurarsan, her alarm kesmesinde saatin o anki değerini alırsın. Örneğin:

01:02:00'da RTC Alarmı 01:02:01'e set edersin.
01:02:01'de kesmeni alırsın, kesme içinde alarmı 01:02:02'ye set edersin. Böylelikle her kesme gelişinde saatini çekmiş olursun.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

justice_for_all

buda guzel bir fikir hocam.soyle dusundum rtc 1 hzlik sinyal veriyor sonucta bu sinyal capture modulune icten baglanabiliyormu onu arastiriyorum ama bisey bulamadim.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Karamel

hocam mesajinizi gorunce stm32f407 nin reference manual ini okumaya basladim. rtc kisminda asagiki madde var.

Automatic wakeup unit generating a periodic flag that triggers an automatic wake up interrupt.

justice_for_all

wake up icin uyutma gerekmiyormu acaba?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Karamel

#9
hocam bu konu hakkinda pek bilgim yok. sadece reference manual i sizin icin okuyorum. yanlis birsey soyluyor olabilirim. hocalarim duzeltir.

The periodic wakeup flag can be routed to the AFO_ALARM output provided it has been
enabled through bits OSEL[0:1] of RTC_CR register. AFO_ALARM polarity can be
configured through the POL bit in the RTC_CR register.


periodic wake up timer i alarm interruptina yonlendirilebiliyormus. yani dediginiz gibi uyutma gerektirmiyorsa bu sekil calisma ihtimali var gibi gorunuyor hocam?

mesaj birleştirme:: 26 Nisan 2015, 01:32:58

System reset, as well as low power modes (Sleep, Stop and Standby) have no influence on the wakeup timer.

hocam  sistem resetin yani sira sleep stop ve standby dan etkilenmiyormus bu timer. eger low power moduna sokmadanda calisabiliyorsa bence bu sey tam istediginiz sey.

justice_for_all

#10
saolun hocam bunu en guzel kod yazarak deneyebilirim.

mesaj birleştirme:: 26 Nisan 2015, 02:23:02

yaptim arkadaslar her saniyede rtc ile kesme uretebiliyorum. wake up kesmesi ile.

kullanimi ise soyle rtc fonksiyonunuza asagidakileri eklemeniz yeterli

                RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);  //   32768 / 16=2048
		RTC_SetWakeUpCounter(0x7FF);                                               //   2048 / (0x7FF + 1) = 1 saniye
  
                   / * Enable the Wakeup Interrupt */
		RTC_ITConfig(RTC_IT_WUT, ENABLE);

                  /* Enable Wakeup Counter */
		RTC_WakeUpCmd(ENABLE);


ve stm32f4xx_it.c  dosyasina asagidaki kodu eklemeniz yeterli

void RTC_WKUP_IRQHandler(void)
{
  if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
  {
    RTC_ClearITPendingBit(RTC_IT_WUT);
    EXTI_ClearITPendingBit(EXTI_Line22);
    get_rtcc();  //benim fonksiyonum
  }
}
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Karamel

RTC_CR registerinin  22 ve 21. bitleri hocam. bunlari 11 yapmalisiniz.


Bits 22:21 OSEL[1:0]: Output selection
These bits are used to select the flag to be routed to AFO_ALARM RTC output
00: Output disabled
01: Alarm A output enabled
10:Alarm B output enabled
11: Wakeup output enabled


10. bitini 1 yapmalisiniz. (wake up timer enable)

2-1-0. bitlerde selection bitleri.

Bits 2:0 WUCKSEL[2:0]: Wakeup clock selection
000: RTC/16 clock is selected
001: RTC/8 clock is selected
010: RTC/4 clock is selected
011: RTC/2 clock is selected
10x: ck_spre (usually 1 Hz) clock is selected
11x: ck_spre (usually 1 Hz) clock is selected and 216 is added to the WUT counter value
(see note below)

ayrica hocam RTC_ISR registerinin 10. bitini interrup icersinde temizlemelisiniz.

mesaj birleştirme:: 26 Nisan 2015, 02:27:13

hocam denedikten sonra sonucu buraya yazabilirmisiniz? bende merak ediyorum wake up timer calisacakmi diye.

justice_for_all

denedim hocam calisti.

void Init_Rtc(void);
void get_rtcc(void);


unsigned int time=0;


RTC_TimeTypeDef RTC_TimeStructure1;
RTC_DateTypeDef RTC_DateStructure1;


int main(void)
{
	
	volatile int i;
	//unsigned char kontrol=0;
	
	//uint16_t data=0x1000,temp=0;
	
	GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  /* Configure PG6 and PG8 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

  /* Configure PG6 and PG8 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	Init_Rtc();
	
	 //SysTick_Config(SystemCoreClock/100);
	
	
    while(1)
   {
		 
   } 
	
	}

	void Init_Rtc(void)
	{
		RTC_InitTypeDef RTC_InitStructure;
		RTC_TimeTypeDef RTC_TimeStructure;
		RTC_DateTypeDef RTC_DateStructure;
		  
		NVIC_InitTypeDef NVIC_InitStructure;
		EXTI_InitTypeDef  EXTI_InitStructure;
		
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  /* Allow access to RTC */
		PWR_BackupAccessCmd(ENABLE);

  /* LSI used as RTC source clock */
  /* The RTC Clock may varies due to LSI frequency dispersion. */   
  /* Enable the LSI OSC */ 
		RCC_LSICmd(ENABLE);
		
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  /* Enable the RTC Interrupt */
		NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
		
  /* EXTI configuration */
		EXTI_ClearITPendingBit(EXTI_Line22);
		EXTI_InitStructure.EXTI_Line = EXTI_Line22;
		EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
		EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
		EXTI_InitStructure.EXTI_LineCmd = ENABLE;
		EXTI_Init(&EXTI_InitStructure);

  /* Wait till LSI is ready */  
		while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
		{
		}
	  /* Select the RTC Clock Source */
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
   
  /* Enable the RTC Clock */
		RCC_RTCCLKCmd(ENABLE);

  /* Wait for RTC APB registers synchronisation */
		RTC_WaitForSynchro();
		
		RTC_InitStructure.RTC_HourFormat=RTC_HourFormat_24;
		RTC_InitStructure.RTC_AsynchPrediv=127;
		RTC_InitStructure.RTC_SynchPrediv=255;
		

		RCC_RTCCLKCmd(ENABLE);
		RTC_WaitForSynchro();
		RTC_ClearITPendingBit(RTC_IT_WUT);
		EXTI_ClearITPendingBit(EXTI_Line22);
		
		RTC_TimeStructure.RTC_Hours=0x22;
		RTC_TimeStructure.RTC_Minutes=0x10;
		RTC_TimeStructure.RTC_Seconds=0x00;
		
		RTC_DateStructure.RTC_Date=0x24;
		RTC_DateStructure.RTC_Month=0x04;
		RTC_DateStructure.RTC_Year=0x15;
		RTC_DateStructure.RTC_WeekDay=RTC_Weekday_Friday;
		
		RTC_Init(&RTC_InitStructure);
		
		RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
		RTC_SetWakeUpCounter(0x7FF);
  
		/* Enable the Wakeup Interrupt */
		RTC_ITConfig(RTC_IT_WUT, ENABLE);

		/* Enable Wakeup Counter */
		RTC_WakeUpCmd(ENABLE); 
		
		RTC_SetTime(RTC_Format_BCD,&RTC_TimeStructure);
		RTC_SetDate(RTC_Format_BCD,&RTC_DateStructure);
		
	}

	void get_rtcc(void)
	{
	
		RTC_GetTime(RTC_Format_BCD,&RTC_TimeStructure1);
		RTC_GetDate(RTC_Format_BCD,&RTC_DateStructure1);
		GPIO_ToggleBits(GPIOD,GPIO_Pin_13);

	}


ve stm32f4xx_it.c  dosyasina asagidaki kodu eklemeniz yeterli


void RTC_WKUP_IRQHandler(void)
{
  if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
  {
    RTC_ClearITPendingBit(RTC_IT_WUT);
    EXTI_ClearITPendingBit(EXTI_Line22);
    get_rtcc();  //benim fonksiyonum
  }
}

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay