IAR ile STM8S – UART

  • 6 ay önce, Baran EKREM yazdı.
  • 2 Yorum
  • 290 Kişi Okudu

UART/USART asla elimizin altından düşürmediğimiz bir protokol. Gerek özel haberleşmelerimiz gerek sensör okuma olsun bir çok yerde kullanılmasıyla birlikte uzun zamandır RS-232 olarak da çevremizde görüyoruz. Burada RS232 sadece daha farklı gerilim sevilerinde olmasının yanı sıra büyük port olması ve artık bilgisayarlarımızda bulunmaması nedeniyle sanal Com Port’lar bu eski dinazorların yerini çoktan aldı. FT232, CPxxx serisi gibi USB/Seri Çeviriciler hem az yer kaplaması hem USB den çalışması hemde düşük gerilim seviyeleri ile deneleyicilere uygun seviyede çıkış vermesinden ötürü bir hayli yaygınlaştı. Lafı daha fazla uzatmadan STM8S serisinde bu işleri nasıl yaptığımızı inceleyelim.

Yukarıda bahsettiğim üzere bende sanal Port oluşturan bir çevirici kullandım. Kullandığım çeviri FT232.

Öncelikle UART/USART arasındaki farka bakacak olursak burada sadece senktonizasyon olduğunu görürüz. Bunun için normalde bulunan RX-TX pinleri dışında ekstra pin kullanmamız gerekir ki biz şuan bunu istemiyoruz. Zaten bu işleri genelde yazılımsal yapmayı tercih ederiz.

Şimdi bir UART Paketini inceleyelim.


Resimde görüldüğü üzere değişken bölümlerin olmasından ziyade değiştirilemeyecek olan tek alan start bitidir.

UART haberleşmesinde önemli olan bir takım özellikler şunlardır.

  • Baud Rate
  • Data Bits
  • Parity Bits
  • Stop Bits

Buradan en çok dikkat edilmesi gereken nokta 2 tarafında haberleşme ayarlarını aynı olmasıdır. Aksi takdirde bu cihazlar farklı dilde konuşuyormuş gibi olur ve birbirlerini anlayamazlar

1) Baud Rate

Haberleşme hızını temsil eder. Saniyede gönderilecek olan bit sayısını temsil eder. Yüksek hızlarda hata oranı artacağı için dikkatli seçilmesi gerekir. Genelde 2400, 4800, 9600, 115200 gibi değerler kullanılır.

2) Data Bits

Tek pakette kaç bit gideceğini temsil eder. Biz genelde 8 bit yani 1 byte’ı tercih ederiz. Kullandığımız denetleyicide 8 ve 9 bit seçenekleri mevcuttur.

3) Parity Bits

Özel tanımlı bir hata kontrol bitidir. Bit toplamım 2 ye göre modu ile hesaplanılır. Kullandığımız denetleyicide NO, EVEN, ODD olmak üzere 3 seçenek vardır. Genelde NO olarak ayarlarız, yani Parity biti koymayacağız anlamına gelir. Daha detaylı bir açıklama için şurada güzel örnekler mevcut Parity Bit

3) Stop Bits

Paket sonu bitiş bitleridir. 0.5, 1, 1.5, 2 olmak üzere 3 seçeneğimiz vardır. Bu biti ModBus haberleşmesinde 2 olarak görebilirsiniz. Biz genelde 1 olarak kullanırız.

Burada RX pini alıcı TX pini ise göndericidir. Bu  yüzden çapraz bağlantı yapılır.


İşin fiziksel kısmını tamamladığımıza göre yazılımsal bölüme geçelim. Ayrıca UART/USART da kesme özelliklerinin olduğunu da unutmayalım. Veri alma, gönderme kesmelerinin yanı sıra bir çok kesmede mevcut. Bunlara birazdan değineceğiz.

Görüldüğü üzere yine tek satırda konfigürasyon işlemini yapmak oldukça basit ve sade.

Burada 9600 Baud Rate’de 8 Data biti, 1 Stop biti ve No parity olarak ayarları yaptığımız gözükmekte. Bunun yanı sıra senkronizasyonu kapatıp TXRX modunu aktif ediyoruz. Bu hem TX hemde RX aktif olacağı anlamına geliyor. Eğer sadece alma yada gönderme yapacaksanız. TX yada sadec RX özelliğini aktif edebilirsiniz. Son olarak veri alma kesmesini aktif edip UART1’i çalıştırabiliriz.

Veri gönderme ve alma işlerini ise 2 adet fonksiyon ile yapıyoruz.

Tabi veri gönderme işlemini yaparken hattın durumunu kontrol etmekte fayda var.

Merak etmeyin bu while yerine ilerde TX kesmesini kullanacaksınız.

Son olarak kesme fonksiyonunu yazalım. Burada bir çok kesme olacağı için kesme içinde hangi kesme bayrağının geldiğini kontrol etmeyi unutmayın.

Ben burada 2 tane değişken kullandım. Bu sayede hem veriyi alıyorum hemde ana döngüde veri alındığından haberdar oluyorum. Bu aslında sanal bir bayrak oluyor da denebilir.

Tabi daha sonra kullanacağımız veri gönderme, metin gönderme gibi işler için fonksiyon hazırlayalım. Hadi yine iyisiniz. Ben sizin için basit bir şeyler karaladım.

Basit bir kontrol işlemini şu şekilde yapmak ve cevap almak mümkün.

Artık herhangi bir terminal ile haberleşmeyi test edebilirsiniz.


Son olarak kodlarımızı hali şu şekilde.

main.c Dosyası

main.h Dosyası

Interrupt dosyası çok büyük olduğu için ilgili kısmı veriyorum gerekli eklemeyi yapabilirsiniz.

 

  1. muharrem dedi ki:

    Üstadım eline sağlık güzel bilgiler vermişsin.
    Bu kısmını açıklayabilir misin? Ne amaçla kullanılıyor.
    ///********************/
    #ifdef USE_FULL_ASSERT
    void assert_failed(uint8_t* file, uint32_t line)
    {
    while (1);
    }
    #endif
    ///********************/

    Interrupt kısmını main.c dosyasında mı yoksa main.h dosyasında mı kullanıyoruz ?
    sorularım için kusura bakma.

    • Baran EKREM dedi ki:

      Merhaba,
      Interrupt fonksiyonunu ilgili dosyada yani interrupt dosyasında kullanıyorum.
      İsteğe bağlı olarak maine alabilirsin ama önerilen bir yöntem değil.

      ASSERT kısmı aslında bir hata kontrolü.
      Parametreleri kontrol etmeye yarıyor.
      Bazı durumlarda kullanılmasa da olur fakat genelde kütüphaneler bunu istiyor.

Bir Yorum Yazın