İlk projemiz olarak led yakma uygulaması yapacağız. Proje dosyamızı oluşturarak işe başlıyoruz.
Project menüsünden New Project’i tıklayarak yeni projemizi oluşturmaya başlıyoruz.
Açılan pencereden projemize bir isim veriyoruz. Projenin oluşturulacağı yer olarak workspace varsayılan olarak kendiliğinden seçilmiş durumda. Yanda bulunan tiki kaldırarak projemizi istediğimiz bir konumda oluşturabiliriz. İlk projemiz olması sebebiyle ben varsayılan konumda bıraktım. Bu durumda workspace klasörü içerisinde projemiz ile aynı adı taşıyan proje klasörümüz oluşturulacak ve bütün kod dosyalarımız burada bulunacak. Next’i tıklayarak bir sonraki aşamaya geçiyoruz.
Bu aşamada çalışacağımız geliştirme kitini yada mikrokontrolörümüzü seçmemiz gerekiyor. NUCLEO kiti geliştirme kitlerinin arasında olmadığından chip seçeneğini seçip, next’e tıklıyoruz.
NUCLEO kitimizde STM32F401RE mikrokontrolörümüz bulunuyor. Fakat listede bulunmuyor. En yakın özellikli olarak STM32F401RC yi seçebiliriz. Sondaki harf mikrokontrolörün flash hafıza boyutunu belirtiyor. Şimdilik bütün hafızayı dolduracak büyüklükte uygulamalar geliştirmeyeceğimiz için bu çipi seçmemizde bir sakınca yok.
Karşımıza Repository penceresi çıkıyor. Bu aşamada kodumuzun derlenebilmesi için gerekli bazı komponentleri projemize eklememiz gerekiyor.
- C Library
- M4 CMSIS Core
- CMSIS BOOT
Komponentlerini seçiyoruz. Komponentin yanındaki kutucuğa tik attığımız anda kodlar otomatik olarak projemize ekleniyor.
Sağ tarafta bulunan help sekmesinde tıkladığımız komponent hakkında bilgiler gösteriliyor. Sol üst tarafta bulunan components sekmesinde ise eklediğimiz komponenler ile ilgili örnek kodlar var ise görebiliyoruz. Sol alt tarafta ise projemizi görüyoruz.
Componentleri ekledikten sonra Repository penceresinin en altında bulunan sekmelerden drivers sekmesini seçiyoruz.
Bu bölümde devre tasarımında sık kullanılan bazı donanımlar için hazır driver kodları bulunuyor. Mesela devrenize bir LCD ekran eklediyseniz buradan driver seçerek hızlıca projenizi geliştirebilirsiniz. Bizim bu aşamada herhangi bir donanım ihtiyacımız olmadığından burayı atlayarak others sekmesine geçiyoruz.
Burada kontrolcümüz içerisinde bulunan donanımlar için ST’nin hazırlamış olduğu kütüphane dosyaları bulunuyor. Buradan ihtiyacımız olan kütüphaneleri projemize ekliyoruz. Bu uygulamada sadece led yakıp-söndüreceğimiz için sadece GPIO ve RCC kütüphanelerini ekliyoruz.
Son olarak mikrokontrolörümüzün doğru çalışabilmesi için saat frekansı ayarlamalarını yapmamız gerekiyor. Proje ağacımızdaki coide tarafından otomatik olarak eklenmiş olan system_stm32f4xx.c dosyası saat frekansı ve PLL gibi ayarları barındırıyor. Bu dosyayı düzenlemede kolaylık olması amacıyla ST firması bizlere bir tool sunmuş. Bu toolu aşağıdaki linkten indirebilirsiniz.
STM32F4 Clock configuration tool
İndirdiğimiz exel dosyasını açtığımızda aşağıdaki gibi bir ekran çıkıyor. Kırmızı ile işaretlediğim kısımları sırası ile uygulamamız gerekiyor. İlk olarak konfigrasyon modunu uzman olarak ayarlayıp bütün seçenekleri aktif ediyoruz. İkinci kutucuk ile gösterilen kısımda osilatör seçimi yapılıyor. Kitimizde harici bir osilatör olmadığından dahili osilatör (HSI) seçiyoruz. Son olarak PLL değerlerini ayarladığımızda kontrolcümüzü maksimum saat frekansında çalıştırmak için gerekli olan bütün ayarlar yapılmış oluyor. GENERATE butonuna tıkladığımızda kod dosyamız exel dosyasının bulunduğu klasöre oluşturulmuş oluyor.
Oluşturduğumuz yeni system_stm32f4xx.c dosyasını proje klasörümüz içerisindeki cmsis_boot klasörünün içerisine yapıştırıyoruz.
NOT : CoIDE’nin otomatik olarak eklediği startup dosyası içerisinde SystemInit fonksiyonunu çağırmadığını farkettim. Bu sebeple PLL aktifleştirilmiyor ve kontrolcümüz direkt olarak dahili osilatör ile çalışıyor (16 MHz). Bu sorunu çözmek içim startup dosyasında iki ufak değişiklik yapmamız gerekiyor.
Proje ağacımızda ki startup_stm32f4xx.c dosyasını açıp SystemInit kelimesini arattığımızda aşağıda görüldüğü gibi SystemInit fonksiyon tanımının inaktif edildiği görülüyor. Satırın başındaki // silerek satırı aktifleştiriyoruz.
/*----------Function prototypes-----------------------------------------------*/ extern int main(void); /*!< The entry point for the application. */ //extern void SystemInit(void); /*!< Setup the microcontroller system(CMSIS) */ void Default_Reset_Handler(void); /*!< Default reset handler */ static void Default_Handler(void); /*!< Default exception handler */
İkinci olarak Default_Reset_Handler fonksiyonu içerisinde, main(); fonksiyon çağrısının hemen önüne SystemInit(); fonksiyon çağrısını ekliyoruz. Bu fonksiyon reset işleminin sonrasında çağırılan ilk fonksiyondur.
void Default_Reset_Handler(void) { /* Initialize data and bss */ unsigned long *pulSrc, *pulDest; /* Copy the data segment initializers from flash to SRAM */ pulSrc = &_sidata; for(pulDest = &_sdata; pulDest < &_edata; ) { *(pulDest++) = *(pulSrc++); } /* Zero fill the bss segment. This is done with inline assembly since this will clear the value of pulDest if it is not kept in a register. */ __asm(" ldr r0, =_sbss\n" " ldr r1, =_ebss\n" " mov r2, #0\n" " .thumb_func\n" "zero_loop:\n" " cmp r0, r1\n" " it lt\n" " strlt r2, [r0], #4\n" " blt zero_loop"); #ifdef __FPU_USED /* Enable FPU.*/ __asm(" LDR.W R0, =0xE000ED88\n" " LDR R1, [R0]\n" " ORR R1, R1, #(0xF << 20)\n" " STR R1, [R0]"); #endif SystemInit(); /* Call the application's entry point.*/ main(); }
Hepsi bu kadar. Bu aşamada projemizi oluşturmuş, gerekli kütüphane dosyalarını eklemiş ve saat frekansını ayarlamış durumdayız. Artık main dosyamızı açıp uygulama kodlarımızı yazmaya başlayabiliriz.