Picproje Elektronik Sitesi

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

Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 08 Nisan 2015, 23: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, 00:18:33

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

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

Emblocks ile Adım Adım Proje Oluşturma
Öncelikle aşağıdaki gibi bir ekran önümüze geliyor, bu ekranda File > New > Project seçeneklerini giriyoruz. ( Yazı ile de yazıyorum ki yıllar sonra resim silinirse en azından yazdıklarımız kalsın :) )
(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, 20:32:56
Elinize saglik hocam  konunun güncel kalması önemli
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 10 Nisan 2015, 21: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 - 10 Nisan 2015, 21: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 - 10 Nisan 2015, 21: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 - 10 Nisan 2015, 23: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, 00: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:: 11 Nisan 2015, 14:15:15

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

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

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

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

Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 14 Nisan 2015, 00: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 ^= 1 << 0;
  }

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

Bu uygulamada biraz kötü bir anlatım oldu sanırım.Çünkü kendi örneğimi yapacak fırsat bulamadım henüz ama daha sonra büyn derslerle ilgili örnekler yapıp paylaşacağım.Bir de öyle bir şeye değinebiliriz.Kütüphanelerde adamlar adım adım ne yapacağımızı anlatmışlar.Hemde çok basit bir şekilde çevirme ihtiyacı bile olmadan çok rahat öğrenilebiliyor.Emblocks ve GCC ikilisini uzun bir süre kullanacağım. :D
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 14 Nisan 2015, 21: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

5 = 1/48Mhz * Y * 65535

0,00000002083 * 65535 * Y = 5

0,0013653125 * Y = 5

Y = 3662

sayi = 64803


Tabi yine stm32f0xx_it.c ve stm32f0xx_it.h dosyalarını eklememiz gerekiyor.
ve stm32f0xx_it.c dosyasından aşağıda ki fonksiyona gelip

void TIM6_DAC_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM6,TIM_IT_Update) != RESET)
    {
        Buton_State ^= 1 << 0; //buton 1 ise 0, 0 ise 1 yap

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }
#endif /* PLL_SOURCE_HSI */
}
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 15 Nisan 2015, 23: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 ^= 1 << 0; //led blink yaptırdık (main içinde)
}


Kodlar main.c

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

* File Name        : main.c

* Description      : Timer6_Uygulaması

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

* Additional Information : Timer ile interrupt olusturma

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

uint32_t Buton_State = 0;

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

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

void CPU_Init()
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

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

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

    GPIO_Init(GPIOC,&GPIO_InitStructure);

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

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    // Systic Klavuzu

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

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

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

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

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

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

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


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

Dipnot : main.c içerisinde systick açıklaması mevcut.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: FxDev - 16 Nisan 2015, 00: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, 09: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, 10:15:19
Alıntı yapılan: justice_for_all - 16 Nisan 2015, 09:11:46

    SysTick_Config(SystemCoreClock / 10);       //100 ms


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

DipNot : İyiki yazdığımız kodların sağına soluna bi kaç açıklama satırı yazıyoruz :)
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 20 Nisan 2015, 15: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_Minutes& 0xF0) >> 4; //dakika yüksek biti al
    }
}

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

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

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

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

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

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

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

    GPIO_Init(GPIOA,&GPIO_InitStructure);

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

    GPIO_Init(GPIOC,&GPIO_InitStructure);

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


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

    RTC_InitTypeDef  RTC_InitStructure;//rtc structure

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

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

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

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

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

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

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

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

    SynchPrediv = 0xFF;
    AsynchPrediv = 0x7F;

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

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

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

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

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

    RTC_DateStruct.RTC_Year     = 0x15;
    RTC_DateStruct.RTC_Month    = 0x04;
    RTC_DateStruct.RTC_Date     = 0x19;
//saat tarih için ilk atamaar yoksa sıfırdan başlayacak
    RTC_SetDate(RTC_Format_BCD,&RTC_DateStruct);
    RTC_SetTime(RTC_Format_BCD,&RTC_TimeStruct);//formatı belirle ve ayarları yüke
}
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: MrDarK - 20 Nisan 2015, 15: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, 15:56:28
Bundan sonra videoda eklerim :)
https://youtu.be/vL1IprqhMmE

mesaj birleştirme:: 21 Nisan 2015, 05:57:04

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

mesaj birleştirme:: 20 Nisan 2015, 15: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16:31:07
Alıntı yapılan: Baran Ekrem - 20 Nisan 2015, 16: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, 16: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, 17: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, 15: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(i = 0x80; i > 0; i >>= 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_ADC1, ENABLE);//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(ADC1, ADC_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(ADC1, ENABLE);//adc aktif

    while(!ADC_GetFlagStatus(ADC1, ADC_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(GPIOC, 0x000F);
        break;

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

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

    case 3:
        HC164_Send(Display_Figures[Display_Buffer[0]]);
        GPIO_Write(GPIOC, 0x0007);
        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:: 25 Nisan 2015, 15:48:49

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, 15: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, 17: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, 19: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(GPIOA, GPIO_PinSource5, GPIO_AF_0);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0); //af modda olduklarını belirtiyoruz.
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_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_6x8, 6, 8, 32, 127);

    Oled_ConstText("  [url=https://www.picproje.org]www.picproje.org[/url]", 0, 0);
    Oled_ConstText("Developer : Mr.EKREM", 0, 4);
    Oled_ConstText("  [url=https://www.picproje.org]www.picproje.org[/url]", 0, 7);

    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 width, height, min, max;

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 seg, uint8_t pag);
void Oled_WriteChar(uint8_t c, uint8_t seg, uint8_t pag);
void Oled_Text(char *buffer, uint8_t seg, uint8_t pag);
void Oled_ConstText(const char *buffer, uint8_t seg, uint8_t pag);
void Left_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_t set_time);
void Right_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_t set_time);
void VerticalLeft_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_t set_time);
void VerticalRight_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_t set_time);
void Oled_SetFont(const uint8_t *_font, uint8_t _width, uint8_t _height, uint8_t _min, uint8_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(SPI1, Command);
    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(SPI1, Data);
    while (SPI1->SR & SPI_SR_BSY);

    GPIO_SetBits(LCD_CS_PORT,LCD_CS_PIN);
}

void Oled_SetPointer(uint8_t seg, uint8_t pag)
{
   uint8_t low_column, hig_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 *_font, uint8_t _width, uint8_t _height, uint8_t _min, uint8_t _max)
{
   font2  = _font;
   width  = _width;
   height = _height / 8;
   min    = _min;
   max    = _max;
}

void Oled_WriteChar(uint8_t c, uint8_t seg, uint8_t pag)
{
   uint8_t i, j, k, l;
   uint8_t x_seg, y_pag;

   x_seg = seg;
   y_pag = pag;
   font = font2;
   k = c - min;
   l = (width * height);

   for(j = 0; j < k; j++)
   {
       for(i = 0; i < l; i++)
       {
          font++;
       }
   }

   for(i = 0; i < width; i++)
   {
      y_pag = pag;
      for(j = 0; j < height; j++)
      {
         if(x_seg < 128)
         {
            Oled_SetPointer(x_seg, y_pag);
            Oled_WriteRam(*font);
         }
         y_pag++;
         font++;
      }
      x_seg++;
   }
}

void Oled_ConstText(const char *buffer, uint8_t seg, uint8_t pag)
{
   uint8_t x_seg = seg;

   while(*buffer)
   {
      Oled_WriteChar(*buffer, x_seg, pag);
      x_seg = x_seg + width;
      buffer++;
   }
}

void Oled_Text(char *buffer, uint8_t seg, uint8_t pag)
{
   uint8_t x_seg = seg;

   while(*buffer)
   {
      Oled_WriteChar(*buffer, x_seg, pag);
      x_seg = x_seg + width;
      buffer++;
   }
}

void Oled_FillScreen(uint8_t pattern)
{
   unsigned char i, j;

   for(i = 0; i < 8; i++)
   {
      Oled_SetPointer(0, i);
      for(j = 0; j < 128; j++)
      {
         Oled_WriteRam(pattern);
      }
   }
}

void Oled_Image(const uint8_t *buffer)
{
   unsigned char i, j;

   for(i = 0; i < 8; i++)
   {
      Oled_SetPointer(0, i);
      for(j = 0; j < 128; j++)
      {
         Oled_WriteRam(*buffer);
         buffer++;
      }
   }
}

void Right_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_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_page, uint8_t end_page, uint8_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_page, uint8_t end_page, uint8_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_page, uint8_t end_page, uint8_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 seg, uint8_t pag);
void Oled_WriteChar(uint8_t c, uint8_t seg, uint8_t pag);
void Oled_Text(char *buffer, uint8_t seg, uint8_t pag);
void Oled_ConstText(const char *buffer, uint8_t seg, uint8_t pag);
void Left_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_t set_time);
void Right_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_t set_time);
void VerticalLeft_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_t set_time);
void VerticalRight_HorizontalScroll(uint8_t start_page, uint8_t end_page, uint8_t set_time);
void Oled_SetFont(const uint8_t *_font, uint8_t _width, uint8_t _height, uint8_t _min, uint8_t _max);


#endif /* SSD1306_H_INCLUDED */


font.h


#ifndef FONT_H
#define FONT_H

const uint8_t Terminal12x16[2304] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // (space)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xFE, 0x67, 0xFE, 0x67, 0xF8, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // !
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // "
0x00, 0x00, 0x00, 0x04, 0x20, 0x3C, 0x20, 0x3F, 0xE0, 0x07, 0xFC, 0x04, 0x3C, 0x3C, 0x20, 0x3F, 0xE0, 0x07, 0xFC,

0x04, 0x3C, 0x00, 0x20, 0x00, // #
0x00, 0x00, 0x00, 0x00, 0xF0, 0x08, 0xF8, 0x19, 0x98, 0x19, 0xFE, 0x7F, 0xFE, 0x7F, 0x98, 0x19, 0x98, 0x1F, 0x10,

0x0F, 0x00, 0x00, 0x00, 0x00, // $
0x00, 0x00, 0x00, 0x30, 0x38, 0x38, 0x38, 0x1C, 0x38, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x38, 0x70,

0x38, 0x38, 0x38, 0x00, 0x00, // %
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xB8, 0x3F, 0xFC, 0x31, 0xC6, 0x21, 0xE2, 0x37, 0x3E, 0x1E, 0x1C, 0x1C, 0x00,

0x36, 0x00, 0x22, 0x00, 0x00, // &
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // '
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0xF8, 0x1F, 0xFC, 0x3F, 0x0E, 0x70, 0x02, 0x40, 0x02, 0x40, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // (
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x02, 0x40, 0x0E, 0x70, 0xFC, 0x3F, 0xF8, 0x1F, 0xE0, 0x07, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // )
0x00, 0x00, 0x00, 0x00, 0x98, 0x0C, 0xB8, 0x0E, 0xE0, 0x03, 0xF8, 0x0F, 0xF8, 0x0F, 0xE0, 0x03, 0xB8, 0x0E, 0x98,

0x0C, 0x00, 0x00, 0x00, 0x00, // *
0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xF0, 0x0F, 0xF0, 0x0F, 0x80, 0x01, 0x80, 0x01, 0x80,

0x01, 0x00, 0x00, 0x00, 0x00, // +
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // ,
0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,

0x01, 0x00, 0x00, 0x00, 0x00, // -
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // .
0x00, 0x00, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x38,

0x00, 0x1C, 0x00, 0x00, 0x00, // /
0x00, 0x00, 0xF0, 0x0F, 0xFC, 0x3F, 0x0C, 0x3C, 0x06, 0x66, 0x06, 0x63, 0x86, 0x61, 0xC6, 0x60, 0x66, 0x60, 0x3C,

0x30, 0xFC, 0x3F, 0xF0, 0x0F, // 0
0x00, 0x00, 0x00, 0x00, 0x18, 0x60, 0x18, 0x60, 0x1C, 0x60, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x60, 0x00, 0x60, 0x00,

0x60, 0x00, 0x00, 0x00, 0x00, // 1
0x00, 0x00, 0x38, 0x60, 0x3C, 0x70, 0x0E, 0x78, 0x06, 0x7C, 0x06, 0x6E, 0x06, 0x67, 0x86, 0x63, 0xC6, 0x61, 0xEE,

0x60, 0x7C, 0x60, 0x38, 0x60, // 2
0x00, 0x00, 0x18, 0x18, 0x1C, 0x38, 0x0E, 0x70, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0xCE,

0x73, 0xFC, 0x3E, 0x78, 0x1C, // 3
0x00, 0x00, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x06, 0x70, 0x06, 0x38, 0x06, 0x1C, 0x06, 0x0E, 0x06, 0xFE, 0x7F, 0xFE,

0x7F, 0x00, 0x06, 0x00, 0x06, // 4
0x00, 0x00, 0x7E, 0x18, 0xFE, 0x38, 0xC6, 0x70, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x60, 0xC6,

0x71, 0x86, 0x3F, 0x06, 0x1F, // 5
0x00, 0x00, 0x80, 0x1F, 0xE0, 0x3F, 0xF0, 0x73, 0xB8, 0x61, 0x9C, 0x61, 0x8E, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86,

0x73, 0x00, 0x3F, 0x00, 0x1E, // 6
0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x60, 0x06, 0x78, 0x06, 0x1E, 0x86, 0x07, 0xE6, 0x01, 0x7E,

0x00, 0x1E, 0x00, 0x06, 0x00, // 7
0x00, 0x00, 0x00, 0x1E, 0x78, 0x3F, 0xFC, 0x73, 0xCE, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0xCE, 0x61, 0xFC,

0x73, 0x78, 0x3F, 0x00, 0x1E, // C8
0x00, 0x00, 0x78, 0x00, 0xFC, 0x00, 0xCE, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x71, 0x86, 0x39, 0x86, 0x1D, 0xCE,

0x0F, 0xFC, 0x07, 0xF8, 0x01, // 9
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1C, 0x70, 0x1C, 0x70, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // :
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x4E, 0x38, 0x7E, 0x38, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // ;
0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xC0, 0x03, 0xE0, 0x07, 0x70, 0x0E, 0x38, 0x1C, 0x1C, 0x38, 0x0E, 0x70, 0x06,

0x60, 0x00, 0x00, 0x00, 0x00, // <
0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60,

0x06, 0x60, 0x06, 0x00, 0x00, // =
0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x0E, 0x70, 0x1C, 0x38, 0x38, 0x1C, 0x70, 0x0E, 0xE0, 0x07, 0xC0, 0x03, 0x80,

0x01, 0x00, 0x00, 0x00, 0x00, // >
0x00, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x06, 0x6F, 0x86, 0x6F, 0xC6, 0x01, 0xEE, 0x00, 0x7C,

0x00, 0x38, 0x00, 0x00, 0x00, // ?
0x00, 0x00, 0xF0, 0x1F, 0xFC, 0x3F, 0x0E, 0x30, 0xE6, 0x67, 0xF6, 0x6F, 0x36, 0x6C, 0xF6, 0x6F, 0xF6, 0x6F, 0x0E,

0x6C, 0xFC, 0x07, 0xF0, 0x03, // @
0x00, 0x00, 0x00, 0x70, 0x00, 0x7E, 0xC0, 0x0F, 0xF8, 0x0D, 0x3E, 0x0C, 0x3E, 0x0C, 0xF8, 0x0D, 0xC0, 0x0F, 0x00,

0x7E, 0x00, 0x70, 0x00, 0x00, // A
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0xCE, 0x61, 0xFC, 0x73, 0x78,

0x3F, 0x00, 0x1E, 0x00, 0x00, // B
0x00, 0x00, 0xE0, 0x07, 0xF8, 0x1F, 0x1C, 0x38, 0x0E, 0x70, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x1C,

0x38, 0x18, 0x18, 0x00, 0x00, // C
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x1C, 0x38, 0xF8,

0x1F, 0xE0, 0x07, 0x00, 0x00, // D
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x06,

0x60, 0x06, 0x60, 0x00, 0x00, // E
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x06,

0x00, 0x06, 0x00, 0x00, 0x00, // F
0x00, 0x00, 0xE0, 0x07, 0xF8, 0x1F, 0x1C, 0x38, 0x0E, 0x70, 0x06, 0x60, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x8E,

0x7F, 0x8C, 0x7F, 0x00, 0x00, // G
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xFE,

0x7F, 0xFE, 0x7F, 0x00, 0x00, // H
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x06, 0x60, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x60, 0x06, 0x60, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // I
0x00, 0x00, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0xFE,

0x3F, 0xFE, 0x0F, 0x00, 0x00, // J
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x80, 0x01, 0xC0, 0x03, 0xE0, 0x07, 0x70, 0x0E, 0x38, 0x1C, 0x1C, 0x38, 0x0E,

0x70, 0x06, 0x60, 0x00, 0x00, // K
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00,

0x60, 0x00, 0x60, 0x00, 0x00, // L
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x3C, 0x00, 0xF0, 0x00, 0xC0, 0x03, 0xC0, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0xFE,

0x7F, 0xFE, 0x7F, 0x00, 0x00, // M
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x1C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x38, 0xFE,

0x7F, 0xFE, 0x7F, 0x00, 0x00, // N
0x00, 0x00, 0xE0, 0x07, 0xF8, 0x1F, 0x1C, 0x38, 0x0E, 0x70, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x1C, 0x38, 0xF8,

0x1F, 0xE0, 0x07, 0x00, 0x00, // O
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x8E, 0x03, 0xFC,

0x01, 0xF8, 0x00, 0x00, 0x00, // P
0x00, 0x00, 0xE0, 0x07, 0xF8, 0x1F, 0x1C, 0x38, 0x0E, 0x70, 0x06, 0x60, 0x06, 0x6C, 0x0E, 0x7C, 0x1C, 0x38, 0xF8,

0x7F, 0xE0, 0x67, 0x00, 0x00, // Q
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x03, 0x06, 0x03, 0x06, 0x07, 0x06, 0x0F, 0x06, 0x1F, 0x8E, 0x3B, 0xFC,

0x71, 0xF8, 0x60, 0x00, 0x00, // R
0x00, 0x00, 0x78, 0x18, 0xFC, 0x38, 0xCE, 0x71, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x8E, 0x73, 0x1C,

0x3F, 0x18, 0x1E, 0x00, 0x00, // S
0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x00, 0x06, 0x00, 0x06,

0x00, 0x00, 0x00, 0x00, 0x00, // T
0x00, 0x00, 0xFE, 0x0F, 0xFE, 0x3F, 0x00, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0xFE,

0x3F, 0xFE, 0x0F, 0x00, 0x00, // U
0x00, 0x00, 0x0E, 0x00, 0x7E, 0x00, 0xF0, 0x03, 0x80, 0x1F, 0x00, 0x7C, 0x00, 0x7C, 0x80, 0x1F, 0xF0, 0x03, 0x7E,

0x00, 0x0E, 0x00, 0x00, 0x00, // V
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x38, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x38, 0xFE,

0x7F, 0xFE, 0x7F, 0x00, 0x00, // W
0x00, 0x00, 0x06, 0x60, 0x1E, 0x78, 0x38, 0x1C, 0x60, 0x06, 0xC0, 0x03, 0xC0, 0x03, 0x60, 0x06, 0x38, 0x1C, 0x1E,

0x78, 0x06, 0x60, 0x00, 0x00, // X
0x00, 0x00, 0x06, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xE0, 0x01, 0x80, 0x7F, 0x80, 0x7F, 0xE0, 0x01, 0x78, 0x00, 0x1E,

0x00, 0x06, 0x00, 0x00, 0x00, // Y
0x00, 0x00, 0x06, 0x60, 0x06, 0x78, 0x06, 0x7C, 0x06, 0x66, 0x86, 0x63, 0xC6, 0x61, 0x66, 0x60, 0x3E, 0x60, 0x1E,

0x60, 0x06, 0x60, 0x00, 0x00, // Z
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // [
0x00, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x0E, 0x00,

0x1C, 0x00, 0x38, 0x00, 0x00, // BackSlash
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0xFE, 0x7F, 0xFE, 0x7F, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, //
0x00, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70,

0x00, 0xE0, 0x00, 0xC0, 0x00, //
0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00,

0x60, 0x00, 0x60, 0x00, 0x00, // _
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // `
0x00, 0x00, 0x00, 0x1C, 0x40, 0x3E, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0xE0,

0x3F, 0xC0, 0x3F, 0x00, 0x00, // a
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x80, 0x61, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0x80,

0x3F, 0x00, 0x1F, 0x00, 0x00, // b
0x00, 0x00, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xC0,

0x18, 0x80, 0x08, 0x00, 0x00, // c
0x00, 0x00, 0x00, 0x1F, 0x80, 0x3F, 0xC0, 0x71, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x61, 0x80, 0x61, 0xFE,

0x7F, 0xFE, 0x7F, 0x00, 0x00, // d
0x00, 0x00, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x3B, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0xC0,

0x13, 0x80, 0x01, 0x00, 0x00, // e
0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0xF8, 0x7F, 0xFC, 0x7F, 0x8E, 0x01, 0x86, 0x01, 0x86, 0x01, 0x06,

0x00, 0x00, 0x00, 0x00, 0x00, // f
0x00, 0x00, 0xC0, 0x01, 0xE0, 0x63, 0x70, 0x67, 0x30, 0x66, 0x30, 0x66, 0x30, 0x66, 0x30, 0x66, 0x30, 0x73, 0xF0,

0x3F, 0xF0, 0x1F, 0x00, 0x00, // g
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x80, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x7F, 0x00,

0x7F, 0x00, 0x00, 0x00, 0x00, // h
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x30, 0xEC, 0x3F, 0xEC, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // i
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x30, 0x60, 0xF6, 0x7F, 0xF6, 0x3F, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // j
0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x06, 0x00, 0x0F, 0x80, 0x1F, 0xC0, 0x39, 0xC0, 0x70, 0x00,

0x60, 0x00, 0x00, 0x00, 0x00, // k
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x60, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x60, 0x00, 0x60, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // l
0x00, 0x00, 0xE0, 0x3F, 0xC0, 0x3F, 0xE0, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, 0xE0, 0x00, 0xE0, 0x00, 0xC0,

0x3F, 0x80, 0x3F, 0x00, 0x00, // m
0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0xE0, 0x3F, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0,

0x3F, 0x80, 0x3F, 0x00, 0x00, // n
0x00, 0x00, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xE0, 0x38, 0xC0,

0x1F, 0x80, 0x0F, 0x00, 0x00, // o
0x00, 0x00, 0xF0, 0x7F, 0xF0, 0x7F, 0x30, 0x06, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x70, 0x0E, 0xE0,

0x07, 0xC0, 0x03, 0x00, 0x00, // p
0x00, 0x00, 0xC0, 0x03, 0xE0, 0x07, 0x70, 0x0E, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x06, 0xF0,

0x7F, 0xF0, 0x7F, 0x00, 0x00, // q
0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0xE0, 0x3F, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0,

0x00, 0xC0, 0x00, 0x00, 0x00, // r
0x00, 0x00, 0x00, 0x00, 0xC0, 0x11, 0xE0, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x3F, 0x40,

0x1E, 0x00, 0x00, 0x00, 0x00, // s
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0xFE, 0x1F, 0xFE, 0x3F, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x00,

0x30, 0x00, 0x00, 0x00, 0x00, // t
0x00, 0x00, 0xE0, 0x0F, 0xE0, 0x1F, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0xE0,

0x3F, 0xE0, 0x3F, 0x00, 0x00, // u
0x00, 0x00, 0x60, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x38, 0x00, 0x1E, 0x80, 0x07, 0xE0,

0x01, 0x60, 0x00, 0x00, 0x00, // v
0x00, 0x00, 0xE0, 0x07, 0xE0, 0x1F, 0x00, 0x38, 0x00, 0x1C, 0xE0, 0x0F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0xE0,

0x1F, 0xE0, 0x07, 0x00, 0x00, // w
0x00, 0x00, 0x60, 0x30, 0xE0, 0x38, 0xC0, 0x1D, 0x80, 0x0F, 0x00, 0x07, 0x80, 0x0F, 0xC0, 0x1D, 0xE0, 0x38, 0x60,

0x30, 0x00, 0x00, 0x00, 0x00, // x
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xF0, 0x40, 0xC0, 0x73, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x30,

0x00, 0x00, 0x00, 0x00, 0x00, // y
0x00, 0x00, 0x60, 0x30, 0x60, 0x38, 0x60, 0x3C, 0x60, 0x36, 0x60, 0x33, 0xE0, 0x31, 0xE0, 0x30, 0x60, 0x30, 0x20,

0x30, 0x00, 0x00, 0x00, 0x00, // z
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x01, 0xFC, 0x1F, 0x7E, 0x3F, 0x07, 0x70, 0x03, 0x60, 0x03, 0x60, 0x03,

0x60, 0x00, 0x00, 0x00, 0x00, // {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7F, 0x7E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, // |
0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x03, 0x60, 0x03, 0x60, 0x07, 0x70, 0x7E, 0x3F, 0xFC, 0x1F, 0xC0, 0x01, 0x80,

0x00, 0x00, 0x00, 0x00, 0x00, // }
0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x10, 0x00, 0x18, 0x00, 0x0C,

0x00, 0x04, 0x00, 0x00, 0x00, // ->
0x00, 0x00, 0x00, 0x0F, 0x80, 0x0F, 0xC0, 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x60, 0x0C, 0xC0, 0x0C, 0x80,

0x0F, 0x00, 0x0F, 0x00, 0x00  // <-
};

const uint8_t Font_6x8[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (space)
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, // !
0x00, 0x07, 0x00, 0x07, 0x00, 0x00, // "
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, // #
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, // $
0x23, 0x13, 0x08, 0x64, 0x62, 0x00, // %
0x36, 0x49, 0x55, 0x22, 0x50, 0x00, // &
0x00, 0x05, 0x03, 0x00, 0x00, 0x00, // '
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, // (
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, // )
0x08, 0x2A, 0x1C, 0x2A, 0x08, 0x00, // *
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, // +
0x00, 0x50, 0x30, 0x00, 0x00, 0x00, // ,
0x08, 0x08, 0x08, 0x08, 0x08, 0x00, // -
0x00, 0x30, 0x30, 0x00, 0x00, 0x00, // .
0x20, 0x10, 0x08, 0x04, 0x02, 0x00, // /
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, // 0
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, // 1
0x42, 0x61, 0x51, 0x49, 0x46, 0x00, // 2
0x21, 0x41, 0x45, 0x4B, 0x31, 0x00, // 3
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, // 4
0x27, 0x45, 0x45, 0x45, 0x39, 0x00, // 5
0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00, // 6
0x01, 0x71, 0x09, 0x05, 0x03, 0x00, // 7
0x36, 0x49, 0x49, 0x49, 0x36, 0x00, // 8
0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, // 9
0x00, 0x36, 0x36, 0x00, 0x00, 0x00, // :
0x00, 0x56, 0x36, 0x00, 0x00, 0x00, // ;
0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // <
0x14, 0x14, 0x14, 0x14, 0x14, 0x00, // =
0x41, 0x22, 0x14, 0x08, 0x00, 0x00, // >
0x02, 0x01, 0x51, 0x09, 0x06, 0x00, // ?
0x32, 0x49, 0x79, 0x41, 0x3E, 0x00, // @
0x7E, 0x11, 0x11, 0x11, 0x7E, 0x00, // A
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, // B
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, // C
0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, // D
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, // E
0x7F, 0x09, 0x09, 0x01, 0x01, 0x00, // F
0x3E, 0x41, 0x41, 0x51, 0x32, 0x00, // G
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, // H
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, // I
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, // J
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, // K
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, // L
0x7F, 0x02, 0x04, 0x02, 0x7F, 0x00, // M
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, // N
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, // O
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, // P
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, // Q
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, // R
0x46, 0x49, 0x49, 0x49, 0x31, 0x00, // S
0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, // T
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, // U
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, // V
0x7F, 0x20, 0x18, 0x20, 0x7F, 0x00, // W
0x63, 0x14, 0x08, 0x14, 0x63, 0x00, // X
0x03, 0x04, 0x78, 0x04, 0x03, 0x00, // Y
0x61, 0x51, 0x49, 0x45, 0x43, 0x00, // Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // [
0x02, 0x04, 0x08, 0x10, 0x20, 0x00, // "\"
0x41, 0x41, 0x7F, 0x00, 0x00, 0x00, // ]
0x04, 0x02, 0x01, 0x02, 0x04, 0x00, // ^
0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // _
0x00, 0x01, 0x02, 0x04, 0x00, 0x00, // `
0x20, 0x54, 0x54, 0x54, 0x78, 0x00, // a
0x7F, 0x48, 0x44, 0x44, 0x38, 0x00, // b
0x38, 0x44, 0x44, 0x44, 0x20, 0x00, // c
0x38, 0x44, 0x44, 0x48, 0x7F, 0x00, // d
0x38, 0x54, 0x54, 0x54, 0x18, 0x00, // e
0x08, 0x7E, 0x09, 0x01, 0x02, 0x00, // f
0x08, 0x14, 0x54, 0x54, 0x3C, 0x00, // g
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, // h
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, // i
0x20, 0x40, 0x44, 0x3D, 0x00, 0x00, // j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // k
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, // l
0x7C, 0x04, 0x18, 0x04, 0x78, 0x00, // m
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, // n
0x38, 0x44, 0x44, 0x44, 0x38, 0x00, // o
0x7C, 0x14, 0x14, 0x14, 0x08, 0x00, // p
0x08, 0x14, 0x14, 0x18, 0x7C, 0x00, // q
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, // r
0x48, 0x54, 0x54, 0x54, 0x20, 0x00, // s
0x04, 0x3F, 0x44, 0x40, 0x20, 0x00, // t
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, // u
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, // v
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, // w
0x44, 0x28, 0x10, 0x28, 0x44, 0x00, // x
0x0C, 0x50, 0x50, 0x50, 0x3C, 0x00, // y
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, // z
0x00, 0x08, 0x36, 0x41, 0x00, 0x00, // {
0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, // |
0x00, 0x41, 0x36, 0x08, 0x00, 0x00, // }
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, // ->
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, // <-
};

const uint8_t Segment_25x40[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00,

0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00,

0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char /
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xF7, 0xFF, 0x07, 0xE0, 0xFF, 0xE3, 0xFF,

0x03, 0xC4, 0xFF, 0xC1, 0xFF, 0x11, 0x8C, 0xFF, 0x80, 0xFF, 0x18, 0x1C, 0x7F, 0x00, 0x7F, 0x1C, 0x3C, 0x00, 0x00,

0x00, 0x1E, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00,

0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C,

0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x3C, 0x00, 0x00, 0x00, 0x1E, 0x1C, 0x7F, 0x00, 0x7F, 0x1C,

0x8C, 0xFF, 0x80, 0xFF, 0x18, 0xC4, 0xFF, 0xC1, 0xFF, 0x11, 0xE0, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0xFF, 0xF7, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00,

0x80, 0xFF, 0x80, 0xFF, 0x00, 0xC0, 0xFF, 0xC1, 0xFF, 0x01, 0xE0, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0xFF, 0xF7, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF,

0x03, 0x04, 0x00, 0xC0, 0xFF, 0x11, 0x0C, 0x00, 0x88, 0xFF, 0x18, 0x1C, 0x00, 0x1C, 0x7F, 0x1C, 0x3C, 0x00, 0x3E,

0x00, 0x1E, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00,

0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C,

0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x1C, 0x7F, 0x1C, 0x00, 0x1C,

0x8C, 0xFF, 0x08, 0x00, 0x18, 0xC4, 0xFF, 0x01, 0x00, 0x10, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0xF0, 0xFF, 0x07, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 2
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x08, 0x00, 0x18, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x3C, 0x00, 0x3E,

0x00, 0x1E, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00,

0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C,

0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x1C, 0x7F, 0x1C, 0x7F, 0x1C,

0x8C, 0xFF, 0x88, 0xFF, 0x18, 0xC4, 0xFF, 0xC1, 0xFF, 0x11, 0xE0, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0xFF, 0xF7, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 3
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00,

0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x3E,

0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00,

0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00,

0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0x7F, 0x00,

0x80, 0xFF, 0x88, 0xFF, 0x00, 0xC0, 0xFF, 0xC1, 0xFF, 0x01, 0xE0, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0xFF, 0xF7, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 4
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00,

0x00, 0xC4, 0xFF, 0x01, 0x00, 0x10, 0x8C, 0xFF, 0x08, 0x00, 0x18, 0x1C, 0x7F, 0x1C, 0x00, 0x1C, 0x3C, 0x00, 0x3E,

0x00, 0x1E, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00,

0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C,

0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x1C, 0x00, 0x1C, 0x7F, 0x1C,

0x0C, 0x00, 0x88, 0xFF, 0x18, 0x04, 0x00, 0xC0, 0xFF, 0x11, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0xF0, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 5
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xF7, 0xFF, 0x07, 0xE0, 0xFF, 0xE3, 0xFF,

0x03, 0xC0, 0xFF, 0xC1, 0xFF, 0x11, 0x80, 0xFF, 0x88, 0xFF, 0x18, 0x00, 0x7F, 0x1C, 0x7F, 0x1C, 0x00, 0x00, 0x3E,

0x00, 0x1E, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x00,

0x3E, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0x00,

0x00, 0x3E, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x7F, 0x1C,

0x00, 0x00, 0x88, 0xFF, 0x18, 0x00, 0x00, 0xC0, 0xFF, 0x11, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0xF0, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 6
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00,

0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00,

0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C,

0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x7F, 0x00,

0x8C, 0xFF, 0x80, 0xFF, 0x00, 0xC4, 0xFF, 0xC1, 0xFF, 0x01, 0xE0, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0xFF, 0xF7, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 7
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xF7, 0xFF, 0x07, 0xE0, 0xFF, 0xE3, 0xFF,

0x03, 0xC4, 0xFF, 0xC1, 0xFF, 0x11, 0x8C, 0xFF, 0x88, 0xFF, 0x18, 0x1C, 0x7F, 0x1C, 0x7F, 0x1C, 0x3C, 0x00, 0x3E,

0x00, 0x1E, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00,

0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C,

0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x1C, 0x7F, 0x1C, 0x7F, 0x1C,

0x8C, 0xFF, 0x88, 0xFF, 0x18, 0xC4, 0xFF, 0xC1, 0xFF, 0x11, 0xE0, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0xFF, 0xF7, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 8
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00,

0x00, 0xC4, 0xFF, 0x01, 0x00, 0x00, 0x8C, 0xFF, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x1C, 0x00, 0x00, 0x3C, 0x00, 0x3E,

0x00, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00,

0x3E, 0x00, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x00, 0x7C,

0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x00, 0x1C, 0x7F, 0x1C, 0x7F, 0x00,

0x8C, 0xFF, 0x88, 0xFF, 0x00, 0xC4, 0xFF, 0xC1, 0xFF, 0x01, 0xE0, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0xFF, 0xF7, 0xFF,

0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 9
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x3C, 0x00, 0x00,

0x00, 0x1E, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00,

0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x7C,

0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x3C, 0x00, 0x00, 0x00, 0x1E, 0x1C, 0x00, 0x00, 0x00, 0x1C,

0x0C, 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // 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, 19: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, 00: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(USART1, USART_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_GPIOA, ENABLE);//a portu için clock
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //usart 1 clock

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_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(GPIOA, GPIO_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(USART1, USART_IT_RXNE, ENABLE);//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(USART1, USART_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, 00: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, 01: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, 01: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 - 21 Haziran 2015, 22: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 - 21 Haziran 2015, 22: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, 19: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, 19:24:32
kişisel ileti atabilirsin. :D
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: Sya - 11 Eylül 2015, 21: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 - 11 Eylül 2015, 21:56:08
Alıntı yapılan: Sya - 11 Eylül 2015, 21: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 - 11 Eylül 2015, 22:02:59
Eyvallah hocam :)
Başlık: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: M_B - 09 Mart 2018, 11:25:41
Merhabalar,
Burdaki tüm örnekleri keil ile yeniden düzenleyip derliyorum.
SPI örneğini derlerken şu şekilde hata alıyorum
Alıntı Yapssd1306.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 seg, uint8_t pag)
{
   uint8_t low_column, hig_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, 12:09:52
Merhabalar;
Fonksiyonu aşağıdaki gibi düzenleyince hata mesajı gitti.


void Oled_SetPointer(uint8_t seg, uint8_t pag)
{
   uint8_t low_column, hig_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, 13:16:57
Ansi C binary desteklemiyor muş.
Başlık: Ynt: Ynt: Baştan Sona STM32F0 Discovery Uygulamaları
Gönderen: baran123 - 09 Mart 2018, 19:16:41
Evet aynı derten bende muzdarip oldum hocam :)
Hex şeklinde yazınca düzeldi.