12
STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 1 - Not: Bu dosya web sitemde 4 parça halinde yayınladığım STM32 Discovery ile ilgili yazımın tek parça haline getirilmii0INK1FKE ĐjKIKN1LOEE0INK1FKEeĐjF1I1ÜKKEkĐĐLNF1OLElĐFIV11ÜEiĐVIL0L0ÜEdĐjOIV0NOFEiĐVIL0L0ÜErĐĐ000LKE siteme bakabilirsiniz. Coo0INK1FKEkĐĐLN1LÜOEuĐ0ILFN1ÜEnĐ0I01LN0E ĐjKIKN1LO http://www.coskuntasdemir.net STM32 Discovery ile ilk adımlar Daha önceki yazılarımda STM32 Discovery kartını tanıtmıı\fAARRAGtIO’’V”RRGıI\fjjRCAGmI“fj\’’\G.IORfCR’VV VfR”VVjGuIOVfA art ile uğraa\fAAA”CGıI\fjjAA\GyIOVf\A’j’jGoI“fj”’”AGrI’ffC“AGuIO’CfjC\RGmI“fjCCC. Çalıı\fAAAV“GmIO’Vf\VC’GaIAfVj“\\GlI’f\“VVjGaIA izlerle paylaa\fAARRAGaIO”f“AV’’cağım. Burada Genel IDE kullanımı, mikrodenetleyici birimleri gibi konulara girmeyeceğim. O yüzden bu temel konuları bildiğinizi farz ederek devam edeceğim. Kartı programlamak için Keil firmasının MicroVision IDE yazılımını tercih ettim. Keil’in sitesinden bu yazılımın deneme versiyonu bir form doldurulacak ücretsiz indirilebiliyor. Kurulumu yaptıktan sonra “C:\Keil\ARM\Boards\ST\STM322ORfCAj\\GDIOVf\VC””GiI\fjjRCAGsI\fAAAV“GcI’fAV’A’GoI“fj”’”AGvIOCf””VCGeIO’fARjj’GrI’ffC“AG öründeki Blinky projesini açıp kodları incelemeye baa\fAAA”CGlI’f\“VVjGaIAfVj“\\GyIOVf\A’j’jGaIAfVj“\\GbIO’RfACCCilirsiniz. Kartın üzeride STTORfCAj\\GLIOVfRVjVVGiI\fjjRCAGnIOVfAj““”GkIO“fARCC“G IO“VAfR””GDIOVf\VC””GeIO’fARjj’GbIOCf’j’jCGuIO . Yani USB üzerinden karta yazılım atıp, hata ayıklama ii\fAAA”CGlI’f\“VVjGeIO’fARjj’GmI“fjCCCleri yapabilmek mümkün. Đlk denemelerimde debu gger’ı çalıı\fAARRAGtIOCffAR\GıI\fjjRCAGrIO’’fAAR’GaIAfVjV”’GmI“fjCC” da Keil forumlarında STTORfCAj\\GLIOVfRVjVVGiI\fjjRCAGnIOVfAj““”GkIO“fARCC“G IOAfAA”RGiI\fjjRCAGçI’fAV’A’GiI\fjjRCAGnIOVfAj“ asının indirilmesi gerektiğinin söylendiğini gördüm. http://www.keil.com/support/docs/3549.htm Linkteki dosyayı indirip C:\Keil\ klasörüne atmanız gerekiyor (ARM klasörünün üzerine yazmanız gerekiyor). https://www.keil.com/support/attachment/3549.htm Ayrıca ST firmasının ST Link Utility adlı yazılımını da buradan indirebilirsiniz. http://www.st.com/internet/evalboard/product/219866.jsp Bu yazılımla ii\fAAAV“GlI’f\“VVjGeIO’fARjj’GmI“fjCC”GcIO’’f”CjAGiI\fjjRCAGnIOVfAj““”GiI\fjjRCAGnIOVfAj“”G IOC“f“A\”GfIOCf ogramlama gibi ii\fAARRAGlI’f\“VVjGeIO’fARjj’GmI“fjCC”GlI’f\“VVjGeIO’fARjj’G Target” menüsünden Connect” seçeneğini seçtiğinizde eğer bir problem yoksa STORfCR’VVLink aracı kartı tanıyacaktır. Sağ üstte ii\fAAA”CGlI’f\“VVjGeIO’fARjj’GmI“fjCCCcimizin ismini göreceğiz.

Stm32 discovery ile ilk_adimlar

Embed Size (px)

DESCRIPTION

STM32 Discovery kartı'na giriş

Citation preview

Page 1: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 1 -

Not: Bu dosya web sitemde 4 parça halinde yayınladığım STM32 Discovery ile ilgili yazımın tek parça

haline getirilmi eklidir. Diğer yazılarım için web siteme bakabilirsiniz. Co kun TA DEMĐR http://www.coskuntasdemir.net

STM32 Discovery ile ilk adımlar

Daha önceki yazılarımda STM32 Discovery kartını tanıtmı tım. u sıralar yüksek lisans dersim için bu kart ile uğra ıyorum. Çalı malarımda edindiğim tecrübeleri sizlerle payla acağım.

Burada Genel IDE kullanımı, mikrodenetleyici birimleri gibi konulara girmeyeceğim. O yüzden bu temel konuları bildiğinizi farz ederek devam edeceğim.

Kartı programlamak için Keil firmasının MicroVision IDE yazılımını tercih ettim. Keil’in sitesinden bu yazılımın deneme versiyonu bir form doldurulacak ücretsiz indirilebiliyor. Kurulumu yaptıktan sonra “C:\Keil\ARM\Boards\ST\STM32 Discovery\Blinky” klasöründeki Blinky projesini açıp kodları incelemeye ba layabilirsiniz.

Kartın üzeride ST Link Debugger ile beraber geliyor. Yani USB üzerinden karta yazılım atıp, hata ayıklama i lemleri yapabilmek mümkün. Đlk denemelerimde debugger’ı çalı tıramadım. Google’dan yaptığım aramalarda Keil forumlarında ST Link için yeni bir sürücü dosyasının indirilmesi gerektiğinin söylendiğini gördüm.

http://www.keil.com/support/docs/3549.htm

Linkteki dosyayı indirip C:\Keil\ klasörüne atmanız gerekiyor (ARM klasörünün üzerine yazmanız gerekiyor).

https://www.keil.com/support/attachment/3549.htm

Ayrıca ST firmasının ST Link Utility adlı yazılımını da buradan indirebilirsiniz.

http://www.st.com/internet/evalboard/product/219866.jsp

Bu yazılımla i lemcinin flash belleğini silme ve programlama gibi i lemleri yapabiliyoruz. “Target” menüsünden “Connect” seçeneğini seçtiğinizde eğer bir problem yoksa ST Link aracı kartı tanıyacaktır. Sağ üstte i lemcimizin ismini göreceğiz.

Page 2: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 2 -

imdi Keil’deki projeyi incelemeye devam edelim. Sol taraftaki “project” bölümünde projedeki dosyalar görünüyor.

“Startup” klasörünün altında bulunan dosyalarda i lemci reset anından itibaren ilk çalı maya ba ladığında i leteceği komutlar bulunuyor. “startup_stm32f10x_ld_vl.s” adlı dosyada assembly komutlarıyla kesme vektörlerinin ayarlanması ve yığın bellek(stack) boyutları ataması vs… yapılıyor. Ardından “system_stm32f10x.c” dosyasındaki SystemInit fonksiyonu çağırılıyor. Bu fonksiyonla da sistem saat frekansı ayarlanılıyor. Bu dosyayla imdilik bir i imiz olmayacak. Bütün bu i lemler tamamlandığında main() fonksiyonu çağırılıyor. Bildiğiniz gibi C programlarında bütün her ey “main” fonksiyonu içerisinde gerçekle mektedir.

Buradan sonra i lemciyi ve main içerisinde çağırılan fonksiyonları tanımaya devam edeceğiz…

Page 3: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 3 -

STM32 Discovery ile ilk adımlar 2:

Önceki bölümde STM32 Discovery kartı için Keil geli tirme ortamında “Blinky” projesini incelemeye ba lamı tık. imdi de kartın üzerindeki STM32F100RB i lemcisini tanımaya ba layalım:

Đ lemciye ait web sitesi: http://www.st.com/internet/mcu/product/216844.jsp

STM’nin sitesindeki bilgilerde i lemcinin temel özellikleri:

• 32 Bit ARM Cortex M3 çekirdek: 24 Mhz maksimum hız • Bellek: 128 Kb Flash, 8 Kb SRAM • 12 bit ADC • 2 Adet 12 bit DAC • 6 adet Timer • 2 SPI, 2 I2C, 3 USART haberle me birimi • 51 adet IO • CRC hesaplama ünitesi • 7 Kanal DMA • Serial Wire Debug (SWD) ve JTAG arabirimi

ARM Cortex M3: Daha önceki yazılarımda ARM mimarisi ile ilgili kısaca bilgi vermi tim. Cortex serisi ARM firmasının son yıllarda geli tirmeye ba ladığı bir seridir. M3 serisi genel olarak daha önceki ARM7 serisinin yerini almaya ba lamı , 8 16 bit i lemcilerin kullanıldığı projelerde daha yüksek performansı aynı dü ük güç tüketimiyle sağlamayı amaçlayan bir seridir. Cortex M3 ile ilgili ayrıntılı bilgiyi referans dökümanında bulabilirsiniz.

http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337e/DDI0337E_cortex_m3_r1p1_trm.pdf

Page 4: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 4 -

STM32F100RB: Đ lemcimizin veri dökümanında i lemcimizin çevre birimleri ve çekirdeğinin blok diyagramı bulunmaktadır:

Đ lemcinin dökümanları oldukça uzun ve karma ık gibi görünebilir. Ama ba ta da söylediğim gibi en basitten ba layıp adım adım gitmekte fayda var. Elimizde hazır bir donanım olduğundan direk olarak birçok ayrıntıyı imdilik atlayabiliriz.

CMSIS: Projenin kodlarını incelemeye ba lamadan önce CMSIS (Cortex Microcontroller Interface Standard) nedir bunu inceleyelim. CMSIS, ARM firması tarafından farklı firmalar tarafından üretilen bütün Cortex serisi çekirdeğe sahip i lemciler için ortak bir yazılım kütüphanesinin adıdır. CMSIS donanım birimleri ile uygulama yazılımı arasındaki ara soyutlama katmanını (hardware abstraction layer) olu turuyor. Böylelikle üreticilere ve geli tirme araçlarına bağlı kalmadan genel olarak Cortex çekirdeğe sahip i lemciler için yazılım bile enleri olu turmak mümkün oluyor ve yazılım ta ınabilirliği, yeniden kullanım sağlanıyor. CMSIS ile ilgili daha ayrıntılı bilgiyi ARM ve Keil firmalarının sitelerinde bulabilirsiniz.

http://www.arm.com/products/processors/cortex m/cortex microcontroller software interface standard.php

http://www.keil.com/support/man/docs/gsac/GSAC_CMSISoverview.htm

Projede butonlar ve LED çıkı ları kullanıldığından önce ilgili kaydedicilerle IO portları ayarlarının yapılması gerekiyor. Đ lemcimizde her bir çevre biriminin saat frekansı kontrol edilebiliyor. Böylelikle kullanılmayan çevre birimleri kapatılarak güç tasarrufu sağlanıyor.

Page 5: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 5 -

Bir LED yakıp söndüren yazılım bile ne kadar karma ık diye dü ünüyor olabilirsiniz. Ama unutmayın “her ey bir LED’i yakmakla ba lar”.

STM32 Discovery ile Đlk adımlar 3:

RESET VE SAAT KONTROL ÜNĐTESĐ (RCC) Bu üniteyle ilgili çok fazla ayrıntı var. imdilik sadece IO birimlerinin ayarlarını inceleyeceğiz. Đ lemcimiz üzerinde her bir çevrebiriminin saat kaynağı ayrı ayrı kontrol edilebiliyor. Böylelikle kullanılmayan çevrebirimleri kapalı tutarak güç tüketimi minimum seviyede tutabiliyoruz. Aynı zamanda her bir çevrebirimi ayrı ayrı ba langıç durumuna(reset) getirilebiliyor.

RCC_APB1RSTR, RCC_APB2RSTR kaydedicileri çevrebirimlerini resetlemek için kullanılıyor.

RCC_AHBENR, RCC_APB2ENR, RCC_APB1ENR kaydedicileri çevrebirimlerinin saat kaynaklarını kontrol etmek için kullanılıyor. Đ lemcimizin IO hatlarını kullanabilmek için öncelikle IO modüllerinin saat giri lerini aktif hale getirmemiz lazım. Onun ardından IO yönlerini (giri çıkı ) ayarlamalıyız.

Giri çıkı birimlerinin saat giri leri RCC_APB2ENR kaydedicisiyle ayarlanıyor:

Örneğin C portunu aktif hale getirmek istediğimizde:

RCC->APB2ENR |= 1 << 4

satırıyla APB2ENR kaydedicisinin 4.bitini 1 yapıyoruz. Ardından IO portunun giri çıkı yön ayarlarını yapacağız. Önce IO portlarını tanıyalım:

Page 6: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 6 -

IO Portları:

Đ lemcinin IO portları PA ,PB, PC, PD, PE olarak sıralanıyor. Discovery kartında A,B,C,D portları bulunuyor. Her bir portta 16 pin var. Portlarla ilgili i lemler 32 bitlik kaydedicilerle yapılıyor. Portlar Analog veya dijital giri çıkı olarak ayarlanabiliyor. Aynı zamanda Open drain, push pull çıkı tipleri de mevcut.

Port Konfigurasyon Kaydedicisi (dü ük): GPIOx_CRL (x burada A,B,C,D,E portlarından birisini temsil ediyor) Port Konfigurasyon Kaydedicisi (yüksek): GPIOx_CRH (x burada A,B,C,D,E portlarından birisini temsil ediyor)

Dü ük kaydedici ile porta ait 1 8 arası pinlerin, yüksek kaydedici ile porta ait 9 16 nolu pinlerin ayarlamaları yapılıyor.

Bu kaydediciler ile ilgili portlara ait pinlerinin yön ayarları yapılıyor. Her bir pine ait 2 bit CNF, 2 bit Mode olmak üzere 4 bitlik değer bulunuyor. CNF grubu pinin giri – çıkı tipini belirlerken, Mode grubu çıkı olarak ayarlanan pinlerin IO çıkı hızı seçimini yapmaya yarıyor.

GPIOx_CRL Kaydedicisi:

CNFy[1:0] (y = 0…7)

00: Analog giri 01: Bo ta giri (reset sonrası bu durumda oluyor) 10: pull up / pull down giri 11: rezerve(kullanılmıyor)

MODEy[1:0] mode bitleri (y: 0…7)

Page 7: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 7 -

00: Giri modu (reset sonrası bu durumda) 01: çıkı modu maksimum 10 mhz 10: çıkı modu maksimum 20 mhz 11:çıkı modu maksimum 50 mhz

GPIOx_CRH Kaydedicisi:

CNFy[1:0] (y = 8…15)

00: Analog giri 01: Bo ta giri (reset sonrası bu durumda oluyor) 10: pull up / pull down giri 11: rezerve(kullanılmıyor)

MODEy[1:0] mode bitleri (y: 8…15)

00: Giri modu (reset sonrası bu durumda) 01: çıkı modu maksimum 10 mhz 10: çıkı modu maksimum 20 mhz 11:çıkı modu maksimum 50 mhz

Port Giri kaydedicisi (GPIOx_IDR) (x=A..G)

Bu kaydedici ile portun giri değeri okunabilir. 0 15 arası bitlerin her biri ilgili pine ait giri değerini veriyor. Bu porta yazma i lemi yapılmıyor.

Port çıkı kaydedicisi (GPIOx_ODR) (x=A..G)

Bu kaydedici ile ilgili porta çıkı değeri atanabilmektedir. Bu kaydediciye bit eri imi yapılamıyor. Yani çıkı değerini 16 bit birden yazmak gerekiyor. Tek tek bitlere eri im GPIOx_BSRR kaydedicisiyle yapılıyor.

Page 8: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 8 -

Port bit set / reset kaydedicisi GPIOx_BSRR ( x = A…G)

Bu kaydedicinin ilk 16 biti ile ilgili portun 16 pin bitleri ayrı ayrı 1(set) yapılabiliyor. 17 32 bitleri ile de ilgili portun pinleri sıfırlanıyor. Eğer ilgili pine ait hem set hem reset biti 1 yapılırsa set durumunun önceliği var. Bu durumda ilgili pin 1 oluyor.

Port bit reset kaydedicisi GPIOx_BRR ( x = A…G):

Bu kaydedicinin ilk 16 biti ile ilgili portun 16 pin bitleri ayrı ayrı 0 (reset) yapılabiliyor.

Port Konfigurasyon Kilidi Kaydedicisi (GPIOx_LCKR) (x=A..G)

Bu kaydedici, giri çıkı portlarının ayarları bir kere yapıldıktan sonra bir daha yanlı lıkla deği tirilmesini önlemek için kilitlemeye yarıyor. Kilitleme mekanizması u ekilde çalı ıyor:

Konfigurasyonu kilitlenmek istenen pinlere ait LCKx biti set edilir. LCKK bitine sırasıyla u i lemler uygulanır: 1 Yazma, 0 yazma, 1 yazma. Kilidin aktif hale geçti ise sırasıyla 2

okuma i lemi yapıldığında 0 ve 1 değerleri okunacaktır.

Bu i lemler sonunda IO pinleri konfigurasyonu kilitlenmi olur ve ancak bir sonraki resetten sonra deği tirilebilir.

IO kullanımı için i lem adımlarını tekrar hatırlayacak olursak: 1 Đlgili IO portunun saat giri ini aktif hale getiriyoruz. (RCC_APB1ENR , RCC_APB2ENR ) 2 Đlgili IO portunun pinlerinin yön ayarlarını yapıyoruz (giri veya çıkı , GPIOx_CRL,GPIOx_CRH) 3 IO eri imi için ilgili kaydedicilere eri iyoruz ( GPIOx_IDR, GPIOx_ODR, GPIOx_BRR ,GPIOx_BSRR )

Buraya kadar STM32F100RB i lemcimizin IO portlarına ait kaydedicileri tanıdık. Bundan sonra Blinky projesinde bu kaydedicilerin nasıl kullanıldığını göreceğiz

Page 9: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 9 -

STM32 Discovery ile ilk adımlar 4 Blinky

imdi tekrar “blinky” projemize dönüyoruz. Bu program STM32 Discovery üzerinde yüklü olarak geliyor. Yaptığı i temel olarak kart üzerindeki LED’leri belirli aralıklarla yakıp söndürmek. USER1 butonuna basıldığında LED’lerin yanma sıraları durum deği tiriyor:

1. Durumda sadece LED3 yanıp sönüyor 2. Durumda sadece LED4 yanıp sönüyor 3. durumda hem LED3 hem LED4 yanıp sönüyor.

Bu projede BUTON1, LED3, LED4 kaynakları kullanıldığından bunlara ait giri çıkı birimlerinin ayarlarının yapılması gerekiyor.

Kart üzerindeki kaynakların bağlantıları u ekilde:

LED3 PORTC 9 LED4 PORTC 8 BUTON1 – PORTA 0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/*----------------------------------------------------------------------------

MAIN function

*----------------------------------------------------------------------------*/

int main (void) {

LED_Config();

BTN_Config();

SysTick_Config(SystemCoreClock / 100); /* Setup SysTick Timer (10ms) */

while(1) {

if (BTN_Pressed()) {

ledVal += 1;

if (ledVal > 3) ledVal = 1;

}

if (ledBlink == 1) {

ledBlink = 0;

ledOn^= 1;

if (ledOn == 1)

LED_Out (ledVal); /* switch the LEDs on */

else

LED_Out (0); /* switch the LEDs off */

}

}

}

Page 10: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 10 -

main() fonksiyonu:

Bildiğiniz gibi bütün C programları main() fonksiyonuyla ba lar. Burada da en ba ta LED_Config() ve BTN_Config() fonksiyonları çağırılıyor. Bu fonksiyonlarda LED’ler ve buton için port giri ayarları yapılıyor. Daha sonra programımız sonsuz döngü içerisine giriyor (super loop). Burada BTN_Pressed() fonkiyonuyla her bir butona basılma durumunda ledVal durum deği keni 1′er artırılarak, 1,2,3 değerlerinde dola ıyor. Bu durumları en ba ta listeledik.

ledBlink deği keni her 1 olduğunda (System Handler fonksiyonu içerisinde yapılıyor) LED çıkı larına dönü ümlü olarak 1 veya 0 değeri veriliyor. ledval deği keninin değerine göre LED’lerin hangilerinin yanacağına LED_out fonksiyonunda karar veriliyor.

1

2

3

#define LED_BLINK_RATE 10 /* rate = LED_BLINK_RATE * systick */

#define LED_NUM 2 /* Number of user LEDs */

const unsigned long led_mask[] = { 1UL<<8, 1UL<<9 }

1

2

3

4

5

6

7

/*----------------------------------------------------------------------------

Switch on LEDs

*----------------------------------------------------------------------------*/

__INLINE static void LED_On (uint32_t num) {

GPIOC->BSRR = led_mask[num]; /* Turn On LED */

}

1

2

3

4

5

6

7

/*----------------------------------------------------------------------------

Switch off LEDs

*----------------------------------------------------------------------------*/

__INLINE static void LED_Off (uint32_t num) {

GPIOC->BRR = led_mask[num]; /* Turn Off LED */

}

Daha önceki yazımda portlara ait BRR (bit reset register) kaydedicisi ile o porta ait pinlerin durumlarını deği tirebileceğimizi görmü tük. Burada LED_off fonksiyonuna verilen parametre ile ilgili pine ait çıkı değeri sıfırlanıyor. num değerinin aldığı 0 veya 1 değerine göre LED3 veya LED4 söndürülüyor.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

/*----------------------------------------------------------------------------

Function that outputs value to LEDs

*----------------------------------------------------------------------------*/

void LED_Out(uint32_t value) {

int i;

for (i = 0; i < LED_NUM; i++) {

if (value & (1<<i)) {

LED_On (i);

} else {

LED_Off(i);

}

}

}

Bu fonksiyonla LED’lerin yakılıp söndürülme durumları kontrol ediliyor. Fonksiyona parametre olarak verilen “value” değerine göre 3 durumdan biri gerçekle iyor:

Page 11: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 11 -

value == 1 ise LED3 yakılıyor LED4 söndürülüyor value == 2 ise LED4 yakılıyor LED3 söndürülüyor value == 3 ise LED3 ve LED4 yakılıyor

Aslında programda yapılmak istenen i e göre çok karma ık bir yapı kurulduğunu söylemek mümkün. Aynı i i ba ka ekilde çok daha az kod yazarak da gerçekle tirebilirsiniz.

1

2

3

4

5

6

7

8

9

/*----------------------------------------------------------------------------

configure Button pins

*----------------------------------------------------------------------------*/

__INLINE static void BTN_Config(void) {

RCC->APB2ENR |= 1<<2; /* Enable GPIOA clock */

GPIOA->CRL &= 0xFFFFFFF0; /* Configure the GPIO for BTNs */

GPIOA->CRL |= 0x00000008; /* Configure the GPIO for BTNs */

}

Burada BUTON1 pinine ait ayarlar yapılıyor. Yine pinin bulunduğu GPIOA portunun saat sinyali etkinle tirilip porta ait CRL kaydedisine butonu giri olarak ayarlayacak değer atanıyor.

1

2

3

4

5

6

7

8

/*----------------------------------------------------------------------------

Read Button pins

*----------------------------------------------------------------------------*/

__INLINE static uint32_t BTN_Get(void) {

return (GPIOA->IDR & 0x0001);

}

Bu fonksiyon sadece GPIOA portunun 1. pininin durumunu döndürüyor. Böylelikle butonun basılıp basılmadığını anlıyoruz.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

/*----------------------------------------------------------------------------

USER1Pressed

check if USER1 is pressed (unbounced).

*----------------------------------------------------------------------------*/

uint32_t BTN_Pressed (void) {

static uint32_t USER1KeyCount = 0, USER1KeyPressed = 0;

if (USER1KeyPressed) {

if ((BTN_Get() == 0 )) { /* Check if USER1 not pressed */

if (USER1KeyCount &lt; UNBOUNCE_CNT) USER1KeyCount++;

else {

USER1KeyPressed = 0;

USER1KeyCount = 0;

}

}

}

else {

if (!(BTN_Get() == 0 )) { /* Check if USER1 pressed */

if (USER1KeyCount < UNBOUNCE_CNT) USER1KeyCount++;

else {

USER1KeyPressed = 1;

USER1KeyCount = 0;

Page 12: Stm32 discovery ile ilk_adimlar

STM32 Discovery Kartı ile ilk adımlar – Co kun TA DEMĐR http://www.coskuntasdemir.net - 12 -

23

24

25

26

27

28

return (1);

}

}

}

return (0);

}

STM32 Discovery üzerinde bulunan mekanik butonlarda “bouncing” denilen bir durum gerçekle mektedir. Butona basıldığında çok kısa bir süre içerisinde mekanik kontaklar 1 ve 0 değeri arasında gidip gelmektedir. Bu durumda butona tam basıldığını anlamak için kısa bir bekleme süresi konulması gerekiyor. Bu i leme de “debouncing”* deniliyor. BTN_Pressed fonksiyonunda yapılan da i te tam olarak bu. Fonksiyon ba ında tanımlanan USER1KeyCount ve USER1KeyPressed deği kenleri fonksiyonun iç durumunun fonksiyondan çıkıldığında da saklanmasını sağlıyor. Eğer fonksiyon ilk çağırıldığında henüz butona ilk defa basılmı sa (USER1KeyPressed = 0 ise) butonun durumu tekrar okunuyor ( if ((BTN_Get() == 0 )) ). Bu arada butona basıldığında giri e 0, basılmadığında ise 1 uygulandığını belirteyim. Eğer butona giri inden sıfır değeri okunuyorsa USER1KeyCount değeri bir artırılıyor. Her fonksiyon giri inde aynı i lem tekrarlanarak USER1KeyCount değerinin belirli bir e ik değerine gelmesi sağlanarak (UNBOUNCE_CNT) gecikme olu turuluyor. Bu süre içerisinde buton mekanik olarak sönümlenmi oluyor ve kesin olarak butona basılıp basılmadığı anla ılıyor. “Debouncing” i lemi yapılmadığı takdirde durumlar arası geçi ler çok hızlı olacaktır. Fonksiyon sonuç olarak BUTONA BASILDI (1) veya BUTONA BASILMADI (0) değerini döndürüyor.

1

2

3

4

5

6

7

8

9

10

11

12

13

/*----------------------------------------------------------------------------

/*----------------------------------------------------------------------------

SysTick_Handler

*----------------------------------------------------------------------------*/

void SysTick_Handler (void) {

static uint32_t ticks;

if (ticks++ >= LED_BLINK_RATE) {

ticks = 0;

ledBlink = 1;

}

}

SysTick_Handler (System Tick Handler ) fonksiyonu aslında bir “kesme hizmet fonksiyonu”. Yani System Tick kesmesi olu tuğunda bu fonksiyon çağırılıyor. imdilik STM32 Kesmelerine çok girmeden basitçe açıklayayım: System Tick kesmesi ile belirli zaman aralıklarında çalı ması gereken eyler için kullanılabilen bir nevi “timer/ zamanlayıcı”. Daha sonra göreceğimiz main() fonksiyonunda System Tick için 10 ms’lik bir periyod belirleniyor. Yani SysTick_Handler fonksiyonu her bir 10 ms’de çağırılıyor. Dolayısıyla bunu zamanla ilgili i lemlerde kullanabiliyoruz.

Burada fonksiyon her çağırıldığında ticks deği keni 1 artırılıyor. Ticks deği keni LED_BLINK_RATE değerine ula tığında (buradaki değeri 10) ticks değeri sıfırlanıp ledBlink deği kenine 1 değeri atanıyor. Bu değer de ana fonksiyon içerisinde led yakıp söndürme i leminde kullanılıyor. LED’lerin yanıp sönme hızını LED_BLINK_RATE sabitiyle kontrol edebiliyoruz.

Basit bir LED yakıp söndüren programın bile bu kadar karma ık olması gözünüzü korkutmasın. Burada yapılan bütün i lemleri tam olarak anladığınızda C ile gömülü yazılım geli tirmenin temel konularını kavramı sınız demektir. Unutmayın “HER EY BĐR LED’Đ YAKMAKLA BA LAR”

*Jack Ganssle’ın “Switch Debouncing” konusuyla ilgili makalesini okumanızı tavsiye ederim: http://www.ganssle.com/debouncing.htm