Ynt: Baştan Sona STM32F0 Discovery Uygulamaları

Başlatan MrDarK, 08 Nisan 2015, 23:29:35

MrDarK

Merhaba arkadaşlar;

Bu konu başlığı altında bölüm bölüm uygulamalar yapacağız. Kısmetse her 2-3 günde bir proje tamamlamayı düşünüyoruz. Uygulamaları Baran Ekrem adlı üyemizle beraber yapacağız.

Böylelikle geçmişte tartıştığımız Usta Çırak programının ilk adımını atmış olacağız. Usta Çırak Programını bilmeyenler için Link : https://www.picproje.org/index.php/topic,55760

Uygulamalarımızda STM32F0 Discovery boardı kullanacağız, bu board'a ait teknik link = http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF253215?sc=internet/evalboard/product/253215.jsp

STM32F051R8 Datasheet : http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00039193.pdf

STM32F0 Ailesi Referance Design Guide Linki : http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031936.pdf

Çalışmalarımızı takip etmek isteyen arkadaşlar mutlaka bu dökümanları indirsinler çünkü ara ara bakıp anlatacağız. Kütüphane olarak Standart Peripheral Library kullanacağız. Link : http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257885#

Ide ve Compiler olarak Emblocks ve GCC ikilisini kullanacağız. Emblocks Download : http://www.emblocks.org/web/downloads-main
Ide kendi içinde compiler olarak standart gcc'yi barındırıyor. Ayrıca Standart Peripheral kodları da ide tarafından ekli şekilde geliyor :)

Dipnot : Projede desteğini esirgemeyen EMPA Elektroniğe Saygılarımla;

MrDarK

Dipnot 2 : Uygulamalar harici yazılan mesajlar kaldırılacaktır, Genel Sohbet bölümünde uygun bir konu açılabilir veya Usta Çırak Programı başlığı altında düşünce ve fikirlerinizi dile getirebilirsiniz. Anlayışınız için teşekkürler.




mesaj birleştirme:: 09 Nisan 2015, 00:18:33

Üstteki mesajımda önerdiğim linkleri indirdiğinize göre artık Emblocks ile tanışma faslına gelebiliriz. Şahsen STVD (ST Visual Development) adlı programı uzunca bir süre kullanıp bu programı kullandıktan sonra harbi harbi eşşekten inip ata binmiş gibi hissetmiştim kendimi :)

Emblocks kolay kolay takılıp çökmeyen , oldukça hızlı, kendini hala geliştirmekte olan bir Ide. Ücretsiz olduğundan eksiklikleri göze batmıyor ve onların da zamanla kapanacağına inanarak kullanımından kısaca bahsedeceğim.

Emblocks ile Adım Adım Proje Oluşturma
Öncelikle aşağıdaki gibi bir ekran önümüze geliyor, bu ekranda File > New > Project seçeneklerini giriyoruz. ( Yazı ile de yazıyorum ki yıllar sonra resim silinirse en azından yazdıklarımız kalsın :) )


Ardından çıkan pencerenden Stmicro-ARM logosunu seçip Go tuşuna basıyoruz.


Peşinden çıkan sayfayı geçin ve projeyi nereye kayıt etmek isterseniz istediğiniz isimde istediğiniz bölgeye kayıt edin

Derleryici olarak otomatik GCC'yi seçecektir,


Next dedikten sonra bize hangi MCU ile çalışmak istediğimizi sorar, Mikroişlemcimiz Cortex M0 olduğundan Cortex_M0 seçeneğini seçeriz. Next tuşuna basarız.


Daha detaylı olarak mcunun adını gireriz, biz stm32f051r8 kullanmaktayız, Projeye standart peripheral lib otomatik olarak eklensin istiyoruz Create hex for debug işaretleyebilirsiniz. Stack size ve heap size değerlerini projenize göre girin, eğer ne olduklarını bilmiyorsanız araştırarak öğrenebilirsiniz. Bir fikriniz yok ise mevcut değerleri kalsın. Finish dediğinizde size debugger ile ilgili ayarları getirecek.


Execute from ram fonksiyonları kullanıyorsanız işaretleyin, swd üzerinden program atacağımız için ayarlara dokunmadan ok ve ok diyerek proje oluşturmayı bitiriyoruz.


En son önümüze böyle bir sayfa açılıyor.


1. Bölümün sonuna geldik :) Idenin kullanımı hakkında uygulama yaparken biraz daha detayına ineceğim. Görüşmek üzere.
Picproje Eğitim Gönüllüleri ~ MrDarK

Okan AKÇA

Elinize saglik hocam  konunun güncel kalması önemli

baran123

#2
Öncelikle MrDarK hocama çok teşekkür ederim.Beni öğrencisi olarak kabul edip STM32 dersleri vermeye başadı. :) İlk dersi güzel bir şekilde tamamladık.Baştan belirteyim belki ufak tefek hatalarım olabilir.Zamana toparlar düzenleriz.

Ben edindiğim bir takım bilgileri burada paylaşacağım.

Bu uygulamalarda kullanacağımız kit'i tekrar belirteyim STM32F0 kullandık.
Asında 32f407 kit e mecut idi fakat daha sade bir kitle başlamak daha iyi olur diye düşündüm.
Kitin üzerinde STM32F051R8T6 işlemcisi mevcut.
Bir kaç özelliği : Cortex M0 Ailesinden 64 KB Flash memory, 8 KB RAM geri kalan bilgiler paylaşılan linkerde mevcut.

İlk olarak programları kurulumdan sonra arayüzü inceledik.Yine Paket program denilen bir yapıda diyebiliriz.File,wiew,projecs gibi tooları mevcut.

İlk olarak Debug menüsünü inceledik çünkü en çok kullanılan özellik gibi denenebilir.
Anladığım kadarıyla bu bizim elimiz ayağımız olacak :)
1.kutuda debug'a tıklayarak açılan sekmede start/stop debug session tıklayarak debug işmini başlatıyoruz.
Bu sırada kiti takmamız ve bilgisayarın düzgün şekilde kiti tanıması gerekli ki bunun için driver kuruyoruz.
2.kutuda ki smgeler soldan başlayarak 1. sembol mikroişlemcimize  reset atmamızı sağlıyor heme hiç bir donanımsal hareket yapmamıza gerek kalmadan.
2.sembol contiune yani devam ettiriyor.
3.sembol bir satır ilerlememizi sağlıyor yani programı adım adım çalıştırıyoruz ve ne oluyor ne bitiyor her şeyi takip ediyoruz.
Ve en sondaki buton ile debug bitiriyoruz.Kısayolu f8 başlat ve bitir için.


şimdi sol tarafda dosya ağacı olarak bulunan klasörlerin arasından ASM-SRC-startup_stm32f0xx.S dosyasını açıyoruz.Bu dosya
Şimdi sol taraf da bulunan dosya ağacı içinde main.c nin altında system_stm32f0xx.c dosyasının açıyoruz.
Bu starttupdan yani ilk çalışacak programı beirtiyor.Bu dosya içinde system init yapılıyor.
Daha sonra 189.satırda bulunan koda göre "bl main /* Jump to our main */" açıklamada yazdığına göre main içine giriyor.
systeminit de neler yapılıyor inceleyelim.

Bu kısımda mikroişlemcinin hız ve bazı özelliklerinin ayarlarının yapıldığı kısımdır.
Dikkat edecek olursak HSI on yapılmış,PLL aktif,(bir çeşit katlayıcı), tüm interruptlar pasif hale getirilmiş.
Kodların hemen üstünde zaten açıklama satırları mevcut kodun ne iş yaptığını hemen anlayabiliriz.
Daha sonra SetSysClock(); fonksiyon çağırılımış.Bu kısmı detaylı açıklamayacağım çünkü emin olamadığım bir kaç nokta mevcut
Ama özetleyecek olursak system clockunu hazırlayana kadar burada kalıyor.Birden 8 bitten stm geçmek isteyen olursa benim gibi şu noktada kafa karışabiliyor.
Mesela tanımlamalarda değer verirken 0x00F45DDC gibi kocaman bir hex olabiliyor.8bitte bu değeri 0xff yapabiliyorduk maksimum her basamak 4 değerli bit ifade ediyormuş.
8 bitte 2 tane olduğundan 4*2 = 8 stmde 8*4=32 ve alın size işlemcinizin biti :)

Ekleme : Güzel bir kısımdan bahsetmeyi unutmuşum.Debug menüsü altında Debug windows kısmında bir kaç araç bulunmakta.Breakpoints toolu bizim programdan nerede durma noktaları(breakpoints) olduğunu gösteriyor program büyüdükçe çok işe yaracak gibi gözüküyor.

FxDev

Oldukça güzel bir başlangıç. Tek önerim Stm32F0 için Keil kullanılabilirdi. Devamını bekliyorum ;)
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!

MrDarK

Hem diğer sürüm MCUlar(32FX serisi gibi) için ücretsiz çözümlerinden hemde Emblocks'a olan aşinalığım yüzünden kasti olarak Emblocks ile eğitime devam edeceğiz.

Eğitimi baran alıp baran paylaşacak, bakalım umarım hem baran adına hemde forum adına güzel şeyler olur.

Dipnot : Keil'ın 32F0 için ücretsiz olduğunu biliyorum.

Durmak yok yola devam.
Picproje Eğitim Gönüllüleri ~ MrDarK

FxDev

Son bir önerim olsun o halde. Foruma yazmak güzel bir çözüm gibi ama PDF olarak bölüm bölüm yayınlanırsa sonrasında toplanıp güzel bir doküman haline getirilebilir.

Çok zor bir iş bu, şimdiden kolay gelsin :)
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!

baran123

#6
Tekrardan merhaba,

2.Derside yine güzel bir şekilde tamamladıktan sonra notları paylaşalım.
Başlamadan önce kesin olarak söyleyebileceğim tek şey  Önceden gözümü korkutan STM aslında kolay" :) başlarda biraz ağır gözüksede tanımlama isimleri uzun ve biraz daha detaylı.Tabi hafife almamakda fayda var :D ama birazcık ingilizce (bol bol transate ve teknik terim) kullanarak birde datasheet 'e ve açıklamaları çevirmeye çalışınca üstüne bir de MrDarK gibi güzel anlatan bir hocam olunca çok zevkli :D

Bu derste GPIO işlemlerinin nasıl yapıldığını öğrendim.Kod üzerinden açıklamalı anlatmak istiyorum.
Kitin şematik dosyasına buradan ulaşabilirsiniz.
/*****************************************************************************

* File Name        : main.c

* Description      : GPIO_Uygulaması

********************************************************************************

* Additional Information : Buton'a basıldığında ilgili çıkışı set eden program

*******************************************************************************/

// Kütüphane dosyalarını kullanabilmek için eklenmiştir.
#include "stm32f0xx_conf.h"

//Delay fonskiyonunun prototipini tanımladık döndereceği değer ve alacağı parametreleri belirledik çdeğer döndürmeden int32 değer alacak
void Delay(__IO uint32_t);
//Bu sayede main fonksiyonun üstünü şişirmedik ama program içerisinde böyle bir fonksiyon var dedik çünkü kodlar yukarıdan aşağı akacağından bu parametreyi girmezsek delay fonksiyonun kullandığımız zaman (tanımladıktan önce ) hata verecektir.

/***********************************************************
* Function Name  : main
* Description    : Ana program burada döner
* Input          : void (hiç bir şey döndürmez)
* Return         : int (sonsuz döngü kuandıldığından "return 0;" komutuna gerek kalmadı)
***********************************************************/
int main(void)
{
    /*NOTE:
    Output open-drain: Pinin çıkış bacağı, P-Mos ile N-Mos mosfetleri arasında bulunmaktadır. 
    Eğer çıkışı open-drain ayarlarsanız, pin bacağı GND'ye bağlanır. VDD ile arasında sonsuz empedans oluşur. 
    Bu durumda pini high olarak çıkış vermek için dışarıdan pull-up dirençleri eklemeniz gerekmekte. Bu özellikle, çıkışa bağlanacak olan devre elemanının daha fazla akım çekmesi sağlanabilmektedir. 
    Röle gibi akım gerektiren devre elemanlarını sürmek için kullanılır. Akım mikroişlemciden değil, pull-up direnci üzerinden çekilir.
    Output push-pull:  Pin bacağı P-Mos mosfeti ile VDD pinine bağlanır. Akım gerektirmeyen işlemlerde, çıkışı logik 1 yapmak için bu mod kullanılır.
    */
    GPIO_InitTypeDef  GPIO_InitStructure;
    /*
        GPIO_InitTypeDef yapısındaki dataları GPIO_InitStructure'a verdik.
        GPIO_InitTypeDef'e sağ tıklayıp "find declaration derseniz kaynağını görüntüleyip içindekileri görebilirsiniz.
    */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);  //Bu fonksiyon ile kulancağımız porta clock vererek o portun bir nevi beslemesini yaptık ve enabled ederek aktifleştirdik.
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);  //Aynı işlemi a portu için aptık

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9; //yukarıda ki yapıda, alt elemanlara (hocamın örneğindeki manavın meyve çeşitleri gibi :)) nokta koyup erşebiliriz tanımlama ve iğer ayrıntılar için yapının kaynağını görntüleyebilirsiniz.(| işareti ve anlam gibidir 2 pin için belirtilen işlemi yapıyor)
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT; //yapıdak mode elemetini kullanarak pineri çıkış olarak tanımladık benim kitimde bu pinlerde led mevcut
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // #Bu ayarın 2 çeşidi var açıklama uzun olduğundan "goto note;" :) Akım gerektirmeyen bir iş yaptığımızdan push pul kullandık
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;//GPIO Speed 3 farklı seviyede leve1 2 mhz, level2 10mhz, level3 50mhz olabildiğince düşk akım çekip enerjiden tasarruf etmk için en uygun hız seçilmedlidir.
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//PuPd elementi ile pine pull up pull down ekleyebiliyoruz yine 3 seçenek mevcut 
    /*
    GPIO_PuPd_NOPULL = 0x00, direnc yok
    GPIO_PuPd_UP     = 0x01, pull up aktif  "Biz kullanmadık led olacağından"
    GPIO_PuPd_DOWN   = 0x02 pull down aktif
    */
    GPIO_Init(GPIOC,&GPIO_InitStructure); //şimdi bu fonksiyon ile C portuna yaptığımız ayarların adreslerini veriyoruz.ingilizce ve işareti değişkenin önünde ise adres anlamında

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;//kitimde a0 pininde led bulunmakta bunu kullandığım için tanımladım 
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN; //in yani giriş olacağını seçtim 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//pus pull kullanılıyor düşk akımdan dolayı
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;//hız 1 ci seviyede (2mhz)
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL; //normalde direnc kullnıırdı faket kitimdeki butonda PULL-DOWN yapılmış

    GPIO_Init(GPIOA,&GPIO_InitStructure); //yine a portunda ayar yatığımdan dolayı GPIO_InitStructure ın adresini a portuna yükledik

    while(1)//sonsuz döngü
    {
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))//pin durumunu kumak için bu fonksiyonu kullandık 1 veya 0 döndürecek
        {//butona basınca pull down drenci kalkacak pine lojik 1 geleceğinden true dönecek ve if içine girecek (butona baıldı)
            GPIO_SetBits(GPIOC,GPIO_Pin_8);//İlgii portun ilgili pinini set eder (lojik 1 verir) kitte 8 ve 9 pinleri le bağlı
            GPIO_SetBits(GPIOC,GPIO_Pin_9);
            //aynı işlemi tek satırda yapabiliriz GPIO_SetBits(GPIOC,GPIO_Pin_9 | GPIO_Pin_8);
        }
        else// basılmamş ise reset yani lojik 0 konumuna alır 
        {
            GPIO_ResetBits(GPIOC,GPIO_Pin_8);
            GPIO_ResetBits(GPIOC,GPIO_Pin_9);
        }
        //Buton ile ledi yakma uygulamasından önce led blinkde yaptım tek fark while içine ek olarak elay kulandık
        //Delay(10000000); ile aklaık olarak 3-4 bekleme yapılıyor.
        /*
            GPIO_SetBits(GPIOC,GPIO_Pin_8);
            GPIO_SetBits(GPIOC,GPIO_Pin_9);

            Delay(10000000);

            GPIO_ResetBits(GPIOC,GPIO_Pin_8);
            GPIO_ResetBits(GPIOC,GPIO_Pin_9);

            Delay(10000000);*/
    }
}

/***********************************************************
* Function Name  : Delay
* Description    : Gönderdiğimiz sayı kadar eksiltip gecikme saglar
* Input          : Counter değeri
* Return         : void
***********************************************************/
void Delay(__IO uint32_t nCount) {
  while(nCount--) {// verdiğimiz 32 bitlik değer sıfır olana kadar azaltır ve burada oyalanır 
  }
}






mesaj birleştirme:: 11 Nisan 2015, 14:15:15

Kodları bitirdikten sonra debug moduna geçiyoruz (f8) daha sonrada contiune tuşuna basarak programı başlatıyoruz.

mesaj birleştirme:: 11 Nisan 2015, 14:21:54

Ekleme : Bu örnek bir çalışma olduğundan işin yolunu yordamını öğrenmek için delay kullandık .Bu kulanım çok yanlış yani 48mhz de koşan bir işlemciyi duvara çarptırıp kalkmasını bekleme gibi bir şey saırım.Daha ileri uygulamalar da systemtick fonksiyonunu kullanmaya başlayacağız.

mesaj birleştirme:: 11 Nisan 2015, 14:23:30


baran123

Ders 3 de External Interrrupt (Harici Kesmeyi öğrendim) harici kesmeyi bir butona bağlayarak butonun high(yükselen kenar) low(düşen kenar) olduğunu ayarlayıp bir kesme oluşturmaya çalışacağız.
Yine kod üzerinde anlatmaya çalışacağım örnek ile açıklayınca daha iyi olacağını düşünüyorum. :)

Herşeyden önce bir main.h dosyası oluşturup(header files içine) bu dosyada kendimize ait tanımlama ve fonksiyon prototiperini tanımlayabiliriz.
Buna kullanacağımız bir takım global değişkenerde dahil.


#ifndef __MAIN_H__ // ifndef = if not def yani eğer tanımlanmamış ise 
#define __MAIN_H__ // tanımlamasını yap
//bunun anlamı main.h dosyasın tanımanması yapılmamış ise onu yapmaktır.Yazılımda kullanıan bir güvenik önlemiymiş.
//ve birden fazla tanımlanmayı engellmek için kullanılır
extern uint32_t Buton_State; //32 bitlik değişken (extern yani her yerden ulaşılabilir)

#endif


Şimdi main.c ye geçelim.Tabi bu örneği yapabilmek için Standart Peripheral Library olması oun için :
http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257885#
Bu linkdeki rarı açıp stm32f0discovery_fw.zip\STM32F0-Discovery_FW_V1.0.0\Project\Demonstration dizininden
stm32f0xx_it.c
stm32f0xx_it.h dosyalarını projemize incude ediyoruz.
şimdi main.c ye bakalım.

main.c
/*****************************************************************************

* File Name        : main.c

* Description      : GPIO_Uygulaması

********************************************************************************

* Additional Information : Buton'a basıldığında harici kesme oluşturan program

*******************************************************************************/

// Kütüphane dosyalarını kullanabilmek için eklenmiştir.
#include "stm32f0xx_conf.h"

uint32_t Buton_State = 0;// buton durumu adlı değişken 

/***********************************************************
* Function Name  : main
* Description    : Ana program burada döner
* Input          : void (hiç bir þey döndürmez)
* Return         : int (sonsuz döngü kuandýldýðýndan "return 0;" komutuna gerek kalmadý)
***********************************************************/
int main(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    EXTI_InitTypeDef  EXTI_InitStruct;// harici kesme ayarları için yapılan tanımlama
    NVIC_InitTypeDef  NVIC_InitStruct;//nvic ayarı için yapılan tanımlama (2 side struct)

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);  //Bu fonksiyon ile kulancaðýmýz porta clock vererek o portun bir nevi beslemesini yaptýk ve enabled ederek aktifleþtirdik.
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);  //Ayný iþlemi a portu için aptýk
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9; //yukarýda ki yapýda, alt elemanlara (hocamýn örneðindeki manavýn meyve çeþitleri gibi :)) nokta koyup erþebiliriz tanýmlama ve iðer ayrýntýlar için yapýnýn kaynaðýný görntüleyebilirsiniz.(| iþareti ve anlam gibidir 2 pin için belirtilen iþlemi yapýyor)
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT; //yapýdak mode elemetini kullanarak pineri çýkýþ olarak tanýmladýk benim kitimde bu pinlerde led mevcut
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // #Bu ayarýn 2 çeþidi var açýklama uzun olduðundan "goto note;" :) Akým gerektirmeyen bir iþ yaptýðýmýzdan push pul kullandýk
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;//GPIO Speed 3 farklý seviyede leve1 2 mhz, level2 10mhz, level3 50mhz olabildiðince düþk akým çekip enerjiden tasarruf etmk için en uygun hýz seçilmedlidir.
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//PuPd elementi ile pine pull up pull down ekleyebiliyoruz yine 3 seçenek mevcut

    GPIO_Init(GPIOC,&GPIO_InitStructure); //þimdi bu fonksiyon ile C portuna yaptýðýmýz ayarlarýn adreslerini veriyoruz.ingilizce ve iþareti deðiþkenin önünde ise adres anlamýnda

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;//kitimde a0 pininde led bulunmakta bunu kullandýðým için tanýmladým
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN; //in yani giriþ olacaðýný seçtim
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//pus pull kullanýlýyor düþk akýmdan dolayý
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;//hýz 1 ci seviyede (2mhz)
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL; //normalde direnc kullnýýrdý faket kitimdeki butonda PULL-DOWN yapýlmýþ

    GPIO_Init(GPIOA,&GPIO_InitStructure); //yine a portunda ayar yatýðýmdan dolayý GPIO_InitStructure ýn adresini a portuna yükledik

    SYSCFG_EXTILineConfig(GPIOA,EXTI_PinSource0);

    EXTI_InitStruct.EXTI_Line = EXTI_Line0; 
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //interrupt verecek
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; //yükselen kenar
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;//aktif

    EXTI_Init(&EXTI_InitStruct);//ayarların adresini yüklüyoruz

    NVIC_InitStruct.NVIC_IRQChannel         = EXTI0_1_IRQn; 
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0;// nvic ayarları bir nevi kesmeerin sıralaması olaran tanımlanabilir bir  kaç özeliği daha mevcut ben öğrendiğim kadarıyla şuan tanımıyorum ilerde detalarına inebiliriz
    NVIC_InitStruct.NVIC_IRQChannelCmd      = ENABLE;

    NVIC_Init(&NVIC_InitStruct);//ayarların adresini yükleyerek hazı hazır getiriyruz
	
    while(1)
    {
        if(Buton_State == 1)
        {
            GPIO_SetBits(GPIOC,GPIO_Pin_8); //artık kesme içinde buton_state durumunu kesme gelmiş ise 1 yaparak ldleri akıyoruz 
            GPIO_SetBits(GPIOC,GPIO_Pin_9);
        }
        else
        {
            GPIO_ResetBits(GPIOC,GPIO_Pin_8);//butonu bırakınca buton_State 0 oldugundan sonuyor 
            GPIO_ResetBits(GPIOC,GPIO_Pin_9);
        }
    }
}


Bu kesme stm32f0xx_it.c dosyasından attaki fonksiyon ile yapılıyor

void EXTI0_1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
     Buton_State ^= 1 << 0; 
  }

  EXTI_ClearITPendingBit(EXTI_Line0);//biti temizlemez isek kesmeden çıkmaz önemli bir nokta
}

Bu uygulamada biraz kötü bir anlatım oldu sanırım.Çünkü kendi örneğimi yapacak fırsat bulamadım henüz ama daha sonra büyn derslerle ilgili örnekler yapıp paylaşacağım.Bir de öyle bir şeye değinebiliriz.Kütüphanelerde adamlar adım adım ne yapacağımızı anlatmışlar.Hemde çok basit bir şekilde çevirme ihtiyacı bile olmadan çok rahat öğrenilebiliyor.Emblocks ve GCC ikilisini uzun bir süre kullanacağım. :D

baran123

#8
Ders 4 de Timer Interrupt (Timer kesmesi) öğrendim.:)

Biz Timer6 ile çalıştık.Kod üzerinden açıklamaya devam edeceğim.

main.h
/*****************************************************************************

* File Name        : main.h

* Description      : Header file for main.c

********************************************************************************

* Additional Information : Fonksiyon yapıları ve global-local değişkenleri barındırır

*******************************************************************************/
#ifndef __MAIN_H__
#define __MAIN_H__

#define LED_Green   GPIO_Pin_9

extern uint32_t Buton_State;

void CPU_Init(void);

#endif


main.c
/*****************************************************************************

* File Name        : main.c

* Description      : Timer6_Uygulaması

********************************************************************************

* Additional Information : Timer ile interrupt olusturma

*******************************************************************************/
#include "stm32f0xx_conf.h"
#include "main.h"

uint32_t Buton_State = 0; //main.h mizde yine extern ve 32 bitik bir değişken tanımlı.

/***********************************************************
* Function Name  : main
* Description    : Ana program burada doner
* Input          : void
* Return         : void
***********************************************************/
void main(void)
{
    CPU_Init(); //cpu hazırlama fonksiyonu
    while(1) //LED_Green main.h de "#define LED_Green   GPIO_Pin_9" olarak tanımlı
    {
        if(Buton_State) // buton durumuna göre led set veya reset et
            GPIO_SetBits(GPIOC,LED_Green);
        else
            GPIO_ResetBits(GPIOC,LED_Green); //ledi söndürür
    }
}

void CPU_Init()
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//timer'a ait struc tanımlıyoruz
    NVIC_InitTypeDef  NVIC_InitStruct;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); //timer için gerelki clock işlemi

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.aGPIO_Speed = GPIO_Speed_Level_1;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOC,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOA,&GPIO_InitStructure);
//pin ayarları daha önceden yazdığımdan burayı geçiyorum.

    TIM_TimeBaseInitStruct.TIM_Prescaler = 0xFFFF;//bu değer gereki formülde mevcut en fazla ffff yani 65535 olabilir 
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//yukarı doğru sayacak ayar 
    //TIM_TimeBaseInitStruct.TIM_Period = 3662;   // 5 saniye için
    TIM_TimeBaseInitStruct.TIM_Period = 732; //1 saniye için
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//bölme oranı 1 yani kapalı

    TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct);

    NVIC_InitStruct.NVIC_IRQChannel = TIM6_DAC_IRQn; 
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0;//nvic ayarlarının detayları fonksiyonları içierisinde mevcut yine sağ tıklayı kaynağına bakabiirsiniz
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;

    NVIC_Init(&NVIC_InitStruct);//nvic ayarlarını adresini inite vererek hazırlanıyor

    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//timer 6 aktif ve update işlemi otomatik

    TIM_Cmd(TIM6,ENABLE);//tim6 çaıştırm.artık çaışmaya hazır
}


Timer hesabı
Timer hesaplama : Period = (1/Clock)*(65535-sayi)*Prescaler

5 = 1/48Mhz * Y * 65535

0,00000002083 * 65535 * Y = 5

0,0013653125 * Y = 5

Y = 3662

sayi = 64803


Tabi yine stm32f0xx_it.c ve stm32f0xx_it.h dosyalarını eklememiz gerekiyor.
ve stm32f0xx_it.c dosyasından aşağıda ki fonksiyona gelip
void TIM6_DAC_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM6,TIM_IT_Update) != RESET)
    {
        Buton_State ^= 1 << 0; //buton 1 ise 0, 0 ise 1 yap

        TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//kesmede kalmaması için bitini clear yapıyoruz.
    }
}


artık 1 saniyede kesme oluşacak ve bu kesmede bir değişkenin durumunu değştirerek ana fonksiyondan değişken durumuna göre lederi blink yapmış olduk.

mesaj birleştirme:: 14 Nisan 2015, 22:00:14

Not : İlk başta CPU çalışma hızı ile ilgili bir hata yapmışım.Onun için system_stm32f0xx.c deki setsysclock fonksiyonunn aşağıda ki gibi düzenlemeliyiz.Ben harici 8mhz takılı sandım da yokmuş :) Bu fonksiyonda HSI (high speed internal) 'a göre ayarlandı.

static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
#if defined (PLL_SOURCE_HSI)
  /* At this stage the HSI is already enabled */

  /* Enable Prefetch Buffer and set Flash Latency */
  FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

  /* HCLK = SYSCLK */
  RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

  /* PCLK = HCLK */
  RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

  /* PLL configuration = (HSI/2) * 12 = ~48 MHz */
  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
  RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL12);

  /* Enable PLL */
  RCC->CR |= RCC_CR_PLLON;

  /* Wait till PLL is ready */
  while((RCC->CR & RCC_CR_PLLRDY) == 0)
  {
  }

  /* Select PLL as system clock source */
  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

  /* Wait till PLL is used as system clock source */
  while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
  {
  }
#else
 #if defined (PLL_SOURCE_HSE)
  /* Enable HSE */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 #elif defined (PLL_SOURCE_HSE_BYPASS)
  /* HSE oscillator bypassed with external clock */
  RCC->CR |= (uint32_t)(RCC_CR_HSEON | RCC_CR_HSEBYP);
 #endif /* PLL_SOURCE_HSE */

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

    /* PCLK = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration = HSE * 6 = 48 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }
#endif /* PLL_SOURCE_HSI */
}

baran123

Ders 5 : kısa, öz ,güzel bilgiler.Karşınızda SysTick :) bildiğimiz timer kesmesi diyebiliriz ama bu amcalar hazırlayıp güzel bir fonksiyon oluşturmuşlar.
Hatta o kadar basit ki tek fonksiyon da hazırlanıyor.Gerisi kesmede yapmak istediğinize kalmış.

/****************************************
    *SystemFrequency/1000      1ms         *
    *SystemFrequency/100000    10us        *
    *SystemFrequency/1000000   1us         *
    *****************************************/
SysTick_Config(SystemCoreClock / 10);       //1 saniye

SystemCoreClock = CPU çalışma hızımız (beim işlemcim 48mhZ çalışıyor.)
İşemci hızını çıklamadaki değerlere bölerek istediğimiz kesme süresini yakalayabiliyoruz

NOT !!! : Reload Value 0xFFFFFF geçmeyecek !

Daha sonra stm32f0_it.c dosyasından

void SysTick_Handler(void) //kesme oluştuğunda gireceğimiz fonksiyon
{
   Buton_State ^= 1 << 0; //led blink yaptırdık (main içinde)
}


Kodlar main.c
/*****************************************************************************

* File Name        : main.c

* Description      : Timer6_Uygulaması

********************************************************************************

* Additional Information : Timer ile interrupt olusturma

*******************************************************************************/
#include "stm32f0xx_conf.h"
#include "main.h"

uint32_t Buton_State = 0;

/***********************************************************
* Function Name  : main
* Description    : Ana program burada döner
* Input          : void
* Return         : void
***********************************************************/
void main(void)
{
    CPU_Init();

    while(1)
    {
        if(Buton_State)
            GPIO_SetBits(GPIOC,LED_Green);
        else
            GPIO_ResetBits(GPIOC,LED_Green);
    }
}

void CPU_Init()
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOC,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    // Systic Klavuzu

  /* Setup SysTick Timer for 1 msec interrupts.
	 ------------------------------------------
	1. The SysTick_Config() function is a CMSIS function which configure:
	   - The SysTick Reload register with value passed as function parameter.
	   - Configure the SysTick IRQ priority to the lowest value (0x0F).
	   - Reset the SysTick Counter register.
	   - Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
	   - Enable the SysTick Interrupt.
	   - Start the SysTick Counter.

	2. You can change the SysTick Clock source to be HCLK_Div8 by calling the
	   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
	   SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
	   inside the misc.c file.

	3. You can change the SysTick IRQ priority by calling the
	   NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function
	   call. The NVIC_SetPriority() is defined inside the core_cm0.h file.

	4. To adjust the SysTick time base, use the following formula:

		 Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s)

	   - Reload Value is the parameter to be passed for SysTick_Config() function
	   - Reload Value should not exceed 0xFFFFFF
   */

	/****************************************
	 *SystemFrequency/1000      1ms         *
	 *SystemFrequency/100000    10us        *
	 *SystemFrequency/1000000   1us         *
	 *****************************************/
    SysTick_Config(SystemCoreClock / 10);       //100 ms
}


mesaj birleştirme:: 15 Nisan 2015, 23:56:09

Dipnot : main.c içerisinde systick açıklaması mevcut.

FxDev

Not olarak eklemek gerekirse SystemTick RTOS'ların kullandığı özelleşmiş bir Timer.
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

SysTick_Config(SystemCoreClock / 10);       //1 saniye

    SysTick_Config(SystemCoreClock / 10);       //100 ms


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

MrDarK

Alıntı yapılan: justice_for_all - 16 Nisan 2015, 09:11:46
    SysTick_Config(SystemCoreClock / 10);       //100 ms


Doğrusu bu hocam, Baran kodların versiyonlarını karıştırmış. Verdiği örnekteki periyod 100ms'dir. 1 saniye için  SysTick_Config(SystemCoreClock / 1) yaptığımızda, Max overload değerini  0xFFFFFF aştığı için 10 kere interrupt geldiyse 1 saniye olmuştur şeklinde uygulama yapmıştık. Düzeltme için teşekkürler.

DipNot : İyiki yazdığımız kodların sağına soluna bi kaç açıklama satırı yazıyoruz :)
Picproje Eğitim Gönüllüleri ~ MrDarK

baran123

Merhabalar :)

6.Derste RTC modülünü işledik.RTC(Real Time Clock- Gerçek zaman saati(gibi çevriliyor sanırım)) ile 4x7 segment displayde ssystic de tarama yaparak dakika ve saniye gösterimi yaptık.

Kodlardan açıklamaya başlayayım o zaman.


main.h
/*****************************************************************************

* File Name        : main.h

* Description      : Header file for main.c

********************************************************************************

* Additional Information : Fonksiyon yapıları ve global-local değişkenleri barındırır

*******************************************************************************/
#ifndef __MAIN_H__
#define __MAIN_H__

extern uint32_t Digit_State; //dispay ortak uçları
extern uint16_t Display_Buffer[4]; /dispay'e aktarılacak veri

void Digit_Scanner(uint32_t);//her yerden erişilmesi için gereki prototip tanımlaması
//stm32f0xx_it.c içersinde #include "main.h tanımlanmalıdır.

#endif


stm32f0xx_it.c
void SysTick_Handler(void)//systick interrupt func.
{
    Digit_Scanner(Digit_State);

    if(Digit_State == 4)//display taraması
        Digit_State=0;
    else
        Digit_State++; 
}


main.c
/*****************************************************************************

* File Name        : main.c

* Description      : RTC ile 4x7 displayde saat/tarih uygulaması

********************************************************************************

* Additional Information : SysTick ile interrupt olusturma.

*******************************************************************************/
#include "stm32f0xx_conf.h"

#define RTC_CLOCK_SOURCE_LSI 

uint32_t Digit_State;
uint16_t Display_Buffer[4];//4 elemanlı 16bitlik tanımlama(IO lar16bitlik olduğundan böyle tanımladım)
uint16_t Digit_Figures[10]= {0x003F,0x0006,0x005B,0x004F,0x0066,0x006D,0x007C,0x0007,0x007F,0x006F};//display rakamları

static void CPU_Init(void);
static void RTC_Initialize(void);

RTC_TimeTypeDef  RTC_TimeStruct;//date time structure ları
RTC_DateTypeDef  RTC_DateStruct;//

/***********************************************************
* Function Name  : main
* Description    : Ana program burada döner.
* Input          : void
* Return         : int
***********************************************************/
int main(void)
{
    CPU_Init();
    RTC_Initialize();//rtc hazırlama fonksiyonu

    while(1)
    {
        RTC_GetTime(RTC_Format_BCD,&RTC_TimeStruct);//saat bilgisin al (BCD formatı olarak)
        RTC_GetDate(RTC_Format_BCD,&RTC_DateStruct);//tarih bilgisini al (BCD)

        Display_Buffer[0] = RTC_TimeStruct.RTC_Seconds & 0x0F;// saniyeyi 0x0f ile andleyerek düşük 4 biti al ve disbuf'0 at 
        Display_Buffer[1] = (RTC_TimeStruct.RTC_Seconds & 0xF0) >> 4; //yüksek 4 biti al fakat 30 gibi bir şey olacağından 4 bit kaydırarak 03 olarak alındı
        Display_Buffer[2] = (RTC_TimeStruct.RTC_Minutes & 0x0F);//dakika düşük 4 biti al
        Display_Buffer[3] = (RTC_TimeStruct.RTC_Minutes& 0xF0) >> 4; //dakika yüksek biti al
    }
}

/***********************************************************
* Function Name  : Digit_Scanner
* Description    : Display taramam metodunu gerçekleştirir.
* Input          : uint32_t
* Return         : void
***********************************************************/
void Digit_Scanner(uint32_t State)//display tarama
{
    switch(State)
    {
    case 0:
        GPIO_Write(GPIOA, Digit_Figures[Display_Buffer[3]]);
        GPIO_Write(GPIOC, 0x000E);
        break;

    case 1:
        GPIO_Write(GPIOA, Digit_Figures[Display_Buffer[2]] + 0x80);//2.dispayın noktasını yakar
        GPIO_Write(GPIOC, 0x000D);
        break;

    case 2:
        GPIO_Write(GPIOA, Digit_Figures[Display_Buffer[1]]);
        GPIO_Write(GPIOC, 0x000B);
        break;

    case 3:
        GPIO_Write(GPIOA, Digit_Figures[Display_Buffer[0]]);
        GPIO_Write(GPIOC, 0x0007);
        break;
    }
}

/***********************************************************
* Function Name  : CPU_Init
* Description    : İşlemci ön ayarları ve yapılandırılması.
* Input          : void
* Return         : void
***********************************************************/
static void CPU_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7; //displaylerin segment uçları
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3;//displaylerin ortak uçarı (Ortak katot)
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOC,&GPIO_InitStructure);

    SysTick_Config(SystemCoreClock / 1000); //1 mslik kesme oluşturma (tarama için)
}


/***********************************************************
* Function Name  : RTC_Initialize
* Description    : RTC Clock ve kurulumları burada yapılır.
* Input          : void
* Return         : void
***********************************************************/
static void RTC_Initialize(void)
{
    uint32_t AsynchPrediv = 0, SynchPrediv = 0;

    RTC_InitTypeDef  RTC_InitStructure;//rtc structure

    /* Enable the PWR clock */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//clock vererek bir nevi uyandırma-besleme yapıyoruz

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

#if defined (RTC_CLOCK_SOURCE_LSI)  /* LSI used as RTC source clock*/ //LSI low speed internal osc biz bunu tanımladık en üste
    /* The RTC Clock may varies due to LSI frequency dispersion. */
    /* Enable the LSI OSC */
    RCC_LSICmd(ENABLE);

    /* Wait till LSI is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)//LSI hazır olana kadar bekle
    {
    }

    /* Select the RTC Clock Source */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

    SynchPrediv = 0x18F;
    AsynchPrediv = 0x63;
//--------------------------LSI tanımandıından üst kısım işlenecek 
#elif defined (RTC_CLOCK_SOURCE_LSE) /* LSE used as RTC source clock */
    /* Enable the LSE OSC */
    RCC_LSEConfig(RCC_LSE_ON);

    /* Wait till LSE is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
    {
    }

    /* Select the RTC Clock Source */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    SynchPrediv = 0xFF;
    AsynchPrediv = 0x7F;

#else
#error Please select the RTC Clock source inside the main.c file //hiç biri tanımlanmamışsa uyarı ver 
#endif /* RTC_CLOCK_SOURCE_LSI */

    /* Configure the RTC data register and RTC prescaler */
    RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
    RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
    // Error flag kontrol edilebilir.
    RTC_Init(&RTC_InitStructure);//ayaları yükle ve hazırla

    /* Enable the RTC Clock */
    RCC_RTCCLKCmd(ENABLE);//rtc clock aktif et

    /* Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();//rtc senkronizasyon olana kadar bekle

    RTC_TimeStruct.RTC_Hours    = 0x19;
    RTC_TimeStruct.RTC_Minutes  = 0x37;
    RTC_TimeStruct.RTC_Seconds  = 0;

    RTC_DateStruct.RTC_Year     = 0x15;
    RTC_DateStruct.RTC_Month    = 0x04;
    RTC_DateStruct.RTC_Date     = 0x19;
//saat tarih için ilk atamaar yoksa sıfırdan başlayacak
    RTC_SetDate(RTC_Format_BCD,&RTC_DateStruct);
    RTC_SetTime(RTC_Format_BCD,&RTC_TimeStruct);//formatı belirle ve ayarları yüke
}

MrDarK

Picproje Eğitim Gönüllüleri ~ MrDarK