Hakan Kaya

ARM Uygulamaları – STM32F411 LED Yakma (Kütüphaneyle)

Selam. Bir önceki dersimizde herhangi bir kütüphaneye gerek duymadan registerlarla nasıl led yakıp söndürme yapabileceğimiz üzerinde durmuştuk.

Her defasında datasheetler arasında kaybolmamak için daha önceden yazılmış olan kütüphaneleri kullanabiliriz şimdi onları kullanarak LED yakıp söndürme çalışmamızı tekrarlayalım.

Kütüphaneleri olabildiğince temel seviyede tuttum. İleride bunları gruplayıp daha düzenli bir çalışma ortamı sağlayacağız. Ancak arkadaşlarımla STM32F4 üzerine çalışmalarda fark ettim ki ilk etap için oldukça zor ve karmaşık gözükmekte. Yavaş yavaş neyin ne olduğu anlayarak sürekli üst üste katarak ilerlemek daha iyi olacak gibi gözüküyor. Bu nedenle şuanlık olmazsa olmaz kütüphaneler ile işe başlayacağız. 


Öncelikle yeni bir IAR projesi açmakla işe başlıyoruz. Nasıl açılacağına dair hatırlatmaları burada yapmıştım.

Kartımıza uygun şekilde ayarlamaları yapıp bir kere çalışıp çalışmadığı teyit etmek için açılan boş main dosyasıyla debug yapıyoruz. Kart üzerinden debug sağlıklı şekilde başlatıldıysa kod yazmaya başlayabiliriz.

 

Kütüphaneleri indirmek için github linki burada. 

 

Öncelikle ihtiyacımız olan tek tek registerların tanımlandığı register kütüphanesi. Önceden “stm32f4xx.h” adındaki header dosyasına 7004 satır tek tek yazılmış.

İndirdiğimiz dosyanın;

~\STM32F4-Discovery_FW_V1.1.0\STM32F4-Discovery_FW_V1.1.0\Libraries\CMSIS\ST\STM32F4xx\Include

içerisinde bulunmaktadır. Header dosyasını referans göstermemiz yeterlidir. Bunun için proje paketine sağ tık yapıp Options‘dan > C/C++ Compiler bölümünden Preprocessor sekmesinde “Addional include directories” ‘a header dosyasının bulunduğu path yolunu kopyala-yapıştır yapmanız yeterlidir.

Defined symbols bölümünde ise USE_STDPERIPH_DRIVER ve STM32F4XX yazıyoruz.

Bunun hemen akabinde  Cortex-M4 Çekirdeği Çevresel Giriş Katmanı gibi kütüphanelerin header dosyalarına ihtiyaç duyacaktır. Bu dosyaları;

~\STM32F4-Discovery_FW_V1.1.0\STM32F4-Discovery_FW_V1.1.0\Libraries\CMSIS\Include

içerisinde bulabilirsiniz. Bu path’i de preprocesser’e ekliyoruz.


 

Bu işlemi hallettikten sonra ihtiyacımız olan 3 çevresel driver dosyalarımızı da proje içinize aktaracağız. Bunlar “misc, stm32f4xx_rcc, stm32f4xx_gpio” kütüphaneleridir.

misc.c source (kaynak kodlarının olduğu)  ve misc.h (header dosyasi) adında iki adet dosya ile birliktedir. Bu çeşitli fonksiyonları içerisinde bulunduran bir driver dosyasıdır.

misc.c ‘nin indirdiğimiz kütüphane dosyalarının içindeki adresi;

~\STM32F4-Discovery_FW_V1.1.0\STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4xx_StdPeriph_Driver\src içindedir.

misc.h ise;

~\STM32F4-Discovery_FW_V1.1.0\STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4xx_StdPeriph_Driver\inc içindedir

stm32f4xx_rcc.c ve stm32f4xx_rcc.h dosyalarında ise AHB1 busını açmamız için bize yardımcı olacak fonksiyonlar bulunmaktadır.

stm32f4xx_rcc.c ‘nin indirdiğimiz kütüphane dosyalarının içindeki adresi;

~\STM32F4-Discovery_FW_V1.1.0\STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4xx_StdPeriph_Driver\src içindedir.

stm32f4xx_rcc.h ise;

~\STM32F4-Discovery_FW_V1.1.0\STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4xx_StdPeriph_Driver\inc içindedir

stm32f4xx_gpio.c ve stm32f4xx_gpio.h dosyaları da kart üzerinde gpioların register adreslerinden mode’larına kadar port kullanımlarıyla ilgili fonksiyonları içinde barındıran bir başka kütüphanemizdir.

stm32f4xx_gpio.c ‘nin indirdiğimiz kütüphane dosyalarının içindeki adresi;

~\STM32F4-Discovery_FW_V1.1.0\STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4xx_StdPeriph_Driver\src içindedir.

stm32f4xx_gpio.h ise;

~\STM32F4-Discovery_FW_V1.1.0\STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4xx_StdPeriph_Driver\inc içindedir

 

Sonrasında bu kütüphaneleri STM32F4xx_StdPeriph_Driver adında grup oluşturup altına ekleyeceğiz.

 

Dosyaları isterseniz referans gösterin, isterseniz IAR proje çalışması yaptığımız klasörün içine atınız.

Projemize sağ tık yapıp > Add > Add Files yoluyla sadece “misc.c” ,“stm32f4xx_gpio.c” ve “stm32f4xx_rcc.c” uzantılı olanları ekleyelim. Yada tutup sürükleyebilirsiniz. Bu dosyaların header (.h) uzantılı olanları ise preprocessor‘a gösterilmelidir.

Bu işlemlerden sonra son basamak olarak çevresel driver kütüphaneleri kontrol eden header dosyası eklemeye geldik.

stm32f4xx_conf.h

Bu dosya Useful_Files_STM32F4 altında bulunur. Bu dosyayı proje çalışması yaptığınız klasöre kopyalamanız gerekmektedir. Çünkü üzerinde bazı değişiklikler yapacağız. Orjinal halinin bozulmasını istemeyiz.

Bu değişikliklerden bazıları eklediğimiz mikrokontroller driverlarının #include yorum satırlarını silmemiz olacaktır. Nasıl mı, aynen şöyle…

Tüm bu işlemleri başarılı şekilde yaptıysanız artık kod yazabilirsiniz.


Kod


/*******************************************************************************
* STM32F4 - LED Yakip Sondurma
* ------------------------------------------------------------------------------
* @author : Hakan Kaya
* @mail : mail@hakankaya.kim
* @date : 18.12.2016
* @brief : Kart uzerinde bulunan ledleri yakip söndürmek
* 
*******************************************************************************/

// Kütüphaneler
#include "stm32f4xx.h"
//#include "stm32f4xx_rcc.h" // system_conf.h icerisinden cagrildi
//#include "stm32f4xx_gpio.h" // system_conf.h icerisinden cagrildi

// Fonksiyon prototipleri
void canimDelayim(unsigned long zaman);
void GPIO_Hazirliklari(void);

// Main fonksiyonu
int main(void) {

 // GPIO islemlerinin oldugu fonksiyonun cagrilmasi
 GPIO_Hazirliklari();
 
 // Sonsuz dongu
 while (1) { 
 GPIO_SetBits(GPIOD, GPIO_Pin_All);
 canimDelayim(2000000);
 GPIO_ResetBits(GPIOD, GPIO_Pin_All);
 canimDelayim(2000000);
 }
 
 //return 0;
}

void canimDelayim(unsigned long zaman){
 while(zaman > 0){
 zaman--;
 }
}


void GPIO_Hazirliklari(void){ 
 // D portu icin RCC aktiflestirme
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
 
 // D portu icin pointer vektoru tanımlanması
 GPIO_InitTypeDef GPIO_D;
 
 // Port ayarlamalari
 GPIO_D.GPIO_Pin = GPIO_Pin_All; 
 GPIO_D.GPIO_Mode = GPIO_Mode_OUT;
 GPIO_D.GPIO_OType = GPIO_OType_PP;
 GPIO_D.GPIO_PuPd = GPIO_PuPd_NOPULL;
 GPIO_D.GPIO_Speed = GPIO_Speed_100MHz;
 
 // Vektorun tanimlanmasi
 GPIO_Init(GPIOD, &GPIO_D);
 
 
}


Video

 

 

Yapılan projenin tüm dosyaları için github linki ise burada.

Exit mobile version