stm32f407vgt6 RTC saatini güncelleştirme problemi

Başlatan Gökhan BEKEN, 18 Kasım 2015, 10:22:48

Gökhan BEKEN

İlk init yaptıktan hemen sonra yeni saati girdiğim zaman sorun yok. Hatta iki kere yeni saat girsem yine çalışıyor(son girdiğim saati başarılı bir şekilde güncelleştiriyor)
Fakat proje çalışırken, diğer çevre birimleri sanki engel oluyor çünkü dışardan gelen bir tetiklemeye göre saati güncelleştirmek istediğimde fonksiyon başarılı dönmesine ramen saat değişmiyor.
Saati güncelleştirirken RTC'yi tekrar init yapmayı da denedim ama hala güncelleştirmiyor.
Fonksiyonları Majerlenin örneğinden kopyaladım: https://github.com/MaJerle/stm32f429/blob/master/19-STM32F429_RTC/User/main.c

Not: projemde usb vcp, spi, exti gibi çevre birimleri var.
Özel mesaj okumuyorum, lütfen göndermeyin.

MrDarK

Kullandığın kod parçasını görebilir miyiz ? Güncelleme yaparken kullandığın kısımdan bahsediyorum
Picproje Eğitim Gönüllüleri ~ MrDarK

Karamel

Hocam simple bir project olusturup. Sadece rtc unit i calistirip deney yapabilirmisiniz?

Rtc unit in uzerine yazilmalari onlemek icin. Yani rtc counter i korumak icin bir bit vardi. Onu active etmiyor olabilirmisiniz?

Gökhan BEKEN

#3
Alıntı yapılan: MrDarK - 18 Kasım 2015, 10:33:02
Kullandığın kod parçasını görebilir miyiz ? Güncelleme yaparken kullandığın kısımdan bahsediyorum
Normalde usb'den gelen unixTime'ı RTC'nin anlayacağı türe çevirip öyle güncellemeye çalışıyorum. Ama aşağıdaki gibi sabit bir unix time bile versem değişmiyor. Yani bağımsız denemek için yaptım bunu.
TM_RTC_Time_t saat;
TM_RTC_GetDateTimeFromUnix(&saat, 1446738262); //sabit bir unixtime verdim
TM_RTC_SetDateTime(&asdasda, TM_RTC_Format_BIN);

Bu fonksiyon gayet düzgün çalışıyor: TM_RTC_GetDateTimeFromUnix
saat değişkenini yazdırdığım zaman tam istediğim gibi çevirdiğini görüyorum.
Fakat bu şekilde çalışmadı. Hani olur da bu şekilde yapınca belki olmuyordur diye, ilk başta yaptığım gibi yapayım bari ne olacak dedim, yine aynı:
TM_RTC_Time_t saat;
saat.hours = 0;
saat.minutes = 59;
saat.seconds = 55;
saat.year = 14;
saat.month = 6;
saat.date = 7;
saat.day = 6;
TM_RTC_SetDateTime(&saat, TM_RTC_Format_BIN);
   



Alıntı yapılan: Karamel - 18 Kasım 2015, 10:34:52
Hocam simple bir project olusturup. Sadece rtc unit i calistirip deney yapabilirmisiniz?

Rtc unit in uzerine yazilmalari onlemek icin. Yani rtc counter i korumak icin bir bit vardi. Onu active etmiyor olabilirmisiniz?
Sadece rtc olduğunda sorun olacağını sanmadığım için denemedim ama bir deneyim.
Bahsettiğin gibi bir register'dan haberim yok açıkçası, ama counter'da sorun yok saat her türlü çalışıyor sadece yeni saat giremiyorum.
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

Hocam suan okuldayim bakamiyorum ama rtc unit in configuration bitini enable etmeden rtc counter uzerine birsey yazamiyorsunuz. Bence sorununuz buyuk ihtimal bu.

MrDarK

#5
Karamel;
Hazır fonksiyon içinde RTC Write Protect kaldırılıp tekrar kilitleniyor. Set_DateTime fonksiyonu o işi yapıyor.

Öteki konuya gelecek olursak;
Datasheet'de shadow registerlarının güncellemesi donanımsal mı olsun yoksa atamalı mı olsun diye bir seçenek vardı diye hatırlıyorum; Birde şöyle bir not var RTC okuma ve güncelleme işlemlerinde;

///Lp(Low Power) kalkışında veya normal durumda shadow registerları hemen güncellenmediği için tarih saati
///3 kere okuyup değerlendirin

Bizde şu şekilde kullanıyoruz;
RTC_GetTime(RTC_Format_BCD, &RTC_TimeStr);
RTC_GetDate(RTC_Format_BCD, &RTC_DateStr);
RTC_WaitForSynchro();

Bu grubu 3 kere çağırıyorum :) Sonra Set_Time işlemi yapıp tekrar RTC_WaitForSynchro(); fonksiyonunu kullanıyorum. Set işlemi yaptırırken RTC_WaitForSynchro(); 'nun dönüş değerini kontrol etmende yarar var.
Picproje Eğitim Gönüllüleri ~ MrDarK

Gökhan BEKEN

#6
@Karamel dediğini yaptım ama o zaten sorunsuz çalışıyor, benim kodun başında da sorun yok. Sadece diğer çevrebirimleri çalışırken sorun oluyor.

mesaj birleştirme:: 18 Kasım 2015, 11:49:23

Sorun şurda: RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
bu fonksiyon VCP initte çağırılıyor.
Fonksiyon içerisinde RCC->APB1RSTR |= RCC_APB1Periph;
yapılıyor.
Bunu iptal edince sorun düzeliyor.

Ama bu usb için gerekli olmasa koymazlardı herhalde. Ne yapmam lazım acaba?
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

hocam yeni pc basina oturup bakabilme firsatim oldu.

oncelikle ben st microelectronics in librarylerinden anlamiyorum. ben sadece reference manuel i acip. okuyup. registerlari anlayabiliyorum.

simdi APB1RSTR registeri RCC APB1 peripheral reset register diye geciyor ve power reset bitinden baska(bunun da rtc unit ile ilgili oldugundan emin degilim. okumak icin yeterli zamanim yok) baska rtc unit i etkileceyecek bir bit yok?