Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => STM32 Örnekleri => Konuyu başlatan: MrDarK - 09 Nisan 2015, 02:29:35

Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 09 Nisan 2015, 02:29:35
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 (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 (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 (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 (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# (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 (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, 03: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 :) )
(http://s7.postimg.cc/sbn6t4n4r/Resim1.jpg)

Ardından çıkan pencerenden Stmicro-ARM logosunu seçip Go tuşuna basıyoruz.
(http://s9.postimg.cc/pezu1wklr/Resim2.jpg)

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,
(http://s2.postimg.cc/4trej1hdl/Resim3.jpg)

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.
(http://s2.postimg.cc/42yod9f09/Resim4.jpg)

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.
(http://s2.postimg.cc/vg3v80lkp/Resim5.jpg)

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.
(http://s2.postimg.cc/jfif7ae61/Resim6.jpg)

En son önümüze böyle bir sayfa açılıyor.
(http://s2.postimg.cc/6cmso0ny1/Resim.jpg)

1. Bölümün sonuna geldik :) Idenin kullanımı hakkında uygulama yaparken biraz daha detayına ineceğim. Görüşmek üzere.
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: Okan AKÇA - 09 Nisan 2015, 23:32:56
Elinize saglik hocam  konunun güncel kalması önemli
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 11 Nisan 2015, 00:07:43
Ö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.
(http://i.hizliresim.com/4LBBZJ.png)

ş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.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: FxDev - 11 Nisan 2015, 00:18:57
Oldukça güzel bir başlangıç. Tek önerim Stm32F0 için Keil kullanılabilirdi. Devamını bekliyorum ;)
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 11 Nisan 2015, 00:58:33
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.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: FxDev - 11 Nisan 2015, 02:07:41
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 :)
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 11 Nisan 2015, 03:14:28
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:: [time]11 Nisan 2015, 14:15:15[/time]

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

mesaj birleştirme:: [time]11 Nisan 2015, 14:21:54[/time]

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:: [time]11 Nisan 2015, 14:23:30[/time]

Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 14 Nisan 2015, 03:18:18
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# (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 ^= << 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
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 15 Nisan 2015, 00:56:04
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

1/48Mhz 65535

0
,00000002083 65535 5

0
,0013653125 5

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 ^= << 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:: 15 Nisan 2015, 01: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 0HSEStatus 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 */
}
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 16 Nisan 2015, 02:55:25
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 ^= << 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:: 16 Nisan 2015, 02:56:09

Dipnot : main.c içerisinde systick açıklaması mevcut.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: FxDev - 16 Nisan 2015, 03:07:38
Not olarak eklemek gerekirse SystemTick RTOS'ların kullandığı özelleşmiş bir Timer.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: justice_for_all - 16 Nisan 2015, 12:11:46
SysTick_Config(SystemCoreClock / 10);       //1 saniye


    SysTick_Config
(SystemCoreClock 10);       //100 ms


hangisi doğru?
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 16 Nisan 2015, 13:15:19
Alıntı yapılan: justice_for_all - 16 Nisan 2015, 12: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 :)
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 20 Nisan 2015, 18:49:39
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_Minutes0xF0) >> 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(GPIOADigit_Figures[Display_Buffer[3]]);
        
GPIO_Write(GPIOC0x000E);
        break;

    case 
1:
        
GPIO_Write(GPIOADigit_Figures[Display_Buffer[2]] + 0x80);//2.dispayın noktasını yakar
        
GPIO_Write(GPIOC0x000D);
        break;

    case 
2:
        
GPIO_Write(GPIOADigit_Figures[Display_Buffer[1]]);
        
GPIO_Write(GPIOC0x000B);
        break;

    case 
3:
        
GPIO_Write(GPIOADigit_Figures[Display_Buffer[0]]);
        
GPIO_Write(GPIOC0x0007);
        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 0SynchPrediv 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
}
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 20 Nisan 2015, 18:54:04
Video isteriz :) (mümkünse :P )
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 20 Nisan 2015, 18:56:28
Bundan sonra videoda eklerim :)
https://youtu.be/vL1IprqhMmE

mesaj birleştirme:: [time]21 Nisan 2015, 05:57:04[/time]

Ben videoyu yüklerken siz "video isteriz" demişsiniz.Bu kadar olur :D

mesaj birleştirme:: 20 Nisan 2015, 18:57:49

Bu arada lipoyu direk patates gibi taktım sizler yapmayın arkadaşlar :D
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 20 Nisan 2015, 19:03:37
Eline sağlık baran :) Güzel uygulama olmuş. Lipoyu şarj ederken dikkat et elinde patlamasın :P

Bu tarz donanımlı videolarda bağlantı şeklide vermek uygulamayı yapmak isteyenler için kolaylık olacaktır. Tabi donanım şemasını vermek zor olabilir orasına birşey diyemem :)
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 20 Nisan 2015, 19:06:19
Displayin ortak pinleri PC0,PC1,PC2,PC3
Segment pinleri PA portuna takılı

Devre vermek biraz zor olur hocam ama yazılı olarak paylaşabilirim.
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: justice_for_all - 20 Nisan 2015, 19:07:32
ornek için teşekkürler.

    SynchPrediv 0x18F;
    
AsynchPrediv 0x63;


bu değerleri neye göre hesapladınız?açıklayabilirmisiniz.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 20 Nisan 2015, 19:10:16
Hocam ;
Daha öncesinde bunun için bir konu açmıştık. Karamel sağ olsun biraz araştırmış.

https://www.picproje.org/index.php/topic,58837.msg454374.html (https://www.picproje.org/index.php/topic,58837.msg454374.html)
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: justice_for_all - 20 Nisan 2015, 19:12:22
Tamam hocam 40 Khz RC osilator varmış. ben 8 Mhz heaplayarak yaptı sanmıstım.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 20 Nisan 2015, 19:19:28
38-40 kHz arası ama çok iyi değil gibi geldi.Internaldan uzak durmak lazım :D saniye biraz hızlı ilerliyor gibi çünkü.
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: justice_for_all - 20 Nisan 2015, 19:22:23
RC osilator olacak okadar :) sanırım düzeltmesi var yalnışa hatırlamıyorsam sabit bir kayıklık varsa.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 20 Nisan 2015, 19:26:10
Evet düzeltmesi var.

Fonksiyonun adı RTC_SmoothCalibConfig

Sadece RC Osilatör için değil External kristal içinde geçerli bu kayma durumu, bu fonksiyon sayesinde sıcaklık kompanzasyonu ve ileri geri saniye farkını hesaplayabiliyoruz. Genelde yaptığımız uygulamalarda 24 saat baz alınarak saniye farkını bir internet sitesi üzerinden takip ediyoruz ileri geri durumuna göre bu fonksiyon üzerinden değerleri güncelliyoruz. Tabiki ısı kalibrasyonu da önemli.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: vitruvius - 20 Nisan 2015, 19:31:07
Alıntı yapılan: Baran Ekrem - 20 Nisan 2015, 19:06:19
Displayin ortak pinleri PC0,PC1,PC2,PC3
Segment pinleri PA portuna takılı

Devre vermek biraz zor olur hocam ama yazılı olarak paylaşabilirim.

Fritzing kullanabilirsin.

http://fritzing.org/home/ (http://fritzing.org/home/)
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 20 Nisan 2015, 19:41:18
Teşekkürler bir dahakine öyle yapayım :)
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: Gökhan BEKEN - 24 Nisan 2015, 20:50:08
Projeleri github'a yükledim arkadaşlar: https://github.com/Picproje/Picproje_STM32F0_Discovery_Uygulamalari
(Memlekette olduğum için biraz gecikme oldu, kusura bakmayın.)
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 25 Nisan 2015, 18:41:39
Gökhan hocam teşekkür ederim. :)

Küçük bir aradan sonra ADC yi gerçekleştirdi.Tek kanaldan ADC okuma işlemi yaparak 0-3.3V arasını 74h164 kullanarak
4x7 segment displayde gösterimini öğrendiğim kadarı ile açıklamaya çalışacağım :)
Aslında birden çok kanal okumayı yapacatık ama DMA ie yapılacağı için ayrı bir konuda onuda işleyeceğiz.
Önce 74HC164 den bahsedeyim.HC595 e çok benziyor fakat ST_CP unu olmadığından yolladığımız veri direk olarak
çıkışlara aktarılıyor.Ve 2 pinle 8 çıkış alabiliyoruz.

Koda geçmeden önce bir kaç hesaplama gerekiyor.Öncelikle biz 12bit çözünürlüklü adc kulandık.Bu 2 li sistemde 2
üzeri 12den = 4096 yapıyor.Yani 409 adımlık bir adc mevcut.0-3.3 arası ölçüm yapacağımız için 3,3/4096 =
0,0008056640625 eder buda 805,6 uV(mikroVolt) dur.Yani ADC den okuduğumuz değeri(0-4096) her adıma düşen gerilim ile
çarparsak gerilim ölçümünü yapmış oluyoruz.Ben Potansiyometre kullandım.

hc164.c

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

* File Name        : hc164.c

* Description      : 74HC164 Data yolar

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

* Additional Information : 74HC164 veri gönderme fonksiyonu

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

/***********************************************************
* Function Name  : HC164_Send
* Description    : 74HC164 entegresine data yollar
* Input          : uint8_t
* Return         : void
***********************************************************/
void HC164_Send(uint32_t Data)
{
    static 
uint8_t i;

    for(
0x800>>= 1)
    {
        if (
i&Data)
            
GPIO_SetBits(GPIOA,HC164_DATA);
        else
            
GPIO_ResetBits(GPIOA,HC164_DATA);

        
GPIO_SetBits(GPIOA,HC164_CLOCK);
        
GPIO_ResetBits(GPIOA,HC164_CLOCK);
    }
}



hc164.h

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

* File Name        : hc164.h

* Description      : 74HC164 Pin ve fonksiyon tanımlamaları

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

* Additional Information : hc164 fonksiyon prototipleri ve pinlerini barındırır

*******************************************************************************/
#ifndef __HC164_H__
#define __HC164_H__

#define HC164_DATA   GPIO_Pin_0     // 74HC164 Data pin
#define HC164_CLOCK  GPIO_Pin_1     // 74HC164 Clock pin

void HC164_Send(uint32_t);          //74HC164 Data func.

#endif





main.h

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

* File Name        : main.h

* Description      : Header file for main.c

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

* Additional Information : Fonksiyon prototiperi ve extern değişkenleri tanımlanır

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

//Displaylerin ortak ucu
#define Dispay_Digit1  GPIO_Pin_0   // Display Digit 1 pin
#define Dispay_Digit2  GPIO_Pin_1   // Display Digit 2 pin 
#define Dispay_Digit3  GPIO_Pin_2   // Display Digit 3 pin
#define Dispay_Digit4  GPIO_Pin_3   // Display Digit 4 pin

//Her yerden eriilebilmesi için değişknler extern tanımlı
extern uint32_t Digit_State;
extern uint32_t Display_Buffer[4];  //Display data
extern uint32_t Display_Figures[10];//Display Number models
extern uint16_t voltage;            //voltage
extern float g_ui16OkunanDeger;     //okuduğumuz değer

//Gobal fonksiyon
void Digit_Scan(uint32_t);          //Display scanner

#endif



main.c

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

* File Name        : main.c

* Description      : ADC_Uygulaması

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

* Additional Information : ADC ile gerilim okuma.

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

uint32_t Digit_State=0;//dispay tarama için (display konum 1-2-3-4)
uint32_t Display_Buffer[4];//4 elemanı bir dizi dispayler için
uint32_t Display_Figures[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};//ortak katot rakamlar

uint16_t voltage;
float g_ui16OkunanDeger;

static 
void Init_GPIO(void);
static 
void Init_ADC(void);  // sadece main içinde kullanıldığından static yaptık

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

    
SysTick_Config(SystemCoreClock 1000); //1 ms(display tarama için)

    
while(1)
    {
        
Display_Buffer[0] = (voltage %10);    //Okuduğumuz voltage hanelerine ayırıyoruz.
        
Display_Buffer[1] = (voltage /10)%10
        
Display_Buffer[2] = (voltage /100)%10;
        
Display_Buffer[3] = (voltage /1000);
    }
}

/***********************************************************
* Function Name  : Init_GPIO
* Description    : GPIO giriş çıkış işlemleri yapılır
* Input          : void
* Return         : void
***********************************************************/
static void Init_GPIO(void)
{
    
GPIO_InitTypeDef  GPIO_InitStructure;

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

    
GPIO_InitStructure.GPIO_Pin   HC164_DATA HC164_CLOCK;//hc 164 data ve clock 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   Dispay_Digit1 Dispay_Digit2 Dispay_Digit3 Dispay_Digit4;//ortak dsplay 

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(GPIOC,&GPIO_InitStructure);
}

/***********************************************************
* Function Name  : Init_GPIO
* Description    : GPIO giriş çıkış işlemleri yapılır
* Input          : void
* Return         : void
***********************************************************/
static void Init_ADC(void)
{
    
GPIO_InitTypeDef  GPIO_InitStructure;
    
ADC_InitTypeDef   ADC_InitStructure;
    
NVIC_InitTypeDef NVIC_InitStructure;
    
//gerekli struct lar 

    
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1ENABLE);//adc 1 clock ver

    
GPIO_InitStructure.GPIO_Pin     GPIO_Pin_2//A 2 pini analog giriş(potans ortak ucu)
    
GPIO_InitStructure.GPIO_Mode    GPIO_Mode_AN;
    
GPIO_InitStructure.GPIO_PuPd    GPIO_PuPd_NOPULL;
    
GPIO_Init(GPIOA, &GPIO_InitStructure);

    
ADC_DeInit(ADC1);//defaut init

    
ADC_StructInit(&ADC_InitStructure);//struct hazırlama

    
ADC_InitStructure.ADC_Resolution ADC_Resolution_12b;//12 bit çözünürlük seçildi
    
ADC_InitStructure.ADC_ContinuousConvMode ENABLE;//sürekli okuma aktif
    
ADC_InitStructure.ADC_ExternalTrigConvEdge ADC_ExternalTrigConvEdge_None;
    
ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right;//alınan değer 32 bitlik bir değişkenin sağına veya 

soltarafına yaslama(sağ taraf seçili)
    
ADC_InitStructure.ADC_ScanDirection ADC_ScanDirection_Upward;//birden fazla adc için yukarı veya aşşağıya 

doğru sıra ile okuma yukarı seçili 
    ADC_Init
(ADC1, &ADC_InitStructure);

    
ADC_ChannelConfig(ADC1ADC_Channel_2 ADC_SampleTime_239_5Cycles);//a2 seçili olduğundan 2.kanal aktif ve hız 

olarak 239,5 cycles seçili

    ADC_Cmd
(ADC1ENABLE);//adc aktif

    
while(!ADC_GetFlagStatus(ADC1ADC_FLAG_ADRDY));//adc1 in ADC_FLAG_ADRDY bayrağı aktfi olana kadar bekle

    
ADC_StartOfConversion(ADC1);//1 kere okuma yapar

    
NVIC_InitStructure.NVIC_IRQChannel ADC1_COMP_IRQn;//kesme fonksiyonu
    
NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//aktif
    
NVIC_InitStructure.NVIC_IRQChannelPriority 0;
    
NVIC_Init(&NVIC_InitStructure);

    
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//ADC_IT_EOC: end of conversion çevirmenin sonu
}

/***********************************************************
* Function Name  : Digit_Scan
* Description    : Display tarama işlemini yapar
* Input          : uint32_t
* Return         : void
***********************************************************/
void Digit_Scan(uint32_t State)
{
    switch(
State)//state systic içinde değiştiriliyor
    
{
    case 
0:
        
HC164_Send(Display_Figures[Display_Buffer[3]]);
        
GPIO_Write(GPIOC0x000F);
        break;

    case 
1:
        
HC164_Send(Display_Figures[Display_Buffer[2]] + 0x80);//2ci display noktasını aktif et(8.biti high yapar)
        
GPIO_Write(GPIOC0x000D);
        break;

    case 
2:
        
HC164_Send(Display_Figures[Display_Buffer[1]]);//buffer ları displaye yolla 
        
GPIO_Write(GPIOC0x000B);//displayleri sıra ile aktif et
        
break;

    case 
3:
        
HC164_Send(Display_Figures[Display_Buffer[0]]);
        
GPIO_Write(GPIOC0x0007);
        break;
    }
}


stm32f0xx_it.c

void SysTick_Handler
(void)
{
    
Digit_Scan(Digit_State);//state durumunu fonksiyona parametre olarak vererek tarama işlemi gerçekleştiriir.

    
if(Digit_State == 4//display state tarama için sıra ile 0-1-2-3 değerlerini alır 
        
Digit_State=0;
    else
        
Digit_State++;
}

//bu fonksiyon yoksa oluşturabiliriz.Default olarak bulunmuyor olabilir.
void ADC1_COMP_IRQHandler(void)
{
    if(
ADC_GetFlagStatus(ADC1,ADC_IT_EOC))//adc1 okuma yapılırsa
    
{
        
g_ui16OkunanDeger ADC_GetConversionValue(ADC1);//adc oku
        
g_ui16OkunanDeger *= (0.0008056640625);//okunan değeri adım başına düşen voltaj ile çarp
        
voltage = (g_ui16OkunanDeger*100);//voltajı 100 ile çarp ve voltage ye aktar (float değeri displaye basmak 

için 0 dan sonra 2 nokta almak için 100 ile çarpıldı)
        
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);//okuma işleminin sonu bayrağını temizle(yoksa buradan çıkmaz)
    
}
}


Bu kadar :) Bağlantılar kod içerisinde #define şeklinde yazıyor.Unutmadan adc ucuna 22pF kondansatör ie GND ye

çektim parazit için.Yine var ama ortalama ama vs teknikler ile düzgün değer alabiliriz.

İstenmeyen sesler için özür dilerim. :)
Video: http://youtu.be/bqOgEGl0sJM (http://youtu.be/bqOgEGl0sJM)

mesaj birleştirme:: [time]25 Nisan 2015, 15:48:49[/time]

Not : ilk Digit'innoktası bozuk diye kaydırma yaptım.2.Digit 'in noktası ':' şeklinde saat displayi olduğundan.Birde 1.Digiti kapalı 0 yazmasın diye:)

Dip not :
//defaut init
şeklinde bir açıklama olmuş deinit demek , donanımı reset konumuna almak gibi birşey. Tam olarak türkçeye nasıl çevrilir bilmiyorum fakat init kurmaksa bu kaldırmak gibi birşey. Donanımları kurmadan önce boşta olduğuna emin olmak için önce kaldırıp sonra kurmayı öneriyor ST. O yüzden böyle fonksiyonlar var.- MrDarK
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: JOKERAS - 25 Nisan 2015, 18:56:29
Fıstık gibi olmuş.

Birde bunu matrix displayde sürersen bu sefer Antep fıstığı olur :)
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 25 Nisan 2015, 20:14:45
Sağ olasın :) Dotmatrix var bir ara kayan yazı yaparım.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 03 Mayıs 2015, 22:02:45
Merhaba arkadaşlar,

Bugün SPI hakkında öğrendiklerimi paylaşacağım. :) Bir aksaklık oldu biraz geciktirdim bu sefer çünkü SPI

öğrenmişken OLED Display çalıştırayım dedim fakat aksaklıklar oldu sağ olsun Fırat ağabey biraz önce bir hatamı

düzeltti :) Bu arada OLED LCD diye de söyleniyor sanırım ama aslında şu şekildeymiş :

LCD  = Liquid Crystal Display(Sıvı Kristal Ekran)
OLED = Organik LED, Display benim gibi karıştırmamakta fayda var :)

SPI bildiğimiz üzere minimum 3 kablolu bir iletişim türüdür.Ama donanımsa olarak CS pini de  bulunuyor.Temelde 4 pin

Eğer tek cihaz var ise CS pini LOW da tutulabilir.Master ve Slave olarak inceleyelim bu örneği.STM32F0 Master, OLED

Display Slave konumunda.

SPI pinleri şu şekildedir :

MOSI = Master Out Slave In (Master çıkış slave giriş, masterdan data gönder slave al) TX
MISO = Master In Slave Out (Master giriş slave çıkış, master al slave gönder) RX gibi düşünülebilir
SCK  = Serial Clock

CS'den 0 seviyesine çekilir.Aktif kullanımı bu. Pull up la high konumundadır.SCK dan clock oluşur. Pinlerin çaışma

şeklini şöyle inceleyebiliriz.

0x85 = 0b 1000 0101 

CS   ----________________________________________-------   

SCK      _|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|__|-|_

MOSI --------____________________-----_____-----_________________________________________

MISO      - Geçersiz---------------------------| - Gelen Data Geçerlidir. ---------------|   

SPI data gönderme algoritması :
0101 0101

1 ise mosı 1
0 ise mosı 0
sck hıgh sonra low ver


Şimdi SPI hazırlama kısmına geçelim.

#include "stm32f0xx_conf.h"
#include "ssd1306.h"
#include "font.h"

int main(void)
{
    
GPIO_InitTypeDef GPIO_InitStructure;
    
SPI_InitTypeDef  SPI_InitStructure;

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

    
GPIO_InitStructure.GPIO_Pin    GPIO_Pin_5 GPIO_Pin_6 GPIO_Pin_7//5 = Sck,6 = mıso, = 7mosı
    
GPIO_InitStructure.GPIO_Mode   GPIO_Mode_AF;// Alternatif func.
    
GPIO_InitStructure.GPIO_Speed  GPIO_Speed_50MHz;
    
GPIO_InitStructure.GPIO_OType  GPIO_OType_PP;
    
GPIO_InitStructure.GPIO_PuPd   GPIO_PuPd_NOPULL;
    
GPIO_Init(GPIOA,&GPIO_InitStructure);

    
GPIO_PinAFConfig(GPIOAGPIO_PinSource5GPIO_AF_0);
    
GPIO_PinAFConfig(GPIOAGPIO_PinSource6GPIO_AF_0); //af modda olduklarını belirtiyoruz.
    
GPIO_PinAFConfig(GPIOAGPIO_PinSource7GPIO_AF_0);

    
SPI_InitStructure.SPI_Direction         SPI_Direction_Tx;// sadece gönder
    
SPI_InitStructure.SPI_Mode              SPI_Mode_Master;//master mod
    
SPI_InitStructure.SPI_DataSize          SPI_DataSize_8b;//datalar 8 bit şeklinde gidecek
    
SPI_InitStructure.SPI_CPOL              SPI_CPOL_High;
    
SPI_InitStructure.SPI_CPHA              SPI_CPHA_1Edge;
    
SPI_InitStructure.SPI_NSS               SPI_NSS_Soft;//yazılımsa ss(CS) chip select = slave select, ss
    
SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_4//spi bölme oranı 4
    
SPI_InitStructure.SPI_FirstBit          SPI_FirstBit_MSB//ilk bit msb tarafından
    
SPI_InitStructure.SPI_CRCPolynomial     7;
    
SPI_Init(SPI1,&SPI_InitStructure); //spi ayarlarını yükle 
    
SPI_Cmd(SPI1,ENABLE);//spi aktif 

    
GPIO_InitStructure.GPIO_Mode   GPIO_Mode_OUT
    
GPIO_InitStructure.GPIO_OType  GPIO_OType_PP;
    
GPIO_InitStructure.GPIO_Pin    GPIO_Pin_0 GPIO_Pin_1;// C0 D/C pini (OLED'e özel) C1 ise CS pini
    
GPIO_InitStructure.GPIO_PuPd   GPIO_PuPd_NOPULL;
    
GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;
    
GPIO_Init(GPIOC,&GPIO_InitStructure);

    
Init_OLED();//

    
Oled_SetFont(Font_6x86832127);

    
Oled_ConstText("  [url=https://www.picproje.org]www.picproje.org[/url]"00);
    
Oled_ConstText("Developer : Mr.EKREM"04);
    
Oled_ConstText("  [url=https://www.picproje.org]www.picproje.org[/url]"07);

    while(
1)
    {

    }
}


ssd1306.c

#include "stm32f0xx_conf.h"

#define LCD_CS_PORT                 GPIOC
#define LCD_CS_PIN                  GPIO_Pin_1
#define LCD_DC_PORT                 GPIOC
#define LCD_DC_PIN                  GPIO_Pin_0

#define PAGE0         0
#define PAGE1         1
#define PAGE2         2
#define PAGE3         3
#define PAGE4         4
#define PAGE5         5
#define PAGE6         6
#define PAGE7         7
#define FRAME_2       7
#define FRAME_3       4
#define FRAME_4       5
#define FRAME_5       0
#define FRAME_25      6
#define FRAME_64      1
#define FRAME_128     2
#define FRAME_256     3

const uint8_t *font, *font2;
uint8_t widthheightminmax;

void Init_OLED(void);
void Activate_Scroll(void);
void Deactivate_Scroll(void);
void Oled_Command(uint8_t cmd);
void Oled_WriteRam(uint8_t dat);
void Oled_Image(const uint8_t *buffer);
void Oled_FillScreen(uint8_t pattern);
void Oled_SetPointer(uint8_t seguint8_t pag);
void Oled_WriteChar(uint8_t cuint8_t seguint8_t pag);
void Oled_Text(char *bufferuint8_t seguint8_t pag);
void Oled_ConstText(const char *bufferuint8_t seguint8_t pag);
void Left_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time);
void Right_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time);
void VerticalLeft_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time);
void VerticalRight_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time);
void Oled_SetFont(const uint8_t *_fontuint8_t _widthuint8_t _heightuint8_t _minuint8_t _max);

void Init_OLED(void)
{
   
Oled_Command(0xAE);
   
Oled_Command(0x81);
   
Oled_Command(0xCF);
   
Oled_Command(0xA4);
   
Oled_Command(0xA6);
   
Oled_Command(0x20);
   
Oled_Command(0x02);
   
Oled_Command(0x00);
   
Oled_Command(0x10);
   
Oled_Command(0xB0);
   
Oled_Command(0x40);
   
Oled_Command(0xA1);
   
Oled_Command(0xA8);
   
Oled_Command(0x3F);
   
Oled_Command(0xC8);
   
Oled_Command(0xD3);
   
Oled_Command(0x00);
   
Oled_Command(0xDA);
   
Oled_Command(0x12);
   
Oled_Command(0xD5);
   
Oled_Command(0x80);
   
Oled_Command(0xD9);
   
Oled_Command(0xF1);
   
Oled_Command(0xDB);
   
Oled_Command(0x40);
   
Oled_Command(0x8D);
   
Oled_Command(0x14);
   
Oled_Command(0xAF);

   
Oled_FillScreen(0x00);
}

void Oled_Command(uint8_t Command)
{
    
GPIO_ResetBits(LCD_DC_PORT,LCD_DC_PIN);
    
GPIO_ResetBits(LCD_CS_PORT,LCD_CS_PIN);

    
SPI_SendData8(SPI1Command);
    while (
SPI1->SR SPI_SR_BSY);

    
GPIO_SetBits(LCD_CS_PORT,LCD_CS_PIN);
}

void Oled_WriteRam(uint8_t Data)
{
    
GPIO_ResetBits(LCD_CS_PORT,LCD_CS_PIN);

    
GPIO_SetBits(LCD_DC_PORT,LCD_DC_PIN);

    
SPI_SendData8(SPI1Data);
    while (
SPI1->SR SPI_SR_BSY);

    
GPIO_SetBits(LCD_CS_PORT,LCD_CS_PIN);
}

void Oled_SetPointer(uint8_t seguint8_t pag)
{
   
uint8_t low_columnhig_column;

   
low_column = (seg 0b00001111);
   
hig_column = (seg 0b11110000)>>4;
   
hig_column hig_column 0b00010000;
   
pag = (pag 0b00000111);
   
pag = (pag 0b10110000);
   
Oled_Command(low_column);
   
Oled_Command(hig_column);
   
Oled_Command(pag);
}

void Oled_SetFont(const uint8_t *_fontuint8_t _widthuint8_t _heightuint8_t _minuint8_t _max)
{
   
font2  _font;
   
width  _width;
   
height _height 8;
   
min    _min;
   
max    _max;
}

void Oled_WriteChar(uint8_t cuint8_t seguint8_t pag)
{
   
uint8_t ijkl;
   
uint8_t x_segy_pag;

   
x_seg seg;
   
y_pag pag;
   
font font2;
   
min;
   
= (width height);

   for(
0kj++)
   {
       for(
0li++)
       {
          
font++;
       }
   }

   for(
0widthi++)
   {
      
y_pag pag;
      for(
0heightj++)
      {
         if(
x_seg 128)
         {
            
Oled_SetPointer(x_segy_pag);
            
Oled_WriteRam(*font);
         }
         
y_pag++;
         
font++;
      }
      
x_seg++;
   }
}

void Oled_ConstText(const char *bufferuint8_t seguint8_t pag)
{
   
uint8_t x_seg seg;

   while(*
buffer)
   {
      
Oled_WriteChar(*bufferx_segpag);
      
x_seg x_seg width;
      
buffer++;
   }
}

void Oled_Text(char *bufferuint8_t seguint8_t pag)
{
   
uint8_t x_seg seg;

   while(*
buffer)
   {
      
Oled_WriteChar(*bufferx_segpag);
      
x_seg x_seg width;
      
buffer++;
   }
}

void Oled_FillScreen(uint8_t pattern)
{
   
unsigned char ij;

   for(
08i++)
   {
      
Oled_SetPointer(0i);
      for(
0128j++)
      {
         
Oled_WriteRam(pattern);
      }
   }
}

void Oled_Image(const uint8_t *buffer)
{
   
unsigned char ij;

   for(
08i++)
   {
      
Oled_SetPointer(0i);
      for(
0128j++)
      {
         
Oled_WriteRam(*buffer);
         
buffer++;
      }
   }
}

void Right_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time)
{
   
Deactivate_Scroll();
   
Oled_Command(0x26);
   
Oled_Command(0x00);
   
Oled_Command(start_page);
   
Oled_Command(set_time);
   
Oled_Command(end_page);
   
Oled_Command(0x00);
   
Oled_Command(0xFF);
   
Activate_Scroll();
}

void Left_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time)
{
   
Deactivate_Scroll();
   
Oled_Command(0x27);
   
Oled_Command(0x00);
   
Oled_Command(start_page);
   
Oled_Command(set_time);
   
Oled_Command(end_page);
   
Oled_Command(0x00);
   
Oled_Command(0xFF);
   
Activate_Scroll();
}

void VerticalRight_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time)
{
   
Deactivate_Scroll();
   
Oled_Command(0x29);
   
Oled_Command(0x00);
   
Oled_Command(start_page);
   
Oled_Command(set_time);
   
Oled_Command(end_page);
   
Oled_Command(0x01);
   
Activate_Scroll();
}

void VerticalLeft_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time)
{
   
Deactivate_Scroll();
   
Oled_Command(0x2A);
   
Oled_Command(0x00);
   
Oled_Command(start_page);
   
Oled_Command(set_time);
   
Oled_Command(end_page);
   
Oled_Command(0x01);
   
Activate_Scroll();
}

void Deactivate_Scroll(void)
{
   
Oled_Command(0x2E);
}

void Activate_Scroll(void)
{
   
Oled_Command(0x2F);
}


ssd1306.h

#ifndef SSD1306_H
#define SSD1306_H

void Init_OLED(void);
void Activate_Scroll(void);
void Deactivate_Scroll(void);
void Oled_Command(uint8_t cmd);
void Oled_WriteRam(uint8_t dat);
void Oled_Image(const uint8_t *buffer);
void Oled_FillScreen(uint8_t pattern);
void Oled_SetPointer(uint8_t seguint8_t pag);
void Oled_WriteChar(uint8_t cuint8_t seguint8_t pag);
void Oled_Text(char *bufferuint8_t seguint8_t pag);
void Oled_ConstText(const char *bufferuint8_t seguint8_t pag);
void Left_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time);
void Right_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time);
void VerticalLeft_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time);
void VerticalRight_HorizontalScroll(uint8_t start_pageuint8_t end_pageuint8_t set_time);
void Oled_SetFont(const uint8_t *_fontuint8_t _widthuint8_t _heightuint8_t _minuint8_t _max);


#endif /* SSD1306_H_INCLUDED */


font.h


#ifndef FONT_H
#define FONT_H

const uint8_t Terminal12x16[2304] = {
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x00// (space)
0x000x000x000x000x000x000x000x000xF80x000xFE0x670xFE0x670xF80x000x000x000x00

0x000x000x000x000x00// !
0x000x000x000x000x000x000x3C0x000x3C0x000x000x000x000x000x3C0x000x3C0x000x00

0x000x000x000x000x00// "
0x000x000x000x040x200x3C0x200x3F0xE00x070xFC0x040x3C0x3C0x200x3F0xE00x070xFC

0x040x3C0x000x200x00// #
0x000x000x000x000xF00x080xF80x190x980x190xFE0x7F0xFE0x7F0x980x190x980x1F0x10

0x0F0x000x000x000x00// $
0x000x000x000x300x380x380x380x1C0x380x0E0x000x070x800x030xC00x010xE00x380x70

0x380x380x380x000x00// %
0x000x000x000x000x000x1F0xB80x3F0xFC0x310xC60x210xE20x370x3E0x1E0x1C0x1C0x00

0x360x000x220x000x00// &
0x000x000x000x000x000x000x000x000x4E0x000x7E0x000x3E0x000x000x000x000x000x00

0x000x000x000x000x00// '
0x000x000x000x000x000x000xE00x070xF80x1F0xFC0x3F0x0E0x700x020x400x020x400x00

0x000x000x000x000x00// (
0x000x000x000x000x000x000x020x400x020x400x0E0x700xFC0x3F0xF80x1F0xE00x070x00

0x000x000x000x000x00// )
0x000x000x000x000x980x0C0xB80x0E0xE00x030xF80x0F0xF80x0F0xE00x030xB80x0E0x98

0x0C0x000x000x000x00// *
0x000x000x000x000x800x010x800x010x800x010xF00x0F0xF00x0F0x800x010x800x010x80

0x010x000x000x000x00// +
0x000x000x000x000x000x000x000x000x000x5C0x000x7C0x000x3C0x000x000x000x000x00

0x000x000x000x000x00// ,
0x000x000x000x000x800x010x800x010x800x010x800x010x800x010x800x010x800x010x80

0x010x000x000x000x00// -
0x000x000x000x000x000x000x000x000x000x380x000x380x000x380x000x000x000x000x00

0x000x000x000x000x00// .
0x000x000x000x180x000x1C0x000x0E0x000x070x800x030xC00x010xE00x000x700x000x38

0x000x1C0x000x000x00// /
0x000x000xF00x0F0xFC0x3F0x0C0x3C0x060x660x060x630x860x610xC60x600x660x600x3C

0x300xFC0x3F0xF00x0F// 0
0x000x000x000x000x180x600x180x600x1C0x600xFE0x7F0xFE0x7F0x000x600x000x600x00

0x600x000x000x000x00// 1
0x000x000x380x600x3C0x700x0E0x780x060x7C0x060x6E0x060x670x860x630xC60x610xEE

0x600x7C0x600x380x60// 2
0x000x000x180x180x1C0x380x0E0x700x860x610x860x610x860x610x860x610x860x610xCE

0x730xFC0x3E0x780x1C// 3
0x000x000x800x070xC00x070xE00x060x700x060x380x060x1C0x060x0E0x060xFE0x7F0xFE

0x7F0x000x060x000x06// 4
0x000x000x7E0x180xFE0x380xC60x700xC60x600xC60x600xC60x600xC60x600xC60x600xC6

0x710x860x3F0x060x1F// 5
0x000x000x800x1F0xE00x3F0xF00x730xB80x610x9C0x610x8E0x610x860x610x860x610x86

0x730x000x3F0x000x1E// 6
0x000x000x060x000x060x000x060x000x060x600x060x780x060x1E0x860x070xE60x010x7E

0x000x1E0x000x060x00// 7
0x000x000x000x1E0x780x3F0xFC0x730xCE0x610x860x610x860x610x860x610xCE0x610xFC

0x730x780x3F0x000x1E// C8
0x000x000x780x000xFC0x000xCE0x610x860x610x860x610x860x710x860x390x860x1D0xCE

0x0F0xFC0x070xF80x01// 9
0x000x000x000x000x000x000x000x000x700x1C0x700x1C0x700x1C0x000x000x000x000x00

0x000x000x000x000x00// :
0x000x000x000x000x000x000x000x000x380x4E0x380x7E0x380x3E0x000x000x000x000x00

0x000x000x000x000x00// ;
0x000x000x000x000x800x010xC00x030xE00x070x700x0E0x380x1C0x1C0x380x0E0x700x06

0x600x000x000x000x00// <
0x000x000x000x000x600x060x600x060x600x060x600x060x600x060x600x060x600x060x60

0x060x600x060x000x00// =
0x000x000x000x000x060x600x0E0x700x1C0x380x380x1C0x700x0E0xE00x070xC00x030x80

0x010x000x000x000x00// >
0x000x000x380x000x3C0x000x0E0x000x060x000x060x6F0x860x6F0xC60x010xEE0x000x7C

0x000x380x000x000x00// ?
0x000x000xF00x1F0xFC0x3F0x0E0x300xE60x670xF60x6F0x360x6C0xF60x6F0xF60x6F0x0E

0x6C0xFC0x070xF00x03// @
0x000x000x000x700x000x7E0xC00x0F0xF80x0D0x3E0x0C0x3E0x0C0xF80x0D0xC00x0F0x00

0x7E0x000x700x000x00// A
0x000x000xFE0x7F0xFE0x7F0x860x610x860x610x860x610x860x610xCE0x610xFC0x730x78

0x3F0x000x1E0x000x00// B
0x000x000xE00x070xF80x1F0x1C0x380x0E0x700x060x600x060x600x060x600x0E0x700x1C

0x380x180x180x000x00// C
0x000x000xFE0x7F0xFE0x7F0x060x600x060x600x060x600x060x600x0E0x700x1C0x380xF8

0x1F0xE00x070x000x00// D
0x000x000xFE0x7F0xFE0x7F0x860x610x860x610x860x610x860x610x860x610x860x610x06

0x600x060x600x000x00// E
0x000x000xFE0x7F0xFE0x7F0x860x010x860x010x860x010x860x010x860x010x860x010x06

0x000x060x000x000x00// F
0x000x000xE00x070xF80x1F0x1C0x380x0E0x700x060x600x860x610x860x610x860x610x8E

0x7F0x8C0x7F0x000x00// G
0x000x000xFE0x7F0xFE0x7F0x800x010x800x010x800x010x800x010x800x010x800x010xFE

0x7F0xFE0x7F0x000x00// H
0x000x000x000x000x000x000x060x600x060x600xFE0x7F0xFE0x7F0x060x600x060x600x00

0x000x000x000x000x00// I
0x000x000x000x1C0x000x3C0x000x700x000x600x000x600x000x600x000x600x000x700xFE

0x3F0xFE0x0F0x000x00// J
0x000x000xFE0x7F0xFE0x7F0x800x010xC00x030xE00x070x700x0E0x380x1C0x1C0x380x0E

0x700x060x600x000x00// K
0x000x000xFE0x7F0xFE0x7F0x000x600x000x600x000x600x000x600x000x600x000x600x00

0x600x000x600x000x00// L
0x000x000xFE0x7F0xFE0x7F0x3C0x000xF00x000xC00x030xC00x030xF00x000x3C0x000xFE

0x7F0xFE0x7F0x000x00// M
0x000x000xFE0x7F0xFE0x7F0x1C0x000x700x000xE00x010x800x070x000x0E0x000x380xFE

0x7F0xFE0x7F0x000x00// N
0x000x000xE00x070xF80x1F0x1C0x380x0E0x700x060x600x060x600x0E0x700x1C0x380xF8

0x1F0xE00x070x000x00// O
0x000x000xFE0x7F0xFE0x7F0x060x030x060x030x060x030x060x030x060x030x8E0x030xFC

0x010xF80x000x000x00// P
0x000x000xE00x070xF80x1F0x1C0x380x0E0x700x060x600x060x6C0x0E0x7C0x1C0x380xF8

0x7F0xE00x670x000x00// Q
0x000x000xFE0x7F0xFE0x7F0x060x030x060x030x060x070x060x0F0x060x1F0x8E0x3B0xFC

0x710xF80x600x000x00// R
0x000x000x780x180xFC0x380xCE0x710x860x610x860x610x860x610x860x610x8E0x730x1C

0x3F0x180x1E0x000x00// S
0x000x000x000x000x060x000x060x000x060x000xFE0x7F0xFE0x7F0x060x000x060x000x06

0x000x000x000x000x00// T
0x000x000xFE0x0F0xFE0x3F0x000x700x000x600x000x600x000x600x000x600x000x700xFE

0x3F0xFE0x0F0x000x00// U
0x000x000x0E0x000x7E0x000xF00x030x800x1F0x000x7C0x000x7C0x800x1F0xF00x030x7E

0x000x0E0x000x000x00// V
0x000x000xFE0x7F0xFE0x7F0x000x380x000x0C0x000x070x000x070x000x0C0x000x380xFE

0x7F0xFE0x7F0x000x00// W
0x000x000x060x600x1E0x780x380x1C0x600x060xC00x030xC00x030x600x060x380x1C0x1E

0x780x060x600x000x00// X
0x000x000x060x000x1E0x000x780x000xE00x010x800x7F0x800x7F0xE00x010x780x000x1E

0x000x060x000x000x00// Y
0x000x000x060x600x060x780x060x7C0x060x660x860x630xC60x610x660x600x3E0x600x1E

0x600x060x600x000x00// Z
0x000x000x000x000x000x000xFE0x7F0xFE0x7F0x060x600x060x600x060x600x060x600x00

0x000x000x000x000x00// [
0x000x000x1C0x000x380x000x700x000xE00x000xC00x010x800x030x000x070x000x0E0x00

0x1C0x000x380x000x00// BackSlash
0x000x000x000x000x000x000x060x600x060x600x060x600x060x600xFE0x7F0xFE0x7F0x00

0x000x000x000x000x00//
0x000x000xC00x000xE00x000x700x000x380x000x1C0x000x0E0x000x1C0x000x380x000x70

0x000xE00x000xC00x00//
0x000x000x000x600x000x600x000x600x000x600x000x600x000x600x000x600x000x600x00

0x600x000x600x000x00// _
0x000x000x000x000x000x000x000x000x000x000x3E0x000x7E0x000x4E0x000x000x000x00

0x000x000x000x000x00// `
0x000x000x000x1C0x400x3E0x600x330x600x330x600x330x600x330x600x330x600x330xE0

0x3F0xC00x3F0x000x00// a
0x000x000xFE0x7F0xFE0x7F0x800x610xC00x600xC00x600xC00x600xC00x600xC00x710x80

0x3F0x000x1F0x000x00// b
0x000x000x800x0F0xC00x1F0xE00x380x600x300x600x300x600x300x600x300x600x300xC0

0x180x800x080x000x00// c
0x000x000x000x1F0x800x3F0xC00x710xC00x600xC00x600xC00x600xC00x610x800x610xFE

0x7F0xFE0x7F0x000x00// d
0x000x000x800x0F0xC00x1F0xE00x3B0x600x330x600x330x600x330x600x330x600x330xC0

0x130x800x010x000x00// e
0x000x000x000x000x800x010x800x010xF80x7F0xFC0x7F0x8E0x010x860x010x860x010x06

0x000x000x000x000x00// f
0x000x000xC00x010xE00x630x700x670x300x660x300x660x300x660x300x660x300x730xF0

0x3F0xF00x1F0x000x00// g
0x000x000xFE0x7F0xFE0x7F0x800x010xC00x000xC00x000xC00x000xC00x010x800x7F0x00

0x7F0x000x000x000x00// h
0x000x000x000x000x000x000x000x300x600x300xEC0x3F0xEC0x3F0x000x300x000x300x00

0x000x000x000x000x00// i
0x000x000x000x000x000x000x000x300x000x700x000x600x300x600xF60x7F0xF60x3F0x00

0x000x000x000x000x00// j
0x000x000x000x000xFE0x7F0xFE0x7F0x000x060x000x0F0x800x1F0xC00x390xC00x700x00

0x600x000x000x000x00// k
0x000x000x000x000x000x000x000x600x060x600xFE0x7F0xFE0x7F0x000x600x000x600x00

0x000x000x000x000x00// l
0x000x000xE00x3F0xC00x3F0xE00x000xE00x000xC00x3F0xC00x3F0xE00x000xE00x000xC0

0x3F0x800x3F0x000x00// m
0x000x000x000x000xE00x3F0xE00x3F0x600x000x600x000x600x000x600x000xE00x000xC0

0x3F0x800x3F0x000x00// n
0x000x000x800x0F0xC00x1F0xE00x380x600x300x600x300x600x300x600x300xE00x380xC0

0x1F0x800x0F0x000x00// o
0x000x000xF00x7F0xF00x7F0x300x060x300x0C0x300x0C0x300x0C0x300x0C0x700x0E0xE0

0x070xC00x030x000x00// p
0x000x000xC00x030xE00x070x700x0E0x300x0C0x300x0C0x300x0C0x300x0C0x300x060xF0

0x7F0xF00x7F0x000x00// q
0x000x000x000x000xE00x3F0xE00x3F0xC00x000x600x000x600x000x600x000x600x000xE0

0x000xC00x000x000x00// r
0x000x000x000x000xC00x110xE00x330x600x330x600x330x600x330x600x330x600x3F0x40

0x1E0x000x000x000x00// s
0x000x000x000x000x600x000x600x000xFE0x1F0xFE0x3F0x600x300x600x300x600x300x00

0x300x000x000x000x00// t
0x000x000xE00x0F0xE00x1F0x000x380x000x300x000x300x000x300x000x300x000x180xE0

0x3F0xE00x3F0x000x00// u
0x000x000x600x000xE00x010x800x070x000x1E0x000x380x000x380x000x1E0x800x070xE0

0x010x600x000x000x00// v
0x000x000xE00x070xE00x1F0x000x380x000x1C0xE00x0F0xE00x0F0x000x1C0x000x380xE0

0x1F0xE00x070x000x00// w
0x000x000x600x300xE00x380xC00x1D0x800x0F0x000x070x800x0F0xC00x1D0xE00x380x60

0x300x000x000x000x00// x
0x000x000x000x000x300x000xF00x400xC00x730x000x3F0x000x0F0xC00x030xF00x000x30

0x000x000x000x000x00// y
0x000x000x600x300x600x380x600x3C0x600x360x600x330xE00x310xE00x300x600x300x20

0x300x000x000x000x00// z
0x000x000x000x000x800x000xC00x010xFC0x1F0x7E0x3F0x070x700x030x600x030x600x03

0x600x000x000x000x00// {
0x000x000x000x000x000x000x000x000x000x000x7E0x7F0x7E0x7F0x000x000x000x000x00

0x000x000x000x000x00// |
0x000x000x000x000x030x600x030x600x030x600x070x700x7E0x3F0xFC0x1F0xC00x010x80

0x000x000x000x000x00// }
0x000x000x100x000x180x000x0C0x000x040x000x0C0x000x180x000x100x000x180x000x0C

0x000x040x000x000x00// ->
0x000x000x000x0F0x800x0F0xC00x0C0x600x0C0x300x0C0x300x0C0x600x0C0xC00x0C0x80

0x0F0x000x0F0x000x00  // <-
};

const 
uint8_t Font_6x8[] = {
0x000x000x000x000x000x00// (space)
0x000x000x5F0x000x000x00// !
0x000x070x000x070x000x00// "
0x140x7F0x140x7F0x140x00// #
0x240x2A0x7F0x2A0x120x00// $
0x230x130x080x640x620x00// %
0x360x490x550x220x500x00// &
0x000x050x030x000x000x00// '
0x000x1C0x220x410x000x00// (
0x000x410x220x1C0x000x00// )
0x080x2A0x1C0x2A0x080x00// *
0x080x080x3E0x080x080x00// +
0x000x500x300x000x000x00// ,
0x080x080x080x080x080x00// -
0x000x300x300x000x000x00// .
0x200x100x080x040x020x00// /
0x3E0x510x490x450x3E0x00// 0
0x000x420x7F0x400x000x00// 1
0x420x610x510x490x460x00// 2
0x210x410x450x4B0x310x00// 3
0x180x140x120x7F0x100x00// 4
0x270x450x450x450x390x00// 5
0x3C0x4A0x490x490x300x00// 6
0x010x710x090x050x030x00// 7
0x360x490x490x490x360x00// 8
0x060x490x490x290x1E0x00// 9
0x000x360x360x000x000x00// :
0x000x560x360x000x000x00// ;
0x000x080x140x220x410x00// <
0x140x140x140x140x140x00// =
0x410x220x140x080x000x00// >
0x020x010x510x090x060x00// ?
0x320x490x790x410x3E0x00// @
0x7E0x110x110x110x7E0x00// A
0x7F0x490x490x490x360x00// B
0x3E0x410x410x410x220x00// C
0x7F0x410x410x220x1C0x00// D
0x7F0x490x490x490x410x00// E
0x7F0x090x090x010x010x00// F
0x3E0x410x410x510x320x00// G
0x7F0x080x080x080x7F0x00// H
0x000x410x7F0x410x000x00// I
0x200x400x410x3F0x010x00// J
0x7F0x080x140x220x410x00// K
0x7F0x400x400x400x400x00// L
0x7F0x020x040x020x7F0x00// M
0x7F0x040x080x100x7F0x00// N
0x3E0x410x410x410x3E0x00// O
0x7F0x090x090x090x060x00// P
0x3E0x410x510x210x5E0x00// Q
0x7F0x090x190x290x460x00// R
0x460x490x490x490x310x00// S
0x010x010x7F0x010x010x00// T
0x3F0x400x400x400x3F0x00// U
0x1F0x200x400x200x1F0x00// V
0x7F0x200x180x200x7F0x00// W
0x630x140x080x140x630x00// X
0x030x040x780x040x030x00// Y
0x610x510x490x450x430x00// Z
0x000x000x7F0x410x410x00// [
0x020x040x080x100x200x00// "\"
0x410x410x7F0x000x000x00// ]
0x040x020x010x020x040x00// ^
0x400x400x400x400x400x00// _
0x000x010x020x040x000x00// `
0x200x540x540x540x780x00// a
0x7F0x480x440x440x380x00// b
0x380x440x440x440x200x00// c
0x380x440x440x480x7F0x00// d
0x380x540x540x540x180x00// e
0x080x7E0x090x010x020x00// f
0x080x140x540x540x3C0x00// g
0x7F0x080x040x040x780x00// h
0x000x440x7D0x400x000x00// i
0x200x400x440x3D0x000x00// j
0x000x7F0x100x280x440x00// k
0x000x410x7F0x400x000x00// l
0x7C0x040x180x040x780x00// m
0x7C0x080x040x040x780x00// n
0x380x440x440x440x380x00// o
0x7C0x140x140x140x080x00// p
0x080x140x140x180x7C0x00// q
0x7C0x080x040x040x080x00// r
0x480x540x540x540x200x00// s
0x040x3F0x440x400x200x00// t
0x3C0x400x400x200x7C0x00// u
0x1C0x200x400x200x1C0x00// v
0x3C0x400x300x400x3C0x00// w
0x440x280x100x280x440x00// x
0x0C0x500x500x500x3C0x00// y
0x440x640x540x4C0x440x00// z
0x000x080x360x410x000x00// {
0x000x000x7F0x000x000x00// |
0x000x410x360x080x000x00// }
0x080x080x2A0x1C0x080x00// ->
0x080x1C0x2A0x080x080x00// <-
};

const 
uint8_t Segment_25x40[] = {
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x0E0x000x000x000x000x1F0x000x000x000x000x1F0x000x00

0x000x000x1F0x000x000x000x000x1F0x000x000x000x000x1F0x000x000x000x000x1F0x00

0x000x000x000x1F0x000x000x000x000x0E0x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x00,  // Code for char .
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x00,  // Code for char /
0x000x000x000x000x000x000x000x000x000x000xF00xFF0xF70xFF0x070xE00xFF0xE30xFF

0x030xC40xFF0xC10xFF0x110x8C0xFF0x800xFF0x180x1C0x7F0x000x7F0x1C0x3C0x000x00

0x000x1E0x7C0x000x000x000x1F0x7C0x000x000x000x1F0x7C0x000x000x000x1F0x7C0x00

0x000x000x1F0x7C0x000x000x000x1F0x7C0x000x000x000x1F0x7C0x000x000x000x1F0x7C

0x000x000x000x1F0x7C0x000x000x000x1F0x3C0x000x000x000x1E0x1C0x7F0x000x7F0x1C

0x8C0xFF0x800xFF0x180xC40xFF0xC10xFF0x110xE00xFF0xE30xFF0x030xF00xFF0xF70xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 0
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x7F0x000x7F0x00

0x800xFF0x800xFF0x000xC00xFF0xC10xFF0x010xE00xFF0xE30xFF0x030xF00xFF0xF70xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 1
0x000x000x000x000x000x000x000x000x000x000x000x000xF00xFF0x070x000x000xE00xFF

0x030x040x000xC00xFF0x110x0C0x000x880xFF0x180x1C0x000x1C0x7F0x1C0x3C0x000x3E

0x000x1E0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x00

0x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C

0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x3C0x000x3E0x000x1E0x1C0x7F0x1C0x000x1C

0x8C0xFF0x080x000x180xC40xFF0x010x000x100xE00xFF0x030x000x000xF00xFF0x070x00

0x000x000x000x000x000x000x000x000x000x000x00,  // Code for char 2
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x040x000x000x000x100x0C0x000x080x000x180x1C0x000x1C0x000x1C0x3C0x000x3E

0x000x1E0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x00

0x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C

0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x3C0x000x3E0x000x1E0x1C0x7F0x1C0x7F0x1C

0x8C0xFF0x880xFF0x180xC40xFF0xC10xFF0x110xE00xFF0xE30xFF0x030xF00xFF0xF70xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 3
0x000x000x000x000x000x000x000x000x000x000xF00xFF0x070x000x000xE00xFF0x030x00

0x000xC00xFF0x010x000x000x800xFF0x080x000x000x000x7F0x1C0x000x000x000x000x3E

0x000x000x000x000x3E0x000x000x000x000x3E0x000x000x000x000x3E0x000x000x000x00

0x3E0x000x000x000x000x3E0x000x000x000x000x3E0x000x000x000x000x3E0x000x000x00

0x000x3E0x000x000x000x000x3E0x000x000x000x000x3E0x000x000x000x7F0x1C0x7F0x00

0x800xFF0x880xFF0x000xC00xFF0xC10xFF0x010xE00xFF0xE30xFF0x030xF00xFF0xF70xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 4
0x000x000x000x000x000x000x000x000x000x000xF00xFF0x070x000x000xE00xFF0x030x00

0x000xC40xFF0x010x000x100x8C0xFF0x080x000x180x1C0x7F0x1C0x000x1C0x3C0x000x3E

0x000x1E0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x00

0x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C

0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x3C0x000x3E0x000x1E0x1C0x000x1C0x7F0x1C

0x0C0x000x880xFF0x180x040x000xC00xFF0x110x000x000xE00xFF0x030x000x000xF00xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 5
0x000x000x000x000x000x000x000x000x000x000xF00xFF0xF70xFF0x070xE00xFF0xE30xFF

0x030xC00xFF0xC10xFF0x110x800xFF0x880xFF0x180x000x7F0x1C0x7F0x1C0x000x000x3E

0x000x1E0x000x000x3E0x000x1F0x000x000x3E0x000x1F0x000x000x3E0x000x1F0x000x00

0x3E0x000x1F0x000x000x3E0x000x1F0x000x000x3E0x000x1F0x000x000x3E0x000x1F0x00

0x000x3E0x000x1F0x000x000x3E0x000x1F0x000x000x3E0x000x1E0x000x000x1C0x7F0x1C

0x000x000x880xFF0x180x000x000xC00xFF0x110x000x000xE00xFF0x030x000x000xF00xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 6
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x040x000x000x000x000x0C0x000x000x000x000x1C0x000x000x000x000x3C0x000x00

0x000x000x7C0x000x000x000x000x7C0x000x000x000x000x7C0x000x000x000x000x7C0x00

0x000x000x000x7C0x000x000x000x000x7C0x000x000x000x000x7C0x000x000x000x000x7C

0x000x000x000x000x7C0x000x000x000x000x3C0x000x000x000x000x1C0x7F0x000x7F0x00

0x8C0xFF0x800xFF0x000xC40xFF0xC10xFF0x010xE00xFF0xE30xFF0x030xF00xFF0xF70xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 7
0x000x000x000x000x000x000x000x000x000x000xF00xFF0xF70xFF0x070xE00xFF0xE30xFF

0x030xC40xFF0xC10xFF0x110x8C0xFF0x880xFF0x180x1C0x7F0x1C0x7F0x1C0x3C0x000x3E

0x000x1E0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x00

0x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x7C

0x000x3E0x000x1F0x7C0x000x3E0x000x1F0x3C0x000x3E0x000x1E0x1C0x7F0x1C0x7F0x1C

0x8C0xFF0x880xFF0x180xC40xFF0xC10xFF0x110xE00xFF0xE30xFF0x030xF00xFF0xF70xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 8
0x000x000x000x000x000x000x000x000x000x000xF00xFF0x070x000x000xE00xFF0x030x00

0x000xC40xFF0x010x000x000x8C0xFF0x080x000x000x1C0x7F0x1C0x000x000x3C0x000x3E

0x000x000x7C0x000x3E0x000x000x7C0x000x3E0x000x000x7C0x000x3E0x000x000x7C0x00

0x3E0x000x000x7C0x000x3E0x000x000x7C0x000x3E0x000x000x7C0x000x3E0x000x000x7C

0x000x3E0x000x000x7C0x000x3E0x000x000x3C0x000x3E0x000x000x1C0x7F0x1C0x7F0x00

0x8C0xFF0x880xFF0x000xC40xFF0xC10xFF0x010xE00xFF0xE30xFF0x030xF00xFF0xF70xFF

0x070x000x000x000x000x000x000x000x000x000x00,  // Code for char 9
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00

0x000x040x000x000x000x100x0C0x000x000x000x180x1C0x000x000x000x1C0x3C0x000x00

0x000x1E0x7C0x000x000x000x1F0x7C0x000x000x000x1F0x7C0x000x000x000x1F0x7C0x00

0x000x000x1F0x7C0x000x000x000x1F0x7C0x000x000x000x1F0x7C0x000x000x000x1F0x7C

0x000x000x000x1F0x7C0x000x000x000x1F0x3C0x000x000x000x1E0x1C0x000x000x000x1C

0x0C0x000x000x000x180x040x000x000x000x100x000x000x000x000x000x000x000x000x00

0x000x000x000x000x000x000x000x000x000x000x00   // Code for char :
};
#endif



Şimdiik bu kadar.
Kamera dandik olduğundan videoda bir şey gözükmez ama güzel kamera bulursam çekerim :D

mesaj birleştirme:: 03 Mayıs 2015, 22:27:51

Unutmadan SSD'nin datasheet'i : https://www.adafruit.com/datasheets/SSD1306.pdf (https://www.adafruit.com/datasheets/SSD1306.pdf)

Bütün detaylar mevcut.Mesela sayfa 37 de

10.1.12 Set Display ON/OFF (AEh/AFh)
AEh : Display OFF
AFh : Display ON   demiş.

Oled_Command(0xAE); ile Displayi uyku moduna alabilirsiniz.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 05 Mayıs 2015, 03:23:01
Merhaba arkadaşlar bugün Usart notlarını paylaşacağım :) Örnek ve test amaçlı USB/Serial Çevirici vasıtasıyla

bilgisayar ile haberleştirdim.

Oldukça basit bir kullanımı var.Ben USART 1'i kullandım.Kod üzerinden açıkalyayım.Tabi öncelikle USART 1 pinlerini

STM32F0 da hangi pinlerde kullanabiliriz buna bir bakalım.Datasheet sayfa 34 de USART 1 'i PA9(TX), PA10(RX) olarak

kullanılabiliyormuş, ben böyle ayarladım.


#include "stm32f0xx_conf.h"
#include "main.h"

static void Init_USART(void);//Usart hazırama fonksiyon prototipi

int main(void)
{
    
Init_USART();//usart hazırla

    
while(1)
    {
        while(
USART_GetFlagStatus(USART1USART_FLAG_TXE) == RESET);//gönderme bayrağı 0 da ise 
        
USART_SendData(USART1'X'); // sürekli 'x' karakterini gönder
    
}
}

static 
void Init_USART(void)
{
    
USART_InitTypeDef USART_InitTypeDefStructure;//usart structure
    
GPIO_InitTypeDef  GPIO_InitTypeDefStructure;
    
NVIC_InitTypeDef  NVIC_InitStructure;

    
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOAENABLE);//a portu için clock
    
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1ENABLE); //usart 1 clock

    
GPIO_PinAFConfig(GPIOAGPIO_PinSource9GPIO_AF_1);
/* alternative func... AF_0 içinde usart 1 kullanılır demiş açıklamada ama ben denedim çalışmadı.
1 için de diyordu bu modda çalıştı ne hikmetse.*/
    
GPIO_PinAFConfig(GPIOAGPIO_PinSource10,GPIO_AF_1);

    
GPIO_InitTypeDefStructure.GPIO_Mode  GPIO_Mode_AF;
    
GPIO_InitTypeDefStructure.GPIO_OType GPIO_OType_PP;
    
GPIO_InitTypeDefStructure.GPIO_Pin   GPIO_Pin_9 GPIO_Pin_10//USART 1 : PA9 = TX, PA10 = RX
    
GPIO_InitTypeDefStructure.GPIO_PuPd  GPIO_PuPd_UP;//high seviyede tutulyor pull up
    
GPIO_InitTypeDefStructure.GPIO_Speed GPIO_Speed_50MHz
    
GPIO_Init(GPIOA,&GPIO_InitTypeDefStructure);

    
NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;
    
NVIC_InitStructure.NVIC_IRQChannelPriority 0;//rx kesmesi için nvic ayarları 
    
NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;
    
NVIC_Init(&NVIC_InitStructure);

    
USART_InitTypeDefStructure.USART_BaudRate            9600;//baud rate 
    
USART_InitTypeDefStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;
    
USART_InitTypeDefStructure.USART_Mode                USART_Mode_Rx USART_Mode_Tx;//alıcı ve verici modda 
    
USART_InitTypeDefStructure.USART_Parity              USART_Parity_No;//parity biti yok
    
USART_InitTypeDefStructure.USART_StopBits            USART_StopBits_1;//stop biti 1 
    
USART_InitTypeDefStructure.USART_WordLength          USART_WordLength_8b;//8 bitlik datalar gönderilecek
    
USART_Init(USART1,&USART_InitTypeDefStructure);

    
USART_Cmd(USART1,ENABLE);//usart 1 aktif

    
USART_ITConfig(USART1USART_IT_RXNEENABLE);//USART 1 rx kesmesi aktif (veri geldiğin de düşülecek fonksiyon, 

stm32f00xx_it.c ve .h dosyalarını ekliyoruz projeye)

}



stm32f00xx_it.c

void USART1_IRQHandler
(void)
{
    if (
USART_GetITStatus(USART1USART_IT_RXNE) != RESET)// usart 1 rx bayrağı reset(0) değil se , veri geldi
    
{
	
if((
char)USART_ReceiveData(USART1) == 'A')//veri alma fonskiyonu uint16 döndürüyor siz karakter kontrolü 

yapacaksanız char a çevirip sağlama alabilirsiniz
        
{
            
//gelen veri A karakteri ise işlem yap
        
}
    }
}


Bu kadar :)

mesaj birleştirme:: 05 Mayıs 2015, 03:24:29

Dip not : stm32f00xx_it.h dosyasında isterseniz void USART1_IRQHandler(void); şeklinde prototipini tanımlayabilirsiniz.
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: eeburakdemir - 05 Haziran 2015, 04:05:27
@ Baran Ekrem hocam ben bu örneği stm32f4 disc. denemeye çalışıyorum da , 164 ün bacaklarından segmentlere sürme sırası nedir yada  bağlantılarını yazarmısınız ? pic de yaptığımız gibi 13 den itibaren a ile başlayıp sıralıyormusunuz ?
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 05 Haziran 2015, 04:23:00
Merhaba @eeburakdemir
Q0 - A
Q1 - B
Şeklinde bağlantı yapılıyor.
(http://www.wvshare.com/img/pinout/74HC164_l.jpg)
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: eeburakdemir - 22 Haziran 2015, 01:02:50
@Baran Ekrem teşekkürler , deneyeceğim ve en kısa süre içinde yazacağım. Çalıştığım için geç yazdım kusura bakma
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 22 Haziran 2015, 01:21:27
Estağfurullah. :) Zaten biraz ara verdik.En kısa zamanda yeni uygulamalar ve dersler ekleyeceğiz.İlgin için teşekkür ederim.
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: eeburakdemir - 24 Haziran 2015, 22:20:55
@Baran Ekrem hocam sana özelden nasıl ulaşabilirim ?
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 24 Haziran 2015, 22:24:32
kişisel ileti atabilirsin. :D
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: Sya - 12 Eylül 2015, 00:46:28
Hocam std library yerine stmcubemx in hal library kullansak daha kolay olmaz mı ?
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 12 Eylül 2015, 00:56:08
Alıntı yapılan: Sya - 12 Eylül 2015, 00:46:28
Hocam std library yerine stmcubemx in hal library kullansak daha kolay olmaz mı ?
Bunu bir öğrenelim de onuda yaparız ;)
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: Sya - 12 Eylül 2015, 01:02:59
Eyvallah hocam :)
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: M_B - 09 Mart 2018, 14:25:41
Merhabalar,
Burdaki tüm örnekleri keil ile yeniden düzenleyip derliyorum.
SPI örneğini derlerken şu şekilde hata alıyorum
Alıntıssd1306.c(106): error:  #18: expected a ")"
     low_column = (seg & 0b00001111);
ssd1306.c(107): error:  #18: expected a ")"
     hig_column = (seg & 0b11110000)>>4;
ssd1306.c(108): error:  #65: expected a ";"
     hig_column = hig_column | 0b00010000;
ssd1306.c(109): error:  #18: expected a ")"
     pag = (pag & 0b00000111);
ssd1306.c(110): error:  #18: expected a ")"
     pag = (pag | 0b10110000);

Yukardaki hatada belirtilen fonksiyon ise

void Oled_SetPointer
(uint8_t seguint8_t pag)
{
   
uint8_t low_columnhig_column;

   
low_column = (seg 0b00001111);         // 106 nolu satır.
   
hig_column = (seg 0b11110000)>>4;    // 107 nolu satır.
   
hig_column hig_column 0b00010000;
   
pag = (pag 0b00000111);
   
pag = (pag 0b10110000);                  // 110 nolu satır.
   
Oled_Command(low_column);
   
Oled_Command(hig_column);
   
Oled_Command(pag);
}


Bu hatayı nasıl cözebilirim.
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: M_B - 09 Mart 2018, 15:09:52
Merhabalar;
Fonksiyonu aşağıdaki gibi düzenleyince hata mesajı gitti.


void Oled_SetPointer
(uint8_t seguint8_t pag)
{
   
uint8_t low_columnhig_column;

   
low_column = (seg 0x0F);
   
hig_column = (seg 0xF0)>>4;
   
hig_column hig_column 0x10;
   
pag = (pag 0x07);
   
pag = (pag 0xB0);
   
Oled_Command(low_column);
   
Oled_Command(hig_column);
   
Oled_Command(pag);
}


Peki değişen ne oldu ki
Birisinde Binary yazım diğerinde ise Hex 

Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: M_B - 09 Mart 2018, 16:16:57
Ansi C binary desteklemiyor muş.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 09 Mart 2018, 22:16:41
Evet aynı derten bende muzdarip oldum hocam :)
Hex şeklinde yazınca düzeldi.