STM32F3 Discovery ve STM32CubeMX ile Saat (Clock) Ayarı

Buraya kadar STM32F3 Discovery kartını kullanarak bir başlangıç yaptık ve temel giriş ve çıkış özelliklerinin neredeyse tamamını öğrendik. Öncelikle şunu bilmeniz gerekir ki hangi eğitim olursa olsun 1000 küsür sayfalık referans kılavuzunu ve yine bin küsür sayfalık kütüphane kılavuzunu ve yine yüzlerce sayfalık stüdyoya ait kılavuzları size anlatamaz. Çünkü bunları öğrenmek için yüzlerce saat gerekli olup on dakikalık Youtube videoları ile hiç öğrenilemez. O yüzden sizin de bu kılavuzları okuyup anlamaya çalışmanız ve sadece eğitim içerikleri ile ilerlememeniz gereklidir. Ben de elimdeki kaynaklardan dolayı bu bilgilerin tamamını veremeyeceğim.

İlk uygulamadan itibaren bizim karşımıza hazır bir proje çıkmakta ve bu projede de saat ayarlarını içeren bir fonksiyon bulunmaktaydı. Biz kalabalık olmasın diye bunu ayrı bir kütüphane dosyası gibi ayırıp programa #include ile dahil ettik. Fakat bu dosyadaki fonksiyonlardan hiç bahsetmedik. Bu fonksiyonların saat ayarları ile ilgili olduğu belliydi fakat bu ayarlamaları HAL kütüphanesi kullanıyorsak ayrı bir sürücü dosyası ile yapmamız gerekti.

Kısacası öğrenilmesi gereken pek çok şey olduğu için laf arasında değil ayrı bir başlık altında anlatmamız daha isabetli olurdu. Şimdi elimizden geldiği kadarıyla bu saat ayarlarını size anlatacağız.

Saat ayarlarını en başta STM32CubeMX programında ayrı bir sayfa halinde görmüştük. Bu program bize yapılabilecek en kolay ayarlamaları sunuyor ve hazır proje halinde bize veriyordu. Saat ayarlarını doğru bir şekilde yapmak için oldukça faydalı bir özellik olarak karşımıza çıkmakta.

Burada ön derecelendirici (prescaler) ayarlarının yanında osilatör seçimi ve osilatörlerin frekansını belirleme imkanımız da vardır. Bu hesaplamalara göre sağ tarafta AHB, FCLK, APB gibi saat kaynaklarının frekansı belirmektedir. Bu saat hızlarının sınırı aşıldığında program bize uyarı vermektedir. Burada saat hızı “şu birim şu kadar MHz olsun” diye değil ön derecelendiriciler ve osilatörler vasıtasıyla ayarlanmaktadır. Ayrıca bazı birimlerin saat kaynaklarını da seçme imkanımız bulunmaktadır. Örneğin Faz düzeltmeli döngü (PLL) saat kaynağını HSI (Yüksek Hızlı Dahili Osilatör) ya da HSE (Yüksek Hızlı Harici Osilatör) olarak seçebiliriz. System Clock Mux kısmında ise HSI, HSE ya da PLL çarpanından çıkan PLLCLK olarak saat kaynağı seçilebilir.

PLL biriminin bağlı bulunan osilatörden çok daha yüksek frekansları elde etmek için kullanıldığını söylemiştik. Örneğin 160MHz hızda çalışacak bir mikrodenetleyici için gidip 160MHz osilatör aramak anlamsız olacaktır. PLL ile bu iç kısımda çarpılıp daha yüksek hızlar elde edilebilir. Bazı mikrodenetleyicilerin saat hızı 400MHzlere kadar çıkabilmektedir. Biz STM32F3 serisini kullandığımız için saat konusunda biraz kısıtlanmış bulunuyoruz. Yalnızca 72MHz hız alabildiğimiz gibi belirli birimlerin de saat hızları F4 gibi denetleyicilere göre  kısıtlanmış durumdadır.

Programa daha dikkatli baktığımızda iki ana birimi fark edebiliriz. Bunlardan biri PLL diğeri ise sistem saat birimidir. Şimdi bu kısma daha yakından bakalım.

Burada Input Frequency adıyla harici osilatörün saat hızı belirtilmiştir. Buraya bağlayacağımız osilatörün saat hızını yazmamız gerekir. Eğer harici bir osilatör yoksa HSI diyerek 8MHz dahili osilatörü seçmeliyiz. PLL kaynağı kısmında HSI sabit olarak 2’ye bölünürken harici osilatörün bölünmesi bizim seçimimize bırakılmıştır. Hızlı olsun bölünmeden çalışsın dersek program bize hata verebilir. Çünkü asgari ve azami saat oranları bellidir ve bunları aşmamak gerekir. PLL kaynağı HSI ve HSE olmak üzere ikiye ayrıldıktan sonra PLL çarpanını seçmek bize bırakılmıştır. PLL çarpanı ile frekans çarpılır. Örneğin kaynaktan gelen frekansı ikiye bölerek PLL’ye gönderdik ve resimde görüldüğü gibi bu 12’ye çarpıldı. Elde edilen değer 48MHz olup USB birimini doğru bir şekilde beslemektedir. Eğer çarpanı 14 yaparsak frekans 56MHz olup USB birimini doğru besleyemeyecek ve resimdeki gibi hata verecektir.

Program bize USB frekansının sınırlarını söyleyip uyarı veriyor. STM32CubeMX programının sayesinde bu hatayı önceden fark edip gerekli düzeltmeyi yapabiliriz. Görüldüğü gibi USB birimi çok dar bir frekans aralığında çalışıyor. Bunu USB prescaler ile ayarlayabiliriz. Aynı zamanda PLL’ye giden saat sinyalinin ön derecelendiricisi de bunda yardımcı olmaktadır. Şimdi yukarıda 48MHz olan sistem frekansını azami değer olan 72MHz’e çıkaralım. Aynı zamanda da USB’ye giden saat sinyalinin de doğru olmasına dikkat edelim. Bunun için USB ön derecelendiricisini kullandığımız gibi harici osilatörden gelen saat sinyaline de müdahale etmek gerekir.

Görüldüğü gibi yukarıdaki değerlerden çok farklı olsa da hesaplamalarla yine USB birimine 48MHz sinyal gitmektedir. Burada USB prescaler özelliğinin görevi büyüktür. Sistem saatimiz 72MHz oldu ve program bize uyarı vermedi. Bu hesaplamada bize yardımcı olacak bir eleman da farklı değerlerdeki harici osilatörlerdir. Buraya kadar bütün seçeneğimiz bu kadardı çünkü standart donanım tanımlaması ile programı başlattık. Eğer farklı birimleri etkinleştirseydik saat seçeneklerimiz artmış olacaktı. Gördüğünüz silik kısımlar etkin olmayan birimleri ifade etmektedir. Örneğin ADC’yi aktif ettiğimizde resimde gördüğünüz ADC 1,2 Prescaler aktif olup ADC birimine giden saat sinyalini ayarlamaktadır. Şimdilik kafamızın karışmaması için biz en temelden anlatmaya devam edelim.

Standart ayarda 48MHz olan sistem saati çeşitli birimlere dağılır ve bu birimlere dağılırken belli işlemlere tabi tutulabilir. Örneğin dijital giriş ve çıkış birimi ve zamanlayıcılar bu sistem saatinden aldıkları saati kendileri ayrı olarak kullanır. Fark ederseniz AVR’de olduğu gibi sistem saati etkinleşince giriş ve çıkış birimi etkinleşmiyordu. Her giriş ve çıkış portu için ayrı bir saati etkinleştiriyorduk. Aşağıdaki resimde bu birimlere giden saat hızları gösterilmiştir.

 

Gördüğünüz gibi sistem saatinden çıkan saat sinyali AHB ön derecelendiricisine tabi tutulup genel bir bölme işleminden geçer. Ondan sonra FCLK dediğimiz çekirdek saatine doğrudan gider. Diğer birimlere giderken de ayrışıp belli işlemlerden geçmektedir. En sağda ise sonuç kısmını görmekteyiz. Örneğin APB1 çevre biriminin saat hızı 24MHz olarak gösterilmektedir. Bu birimlerin asgari ve azami saat değerlerinin olduğunu ve dengeyi sağlamak gerektiğimizi unutmayalım.

Sayfa ilk defa karşımıza çıktığında oldukça karmaşık görünen diyagramı böylece çözmüş olduk. Eğer yazmaçlarla anlatmaya başlasaydık anlatmamız çok daha zor olacaktı. PIC ve AVR’de hiç olmadığı kadar karmaşık bir saat yapısının olduğunu rahatlıkla söyleyebiliriz. Fakat çözdükten sonra gözümüze hiç o kadar da karmaşık gelmemektedir. Bu saat ayarı bir programın arayüzünden ibaret değildir elbette. Daha sonra yazılımsal ve donanımsal olarak ayrıntısıyla inceleyeceğiz.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.