Nuvoton RTC Kullanımı
Nuvoton M252KG M23 ARM işlemcisi ile RTC kullanımını anlatacağım. Geliştirme kartı olarak Nuvoton NuMaker-M252KG V1.3 kullanıyoruz.
Harici 32.768KHz Kristal Osilatörün Kurulumu
32.768KHz kristal osilatör kartımızda PF.4 ve PF.5 pinlerinde bağlıdır.
Kaynak: Nuvoton UM_NuMaker-M252KG_EN_Rev1.00.pdf
Bu pinleri giriş olarak kuralım.
PF->MODE &= ~(GPIO_MODE_MODE4_Msk | GPIO_MODE_MODE5_Msk);
Daha sonra Harici 32.768Khz kristal girişini aktif edelim.
CLK_EnableXtalRC(CLK_PWRCTL_LXTEN_Msk);
Aktif edilen kristal girişinin stabil hale gelmesini bekliyelim. İlk enerji verildiğinde voltaj oturana kadar osilatör stabil hale gelmeyebiliyor.
CLK_WaitClockReady(CLK_STATUS_LXTSTB_Msk);
Her iki giriş pininde oluşacak olan sızıntı akımlarını önlemek için işlemci içerisinde bulunan dijital giriş yolunu pasif hale getiriyoruz.
GPIO_DISABLE_DIGITAL_PATH(PF, (1ul << 4));
GPIO_DISABLE_DIGITAL_PATH(PF, (1ul << 5));
Tüm bunları tek bir fonksiyonda topluyalım. Bu fonksiyon harici kristal kurulum fonksiyonumuz olsun. Bu fonksiyonu sistem clock fonksiyonlarından sonra kullanmamız gerekiyor.
void LXT_Init(void)
{
PF->MODE &= ~(GPIO_MODE_MODE4_Msk | GPIO_MODE_MODE5_Msk);
CLK_EnableXtalRC(CLK_PWRCTL_LXTEN_Msk);
CLK_WaitClockReady(CLK_STATUS_LXTSTB_Msk);
GPIO_DISABLE_DIGITAL_PATH(PF, (1ul << 4));
GPIO_DISABLE_DIGITAL_PATH(PF, (1ul << 5));
}
RTC Modülünün Aktif Hale Getirilmesi
Harici kristal kurulumunu tamamladığımıza göre şimdi de RTC (Real Time Clock) modülümüzün clock sinyalini aktif hale getirelim.
CLK_EnableModuleClock(RTC_MODULE);
Her ARM işlemcide olduğu gibi bu işlemcide de RTC kullanmamız için bir struct yapı bulunmaktadır. rtc.h dosyası içerisnde bu yapı tanımlanmış olarak gelmektedir.
typedef struct
{
uint32_t u32Year; /*!< Year value */
uint32_t u32Month; /*!< Month value */
uint32_t u32Day; /*!< Day value */
uint32_t u32DayOfWeek; /*!< Day of week value */
uint32_t u32Hour; /*!< Hour value */
uint32_t u32Minute; /*!< Minute value */
uint32_t u32Second; /*!< Second value */
uint32_t u32TimeScale; /*!< 12-Hour, 24-Hour */
uint32_t u32AmPm; /*!< Only Time Scale select 12-hr used */
} S_RTC_TIME_DATA_T;
Struct yapısını incelediğimizde takvim ile ilgili tüm değişkenlerin tanımlı olduğunu görmekteyiz.
Bu yapıyı RTC_Kurulum olarak tanımlayalım.
S_RTC_TIME_DATA_T RTC_Kurulum;
Tarih ve saat bilgilerimizi girelim.
RTC_Kurulum.u32Year = 2022; // yıl bilgisi
RTC_Kurulum.u32Month = 6; // ay bilgisi
RTC_Kurulum.u32Day = 7; // gün bilgisi
RTC_Kurulum.u32Hour = 9; // saat bilgisi
RTC_Kurulum.u32Minute = 30; // dakika bilgisi
RTC_Kurulum.u32Second = 0; // saniye bilgisi
RTC_Kurulum.u32DayOfWeek = RTC_TUESDAY; // haftanın günü bilgisi
RTC_Kurulum.u32TimeScale = RTC_CLOCK_24; // saat formatı 24 saat
struct yapıyı doldurduktan sonra bu parametreler ile RTC modülünü kuralım.
if (RTC_Open(&sInitTime) != 0) {
printf("\n RTC kurulumu basarisiz oldu!!");
printf("\n Lutfen Donaniminizin calistigindan emin olunuz!!");
while (1);
}
Kurulum başarılı oldu ise RTC_Open fonksiyonu "0" değeri ile geri döner.
Not: RTC modülü geliştirme kartında enerji kesilene kadar devam eder. Enerji kesilir ise veya kart resetlenir ise her şey baştan başlar. İşlemcinin VBAT pinine bir batarya takmalısınız
RTC Modülünden Güncel Tarih ve Zaman Verilerinin Alınması
RTC modülü çalışmaya başlamıştır. Peki çalışan RTC modülünden güncel tarih ve zamanı nasıl alacağız.
Bunun için aşağıdaki fonksiyonu herhangi bir zamanda kullanıp tanımladığınız struct yapıya güncel verileri çekebilirsiniz.
RTC_Guncel isimli bir struct tanımlayalım.
S_RTC_TIME_DATA_T RTC_Guncel;
Bu fonksiyon ile de güncel tarih ve zaman bilgilerini çekelim.
RTC_GetDateAndTime(&RTC_Guncel);
Hiç yorum yok:
Yorum Gönder