- Donanımı Hazırlama
- STM8S103F'de GPIO Pinout'larını Anlamak
- STM8S103F GPIO Seçimi için Pin Çıkışı Açıklaması ve İpuçları
- SPL kullanarak GPIO Giriş ve Çıkışı için STM8S'yi programlama
- Programı Yükleme ve Test Etme
Mikrodenetleyiciler için, yanıp sönen bir LED programı "merhaba dünya" programına eşdeğerdir. Önceki eğitimimizde, STM8S103F3 Geliştirme Panosuna nasıl başlayacağımızı ve STM8S denetleyicilerimizi programlamak için IDE'yi ve derleyiciyi nasıl kuracağımızı öğrendik. Ayrıca, standart çevre birimi kitaplıklarını nasıl kullanacağımızı ve kodu nasıl derleyeceğimizi ve mikro denetleyicimize yükleyeceğimizi de öğrendik. Kapsanan tüm temel bilgilerle birlikte, kod yazmaya başlayalım. Bu eğitimde, STM8S denetleyicilerinde genel GPIO işlevlerinin nasıl gerçekleştirileceğini öğreneceğiz. Kartta zaten B bağlantı noktasının 5 numaralı pinine bağlı bir yerleşik LED var, bu LED'in nasıl yanıp söneceğini ve ayrıca harici bir LED ekleyip bir basma düğmesiyle kontrol etmeyi öğreneceğiz. Tamamen yeniyseniz, daha fazla ilerlemeden önce önceki öğreticiyi okumanız şiddetle tavsiye edilir.
Donanımı Hazırlama
Programa dalmadan önce donanım bağlantılarını hazırlayalım. Daha önce de belirtildiği gibi, burada iki LED kullanacağız, biri sürekli yanıp sönen yerleşik bir LED, diğeri ise bir basma düğmesiyle değiştirilecek harici bir LED. Buradaki fikir, tüm GPIO işlevlerini basit bir kurulumda öğrenmektir. Yerleşik Led zaten PB5'e (PORTB'nin pin5'i) bağlı olduğundan, aşağıdaki şemada görebileceğiniz gibi, PA3'e bir LED ve PA2'ye bir düğme bağladım.
Ancak, kontrolümüzde bulunan tüm çıkış pinlerinden neden çıkış için PA3 ve giriş için PA2'yi seçtim? Sorular geçerlidir ve bunu bu makalenin ilerleyen kısımlarında açıklayacağım. Bu eğitim için donanım kurulumum aşağıda gösterilmektedir. Gördüğünüz gibi, ST-link programlayıcımı sadece kartımızı programlamakla kalmayacak, aynı zamanda bir güç kaynağı görevi görecek olan programlama pinlerine de bağladım.
STM8S103F'de GPIO Pinout'larını Anlamak
Şimdi soruya geri dönersek, neden girdi için PA2 ve çıktı için neden PA3? Bunu anlamak için aşağıda gösterilen mikrodenetleyicinin pin çıkışına daha yakından bakalım.
Pinout diyagramına göre, mikro denetleyicimizde sırasıyla PA, PB, PC ve PD ile gösterilen PORT A, B, C ve D olmak üzere dört portumuz var. Her bir GPIO pini ayrıca başka bazı özel işlevlerle birlikte toplanmıştır. Örneğin, PB5 (PORT B'nin pini 5) yalnızca bir GPIO pini olarak değil, aynı zamanda I2C iletişimi için bir SDA pini ve bir Zamanlayıcı 1 çıkış pini olarak da çalışabilir. Dolayısıyla, bu pini bir LED bağlamak gibi basit GPIO amaçları için kullanırsak, I2C ve LED'i aynı anda kullanamayız. Ne yazık ki, yerleşik LED bu pime bağlı, bu yüzden burada pek fazla seçeneğimiz yok ve bu programda I2C kullanmayacağız, bu yüzden sorun değil.
STM8S103F GPIO Seçimi için Pin Çıkışı Açıklaması ve İpuçları
Gerçekten konuşursak, PA1'i bir giriş pini kullanmaktan zarar gelmez ve sadece pin çalışır. Ancak bunu, yeni bir mikro denetleyicide GPIO pinlerini seçerken karşılaşabileceğiniz bazı yaygın tuzakları size gösterme fırsatı sağlamak için kasıtlı olarak gündeme getirdim. Tuzaklardan kaçınmanın en iyi yolu, STM8S103F3P6 veri sayfasında verilen pim ayrıntılarını ve pim açıklamasını okumaktır. STM8S103F3P6 mikrodenetleyici için veri sayfasında bahsedilen pin açıklama detayları resimlerin altında gösterilmiştir.
Mikrodenetleyicimizdeki giriş pinleri yüzer veya zayıf yukarı çekilebilir ve çıkış pinleri Açık Tahliye veya İtme-çekme olabilir. Açık Drenaj ve İtme-Çekme Çıkış pimleri arasındaki fark zaten tartışılmıştır, bu nedenle bunun ayrıntılarına girmeyeceğiz. Basitçe söylemek gerekirse, bir Açık Tahliye çıkış pini, çıkışı yalnızca yüksek değil, düşük yapabilirken, bir itme-çekme çıkış pini çıkışı hem yüksek hem de yüksek yapabilir.
Bunun dışında yukarıdaki tablodan ayrı olarak, bir çıkış piminin Hızlı çıkış (10 Mhz) veya Yavaş Çıkış (2 MHz) olabileceğini de fark edebilirsiniz. Bu, GPIO Hızını belirler, GPIO pinlerinizi çok hızlı bir şekilde yüksek ve düşük arasında değiştirmek isterseniz, Hızlı çıkışı seçebiliriz.
Denetleyicimizdeki bazı GPIO pinleri, yukarıdaki resimde belirtildiği gibi True Open Drain (T) ve High Sink Current (HS) destekler. Açık Drenaj ve Gerçek Açık Drenaj arasındaki önemli bir fark, açık drenaja bağlanan çıkışın mikrodenetleyicinin (Vdd) çalışma voltajından daha yükseğe çekilememesi, gerçek bir açık boşaltma çıkış piminin ise Vdd'den daha yükseğe çekilebilmesidir. Yüksek Sink Özelliğine sahip pimler, daha fazla akım alabileceği anlamına gelir. Herhangi bir GPIO HS pininin kaynağı ve alıcı akımı 20mA iken, güç hattı 100 mA'ya kadar tüketebilir.
Yukarıdaki resme daha yakından baktığınızda, True Open Drain Type (T) olan PB4 ve PB5 dışında neredeyse tüm GPIO pinlerinin High Sink Current (HS) tipi olduğunu fark edeceksiniz. Bu, bu pinlerin yükseğe yapılamayacağı, pin yüksek yapıldığında bile 3.3V sağlayamayacağı anlamına gelir. Bu nedenle yerleşik led, doğrudan GPIO pininden güç sağlamak yerine 3.3V'ye bağlanır ve PB5 ile topraklanır.
Ayrıntılı pim açıklaması için veri sayfasındaki 28. sayfaya bakın. Yukarıdaki görüntüde belirtildiği gibi, PA1 otomatik olarak zayıf bir yukarı çekme olarak yapılandırılmıştır ve bir çıkış pini olarak kullanılması önerilmez. Her neyse, bir basma düğmesiyle birlikte bir giriş pini olarak kullanılabilir, ancak sadece programdan yukarı çekmeyi etkinleştirmek için PA2 kullanmaya karar verdim. Bunlar, çok daha karmaşık programlar yazdığımızda faydalı olacak birkaç temel şeydir. Şimdilik, kafanızdan birçok şey sıçrarsa sorun değil, diğer derslerde bu katmana gireceğiz.
SPL kullanarak GPIO Giriş ve Çıkışı için STM8S'yi programlama
İlk eğitimimizde tartıştığımız gibi bir çalışma alanı ve yeni proje oluşturun. Tüm üstbilgi ve kaynak dosyalarını ekleyebilir veya yalnızca gpio, config ve stm8s dosyalarını ekleyebilirsiniz. Main.c dosyasını açın ve programınızı yazmaya başlayın.
Başlık dosyalarını yukarıdaki resimde gösterildiği gibi eklediğinizden emin olun. Main.c dosyasını açın ve kodu başlatın . Main.c kodunun tamamı bu sayfanın altında bulunabilir ve ayrıca proje dosyasını oradan da indirebilirsiniz. Kodun açıklaması aşağıdaki gibidir, ayrıca kodlama kısmı ile ilgili kafanız karışırsa, SPL Kullanım kılavuzuna veya bu sayfanın altında bağlantısı verilen videoya da başvurabilirsiniz.
Gerekli Bağlantı Noktası Başlangıcını Kaldırma
Programımıza gerekli portları De-Initializing ile başlıyoruz. Daha önce tartıştığımız gibi, her GPIO pini, normal bir Giriş ve Çıkış gibi çalışmaktan başka, onunla ilişkili birçok başka işleve sahip olacaktır. Bu pinler daha önce başka uygulamalar için kullanılmışsa, onları kullanmadan önce Başlatılmamış hale getirilmelidir. Zorunlu olmamakla birlikte iyi bir uygulamadır. Aşağıdaki iki kod satırı, Bağlantı Noktası A ve Bağlantı Noktası B'yi Yeniden Başlatmak için kullanılır. Sadece GPIO_DeInit (GPIOx) sözdizimini kullanın ; ve x yerine bağlantı noktası adını belirtin.
GPIO_DeInit (GPIOA); // GPIO_DeInit (GPIOB) çalışması için Port A'yı hazırlayın; // B Portunu çalışmak için hazırlayın
Giriş ve Çıkış GPIO Beyanı
Daha sonra hangi pinlerin girdi, hangilerinin çıktı olarak kullanılacağını belirtmemiz gerekiyor. Bizim durumumuzda giriş olarak PA2 pini kullanılacak, bu pini harici olarak kullanmak zorunda kalmamak için dahili Pull-up ile de ilan edeceğiz. Sözdizimi GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z) şeklindedir; . Burada x bağlantı noktası adı, y pin numarası ve z GPIO Pin modudur.
// PA2'yi girdi çekme pini olarak bildirin GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Sonra, PA3 ve PB5 pinlerini çıktı olarak ilan etmeliyiz. Yine birçok tür çıktı bildirimi mümkündür, ancak "GPIO_MODE_OUT_PP_LOW_SLOW" kullanacağız, bu da onu yavaş hızda push-pull türünün bir çıkış pini olarak ilan edeceğimiz anlamına gelir. Ve varsayılan olarak, değer düşük olacaktır. Sözdizimi aynı olacaktır.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // PB5'i itme çekme Çıkış pini olarak bildirin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
SPL kullanıcı kılavuzundan alınan aşağıdaki anlık görüntü, tüm olası GPIO modlarından (z) bahsetmektedir.
Sonsuz süre döngü
Pin bildiriminden sonra, içinde LED'i sonsuza kadar yanıp sönmeye devam edeceğimiz ve LED'i değiştirmek için basma düğmesinin durumunu izleyeceğimiz sonsuz bir döngü oluşturmamız gerekiyor. Sonsuz döngü bir while (1) veya for (;;) ile oluşturulabilir . Burada süre (1) kullandım.
süre (1) {}
Giriş pininin durumunu kontrol etme
Giriş pininin durumunu kontrol etmeliyiz, bunu yapmak için sözdizimi GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); burada x bağlantı noktası adı ve y pin numarasıdır. Pin yüksekse '1' alırız ve pin düşükse '0' alırız. Pinin yüksek mi yoksa düşük mü olduğunu kontrol etmek için bir if döngüsü içindeydik.
eğer (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // düğmeye basılırsa
GPIO Pini Yüksek veya Düşük Yapma
GPIO pinini Yüksek veya Düşük yapmak için GPIO_WriteHigh (GPIOx, GPIO_PIN_y) kullanabiliriz; ve GPIO_WriteLow (GPIOx, GPIO_PIN_y); sırasıyla. Burada ledin butona basıldığında yanmasını, butona basılmazsa sönmesini sağladık.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // düğmeye basıldığında GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED AÇIK değilse GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED KAPALI
GPIO Pinini Değiştirme
Bir GPIO pinini değiştirmek için GPIO_WriteReverse (GPIOx, GPIO_PIN_y) var; bu işlevi çağırmak çıkış pininin durumunu değiştirecektir. Pim yüksek ise düşük, düşükse yüksek olarak değiştirilecektir. Bu işlevi PB5'teki yerleşik LED'i yanıp sönmek için kullanıyoruz.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Gecikme İşlevi
Arduino'nun aksine, kozmik derleyicinin önceden tanımlanmış bir gecikme işlevi yoktur. Yani kendi başımıza bir tane yaratmalıyız. Gecikme fonksiyonum aşağıda verilmiştir. Doe değeri gecikme ms değişkeninde alınacak ve bekletmek veya yürütmeyi programlamak için iki for döngüsü kullanacağız. _Asm ("nop") gibi, işlemsiz anlamına gelen bir montaj talimatıdır. Bu, denetleyicinin herhangi bir işlem yapmadan for döngüsüne gireceği ve böylece bir gecikme oluşturacağı anlamına gelir.
void delay (int ms) // Fonksiyon Tanımı {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {for (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // İşlem yapmayın // derleme kodu}}
Programı Yükleme ve Test Etme
Artık programımız hazır olduğuna göre onu yükleyebilir ve test edebiliriz. Yüklendikten sonra donanımım beklendiği gibi çalışıyordu. Yerleşik kırmızı LED her 500 milisaniyede bir yanıp sönüyordu ve anahtara her bastığımda harici yeşil LED yanıyordu.
Tam çalışma aşağıda bağlantısı verilen videoda bulunabilir. Bu noktaya ulaştığınızda, anahtarı ve LED'i farklı pinlere bağlamayı deneyebilir ve konsepti anlamak için kodu yeniden yazabilirsiniz. Kavramları net bir şekilde anlayıp anlamadığınızı kontrol etmek için gecikme zamanlamasıyla da oynayabilirsiniz.
Herhangi bir sorunuz varsa, lütfen aşağıdaki yorum bölümüne bırakın ve diğer teknik sorularınız için forumlarımızı kullanabilirsiniz. Takip ettiğiniz için teşekkürler, bir sonraki eğitimde görüşmek üzere.