STM32 HAL Kütüphanesi ile Saat (Clock) Ayarı -2-

STM32 HAL kütüphanesi ile saat ayarı yapmayı anlatmaya devam ediyoruz. Önceki makaleyi buradan okuyabilirsiniz. Şimdi kaldığımız yerden devam edelim.

Burada dikkat ederseniz OscInitStruct yapısının bir değişkenine değil OscInitStruct yapısında tanımladığımız PLL yapısının PLLState değişkenine değer atadığımızı görebilirsiniz. PLL yapısını yapı değişkeni olarak aldığını kütüphane kılavuzunda görebiliriz.

Şimdi PLLState değişkeninin hangi değerleri alabildiğine bakalım. PLL yapısının PLL birimi ile ilgili parametreleri aldığını biliyoruz. PLLState de adından anlaşılacağı üzere PLL durumunu belirten değerleri almalıdır.

Görüldüğü gibi burada PLL birimini açıp kapamak için RCC_PLL_ON ya da OFF parametrelerini kullanırız. Biz PLL kullanacağımız için PLL yapısındaki PLLState değişkenine RCC_PLL_ON parametresini yüklüyoruz. Yani bu da on altılık tabanda 2 değeri ikilik tabanda ise 10 değeri oluyor. Bu değerleri kütüphane alıp yazmaçların gerekli bitlerine atamayı yapacaktır. Yazmaç seviyesinde çalışırken zaten kütüphane ile işimiz olmayacağı için biz yine aldığı parametrelerin sayısına, işlevine ve adına dikkat ediyoruz.

Burada PLL yapısının bir diğer değişkeni olan PLLSource değişkenine bir değer atandığını görmekteyiz. PLLSource adından anlaşılacağı üzere PLL biriminin kaynak olarak aldığı sinyali belirler. Bu parametrelerin ne olduğunu Ctrl + Sol Tık ile veya kütüphane kılavuzuna bakarak öğrenebiliriz. Biz yine aynı şekilde bakalım.

Görüldüğü gibi HSI ve HSE olmak üzere yani dahili ve harici yüksek hızlı osilatör olmak üzere iki ayrı parametremiz var. Biz harici osilatör kullanacağımız için RCC_PLLSOURCE_HSE parametresini kullanıyoruz. PLL biriminin iki farklı kaynağı aldığını CubeMX programının arayüzünden de teknik veri kitapçığındaki saat biriminin diyagramından da kolaylıkla anlayabiliriz.

Görüldüğü gibi programda da HSI ve HSE olarak iki ayrı seçeneğimiz  var. Ayrıca bu bölme oranını yine önceki değerlerde 1 olarak belirlemiştik. Bu diyagrama baktığımızda PLL yapısı için bir başka parametrenin olması gerektiğini anlayabiliriz. O da PLL çarpanı olacaktır.

Burada PLL yapısının PLLMUL adında bir değişkeninin olduğunu görüyoruz. İngilizce bilenler MUL kısaltmasından söylenmek istenilenin çarpım olacağını anlayabilir. Burada RCC_PLL_MUL9 derken PLL çarpanının 9 olacağını anlayabiliriz. Bunun için kılavuza bakmaya gerek olmasa da kullanabileceğimiz çarpanları yine kaynak kodda bulabiliriz.

Görüldüğü gibi PLL çarpanları aynı programda olduğu gibi 2 ve 16 arasındadır. Yalnız saat hesaplamasını burada oturup bizim yapmamız gereklidir. Bunun için sadece programın değil teknik veri kitapçığının da yardımına başvurmak gerekecektir. Saat diyagramını ve hangi birime hangi çarpan ya da bölenle kaç MHz sinyal gittiği ve birimin desteklediği frekans aralığını bilmeden işimiz çok zor olacaktır. CubeMX programı bu hesaplamaları bizim için yapmaktadır. O yüzden yeni başlayanlara büyük kolaylık sağlamaktadır. Fakat CubeMX programını kullanmaya uzun süre devam edecek olsak bile sırf öğrenmek için bunları incelememiz gereklidir. CubeMX programı bu işi yapıyor zaten öğrenmeye ne gerek var diyemeyiz.

Burada hazırlanan yapı değeri HAL_RCC_OscConfig fonksiyonuna gönderilir ve fonksiyonun geri dönüşü denetlenerek olumsuz geri dönüşte hata fonksiyonuna gidiş sağlanır. Bu kontrol yapısı güvenlik görevini üstlenmektedir. O yüzden doğrudan HAL_RCC_OscConfig fonksiyonu ile de bunu yapabiliriz.

Buraya kadar osilatör ön ayarı için gereken işleri yaptık. Şimdi ise diğer saat ayarlarına bakacağız. Bunun için öncelikle ClockType değişkenine ayar yapacağımız saatleri söylememiz gerekli. OR (ya da) operatörü ile bunu yapmaktayız. Bazı eğitim verenlerin bu operatöre “ve operatörü” dediğine şahit oldum. Burada dil açısından ve anlamı taşıyabilse de mantıksal uygulamalarda OR’un “ve” anlamına geldiğini bilmek bize sıkıntı yaşatacaktır. O yüzden OR operatörünü “ya da” olarak bilmek gereklidir. Burada öncelikle kullanılacak saat tiplerinin ne olduğuna bakalım.

Görüldüğü gibi programımız ayarlanacak dört saati de ClockType değişkeninin bünyesine almış durumda. Bu ClockType kısmından önceki yazıda da bahsetmiştik. Şimdi diyagram üzerinden bu saatlerin nerede olduğunu işaretleyelim. Böylelikle bu saatleri anlamanız daha kolaylaşacaktır.

Bizim sistemin çalışabilmesi için SYSCLK ile HCLK ve çevre birimlerini kullanabilmemiz için PCLK1 ve PCLK2 saatleri üzerinde ayar yapmamız lazım. O yüzden dört saati de beraber seçiyoruz.

Burada SYSCLKSource adlı yani sistem saat kaynağı değişkenine RCC_SYSCLKSOURCE_PLLCLK değerinin atandığını görüyoruz. Yukarıdaki şemada bu kaynakların HSI, HSE ya da PLLCLK yani PLL çıkışı olduğunu görmemiz mümkün. Şimdi kaynak kodu inceleyelim.

Burada da aynı şekilde üç farklı değeri görmekteyiz. CubeMX programı kullanmak yerine teknik veri kitapçığındaki anlaşılması daha zor diyagram üzerinden bu fonksiyonları kullanarak yapmaya kalksaydık ilk programımızı çalıştırabilmemiz için uzunca bir süre geçmesi gerekecekti. Çünkü bu saat yapısı karmaşık olduğu için ve en basit programı çalıştırmak için de gerekli olduğu için her şeyden önce bu öğrenilmesi gerekliydi. Şimdi ise bu saat ayarlarını öğrenmeyi erteleme imkanı bulabiliyoruz.

Yukarıdaki şemada gördüğünüz AHB Prescaler ayarını bu komut ile yapmaktayız. AHBCLKDivider adından anlayacağımız üzere sistem saatini bölerek HCLK saatini elde ediyoruz. Buradaki bölücü değer 1 olduğu için SYSCLK ile HCLK saat değeri aynı kalmış oluyor. Programda olduğu gibi kütüphanede de 512’ye kadar bölme seçeneği vardır.

Şimdi ise incelememiz gereken iki komut kalıyor ve bu komutlar APB1 ve APB2 saatlerinin bölme değerleridir.

Programın kütüphane kullanmaya gerek olmadan hazır kod vermesinin yanında diyagramı ve uyarıları beraberinde vermesi daha büyük bir özelliktir. Örneğin hangi saatin nereden giriş aldığı ve nereye giriş verdiğini rahatça görebileceğimiz gibi bu değerleri aştığımızda önceden uyarı almaktayız. Ayrıca yeni fark ettiğimiz bir özelliği de bu saat yapısını kolaylıkla bu program üzerinden öğrenebildik. Eğer hazırcı bir bakış açısıyla değil de öğrenmeye hevesli bir bakış açısıyla bakarsak böyle programlar bile bizim için bir nimet olacaktır. Buraya kadar temel seviyede STM32 hakkında saat bilgilerini size verdik. Bununla yetinmemek gerektiğini ve kullanacağınız farklı birimler için ayrı saat ayarlarının olduğunu çoktan öğrenmiş olmanız gerekir. Biz burada STM32 hakkında saat ayarlarını bırakalım ve lazım olduğunda CubeMX üzerinden devam edelim.

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.