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