13 Haziran 2015 Cumartesi

STM32F429 RTC BİRİMİ İLE SAAT





    Bu çalışmam da stm32f429 discovery kitini kullanarak analog ve dijital saat tasarımı yapıp bunu lcd ekranda göstermek. Bunun için stm32f429 entegresi içindeki RTC(Real Time Clock) birimini kullanarak yapmak. Bu çalışma da saat için  TM STM32F4 RTC kütüphanesinden yararlanıldı.

   DS1307 saat entegresini kullanarak saat tasarımı yapanlar bilirler ki bu iş için  32768 Hz bir kristal gereklidir. Aynı kristal yine bu çalışmamda kullanıldı. Tek farkı bu kristal stm32f429 entegresi içinde var veya eğer  siz bu kristali dışarıdan bağlamak isterseniz benim yazılım için bunu PC14, PC15 girişlerine bağlayarak yapabilirsiniz. DS1307 entegresi üzerinde Vbat girişi bulunur. Bu aynı girş yine  stm32f429 entegresinde de vardır.

   Benim yazdığım kod sadece basit bir saat tasarımı içindir. Bu kütüphaneyi kullarak daha iyi ve kararlı bir saat tasarımı yapabilirsiniz.

  Yine bu yazılım için Keil programı kullanıldı ve bu yazılım üzerinde oynanarak daha iyisi yapılabilir.

Keli Kod;
#include "stm32f4xx.h"
#include "defines.h"
#include "tm_stm32f4_rtc.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_disco.h"
#include "tm_stm32f4_emwin.h"
#include "button.h"
#include "DIALOG.h"
#include
#include
#define TWO_PI 6.28318530717958647693
#define HALF_PI 6.28318530717958647693/4.0


int x0 = 120;
int y0 = 120;
float k;
float s ;
float m ;
float map(float x, float in_min, float in_max, float out_min, float out_max);
void gosterge_cizdir(void);
void gun(void);
char buf[50];

TM_RTC_Time_t zaman; 
int main(void) {

 /* Initialize system */
 SystemInit();

 /* Initialize delay functions */
 TM_DELAY_Init();

 /* Initialize LEDs */
 TM_DISCO_LedInit();

 /* Initialize emWin */
 if (TM_EMWIN_Init() != TM_EMWIN_Result_Ok) {
  /* Initialization error */
   while (1) {
      /* Toggle RED led */
      TM_DISCO_LedToggle(LED_RED);
      /* Delay */
      Delayms(100);
    }
 }
 /* Initialize RTC with internal 32768Hz clock */
 /* It's not very accurate */
 if (!TM_RTC_Init(TM_RTC_ClockSource_Internal)) {
  /* RTC was first time initialized */
  /* Do your stuff here */
  /* eg. set default time */
 }

 /*Çalistirilmaya baslamadan once ilk olarak asagidaki yerleri doldurun*/
     zaman.hours = 00;//00 ile 23 aras1nda secilir
   zaman.minutes = 42;//00 ile 59 aras1nda secilir
   zaman.seconds = 00;//00 ile 59 aras1nda secilir
   zaman.year = 15;
   zaman.month = 6;
   zaman.date = 13;
   zaman.day = 6;  // 1 den  7'ye. Sirasiyla  pazartesi,......,pazar

 TM_RTC_SetDateTime(&zaman, TM_RTC_Format_BIN);
 /* Her 125 ms'de bir kesme üreterek TM_RTC_RequestHandler() bu fonksiyona girer ve günclemeden yard1m eder */
 TM_RTC_Interrupts(TM_RTC_Int_125ms);


 GUI_SetBkColor(GUI_GRAY); // arka plan rengi
  GUI_Clear();

 GUI_SetPenSize( 5 ); // Dis cemberin kalinligi
 GUI_SetTextMode(GUI_TM_TRANS);
  GUI_SetFont(&GUI_FontComic18B_ASCII);
  GUI_SetColor( GUI_BLUE );// dis cember rengi
 
  GUI_SetTextMode(GUI_TM_TRANS);
  GUI_SetFont(&GUI_FontComic18B_ASCII);
  GUI_DrawArc( x0,y0,110, 110,0,360); //dis cemberi cizdir
 
 while (1) {
     gosterge_cizdir();// cember icinde olan noktalari ve sayilari çizdir.

      TM_RTC_GetDateTime(&zaman, TM_RTC_Format_BIN); /* STM32F429 ICINDEKI RTC BOLUMUNDEN
      zaman ile ilgili olan saat, dakika, saniye gibi bigileri almak icin kullanilir*/

    GUI_SetColor( GUI_RED );
    sprintf(buf, "TARIH: %02d.%02d.%04d\n", zaman.date, zaman.month,zaman.year + 2000);
    GUI_DispStringAt(buf, 10, 300);
     sprintf(buf, "SAAT: %02d:%02d:%02d\n",zaman.hours,zaman.minutes,zaman.seconds);
    GUI_DispStringAt(buf, 10, 280);
    GUI_SetColor( GUI_GRAY );
       GUI_SetPenSize( 4 );
     GUI_DrawLine( x0,  y0, cos(s)*60+120 , sin(s)*60+120);
    GUI_DrawLine( x0,  y0, cos(k)*40+120 , sin(k)*40+120);
    GUI_SetPenSize( 3);
    GUI_DrawLine( x0,  y0, cos(m)*50+120 , sin(m)*50+120);

       k = map(zaman.hours%12, 0, 12, 0, TWO_PI)-HALF_PI;
     /*Map fonk 0 ile 12 olan sayilar1 0 ile iki pi arasina uygun olarak ayarlar */
      s = map(zaman.seconds, 0, 59, 0, TWO_PI)-HALF_PI;
    m = map(zaman.minutes, 0, 59, 0, TWO_PI)-HALF_PI;
     /*Asag1daki ko parcas1nda cember 1c1ndeki akrep,yelkovan cizildi ve bunun icin
       trigonometriden yararlan1ld1*/
    GUI_SetColor( GUI_BLUE );
       GUI_SetPenSize( 4);
      GUI_DrawLine( x0,  y0, cos(s)*60+120 , sin(s)*60+120);
    GUI_SetPenSize( 3);
    GUI_SetColor( GUI_RED );
    GUI_DrawLine( x0,  y0, cos(m)*50+120 , sin(m)*50+120);
    GUI_SetColor( GUI_BLACK );
       GUI_SetPenSize( 4);
     GUI_DrawLine( x0,  y0, cos(k)*40+120 , sin(k)*40+120);
   
    gun();
 }
}
void gun(void){
   switch (zaman.day){
        case 1: GUI_DispStringAt("PAZARTESI", 10, 250);break;
        case 2: GUI_DispStringAt("SALI", 10, 250)     ;break;
     case 3: GUI_DispStringAt("CARSAMBA", 10, 250) ;break;
     case 4: GUI_DispStringAt("PERSEMBE", 10, 250) ;break;
     case 5: GUI_DispStringAt("CUMA", 10, 250)     ;break;
     case 6: GUI_DispStringAt("CUMARTESI", 10, 250);break;
     case 7: GUI_DispStringAt("PAZAR", 10, 250)    ;break;
       }
}
void gosterge_cizdir(void){
 char ac[4];
 int i;
 for (i=1; i<= 12; i++) {
     float a = (i*30)*3.1415926/180;
     int x = 100*cos(a)+x0;
     int y = 100*sin(a)+y0;
  
      if (i%3 == 0)
    GUI_SetPenSize( 5 );// saat 12,3,6 ve 9 1c1n büyük nokta
      else
      GUI_SetPenSize( 4 );// digerleri 1c1n 1se kucuk nokta koy
  
      GUI_DrawPoint(x,y);
    
     if (i%3 == 0) { //saat 12,3,6 ve 9 say1lar1 yazd1r 
          x = -80*cos(a)+x0;
          y = 80*sin(a)+y0;
          sprintf(ac, "%d", i);
          GUI_SetTextAlign(GUI_TA_VCENTER);
          GUI_DispStringHCenterAt(ac,y,x);
      }   
    } 
}
void TM_RTC_RequestHandler() {
       TM_DISCO_LedToggle(LED_RED | LED_GREEN);
    GUI_ClearRect(0, 250, 240, 300);
}

float map(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
/* User handler for 1ms interrupts */
void TM_DELAY_1msHandler(void) {
 /* Call periodically each 1ms */
 TM_EMWIN_UpdateTouch();
}


Çalışma Videosu