STM32 printf() FONKSİYONUNUN UART’a YÖNLENDİRİLMESİ

Standard C kütüphanelerinin printf() fonksiyonu, yazılım geliştirirken çok kullandığımız bir araç. Bu fonksiyon varsayılan hali ile çıktılarını sistem konsoluna gönderiyor. Ansak mikro denetleyicilerle çalışırken bu çıktıyı seçtiğimiz herhangi bir USART porta yönlendirmek isteriz. Bunun için yazılımımıza 8-10 satırlık bir kod eklememiz gerekiyor.

Bu yayında bu işin nasıl yapılacağını anlatıyorum.

Genelde, çok temel seviyelerde olup, her yerde bulunabilen bilgiler de olsa, anlattığım şeyi öğrenirken başvurduğum kaynakları belirtiyorum. Ancak üzerinden çok vakit geçmiş ise, nereden nasıl yararlandığımı hatırlayamıyorum. Burada anlatacaklarım da böyle, kaynağını unuttuklarımdan birisi. 

KULLANDIĞIM DENETLEYİCİ VE GELİŞTİRME PLATFORMU

Bu uygulamayı STM32 CubeIDE üzerinden anlatacağım. Printf() i USART2 ye yönlendirerek STM32 den gönderdiğimiz mesajları bir konsol uygulamasında görüntüleyeceğiz.

Kullanacağım mikro denetleyici bir Nucleo kart üzerindeki STM32F401RE. Bu seçimim biraz tembellikten kaynaklanıyor, zira Nucleo da STM32 nin USART2 portu ST Link e bağlanmış durumda. Bu sayede PC ye ayrıca bir UART/FTDI bağlantısına gerek kalmıyor.

STM32F401RE Nucleo kiti – PC ye USART2 bağlantısı da ST-Link üzerinden sağlanıyor.

STM32 cubeIDE İLE PROJE KURULUMU

Yeni STM32 Projesi oluşturma adımlarını izleyerek F401RE mikridenetleyicisini seçtikten sonra cubeMX bildiğimiz kurulum sayfasını açıyor. Burada yapacağımız ilk ayar debug portunun SWD olarak seçilmesi. Onun ardından USART2 nin etkinleştirilmesi geliyor.

Burada sadece baud hızını 9600 olarak değiştirdim, fazla hıza ihtiyacımız yok. Geri kalan tüm ayarlar varsayılan değerlerinde bırakılıyor.

Project/Generate Code komutu ile projemizi oluşturalım.

EKLENECEK KODLAR

Printf() in yönlendirileceği fonksiyon için, kullanılan derleyiciye göre iki farklı seçenek var. Bunu bir #ifdef kontrolu ile seçiyoruz. Bir de printf() i içeren kütüphaneyi stdio.h ile projemize ekliyoruz.

Görüldüğü gibi derleyiciye bağlı olarak printf() in ya “__io_putchar(int ch)” ya da “fputc(int ch, FILE *f)” isimli fonksiyonlara yönlendiriliyor. Bizim için geçerli olan birincisi, ama diğeri de burada dursun belki ileride gerekir.

Şimdi sıra bu fonksiiyonların kodunu yazmaya geldi. Öyle fazla birşey yok, tek satırdan ibaret, aşağıdaki gibi:

KAYAN NOKTALI SAYILAR İÇİN YAPILMASI GEREKEN AYAR (Float formatı)

Kayan noktalı, yani ondalık kesirli sayıların formatlanarak gönderilebilmesi için yapmamız gereken birşey daha var. Project/Properties/C/C++ Build/Settings/MCU Settings/Tool Settings menüsü altındaki pencerede ese float with printf … satırının kutucuğunu işaretliyoruz.

TEST PROGRAMI

Ana program çevirimi içine iki satırlık bir test kodu yerleştirelim. Bunlardan birisi UART’a doğrudan bir şeyler göndersin, diğeri de printf() aracılığıyla integer ve ondalıklı sayılar göndersin.

ÇIKTILAR

Programımızı derleyip çalıştırdıktan sonra PC üzerinde çalıştıracağımız bir data konsolu üzerinden gelen verileri görüntüleyebiliriz. Ben Mac OS üzerinde çalışan Serial Tools uygulamasını kullandım. Herhangi bir konsol uygulaması kullanılabilir.

SONUÇ

Burada anlatılan yöntem herhangi bir mikro denetleyiciye, herhangibir geliştirme platformuna, istene USART port için uygulanabilir.

Bu yayının sonu – Selçuk Özbayraktar Ağustos 2020