- STM8S103F3P6'da Seri Haberleşme
- STM8S103F3P6'daki Seri Haberleşme Pinleri
- STM8S Seri Haberleşmesi için Devre Şeması
- Seri İletişim için STVD'yi Ayarlama
- Seri İletişim için STM8S Programlama
- LED'i Seri monitörden kontrol etme
- STM8S Seri Kitaplığı Daha Derin Bir Bakış
Yeni bir mikro denetleyicinin programlanması, yeni yazmaç işleme yöntemleri nedeniyle ve hangi bitin tam olarak ne yaptığını bilmemek nedeniyle genellikle daha uzun sürer. Aynı şey, söylemeden hata ayıklama için de geçerlidir. Bu nedenle, programcılar genellikle kodlarında kesme noktaları kullanırlar ve bir hata ayıklayıcı kullanarak bu noktadan geçerler. Ancak bir hata ayıklayıcı kullanmak ek donanıma (çoğu zaman pahalı) ve ek süreye ihtiyaç duyabilir. Bir Arduino hayranı çocuğu olarak, hepimizin hemfikir olabileceği bir şey, hata ayıklamak için seri baskı ifadeleri kullanmak ve kodumuzu anlamak hayatı çok daha kolay hale getiriyor. Kozmik C derleyicisi ve SPL kitaplıkları ile STM8'lerde aynısını ne kopyalayabiliriz? Pekala, bu çok olası ve eğitim dizimizin bu üçüncü öğreticisinde tam olarak yapacağımız şey bu.Burada tamamen yeniyseniz, STM8S (öğretici 1) ve STM8S GPIO kontrolünü (öğretici 2) kullanmaya başlama konusunu da kontrol edin. Ayrıca, hızlı başlangıçlar için STM8S'yi Arduino ile Programlama olasılığını da araştırdık. Tüm söylenenler öğreticiye girelim.
STM8S103F3P6'da Seri Haberleşme
STM8S103F3P6 veri sayfasından, 8 bit denetleyicimizin birçok farklı modda UART iletişimini desteklediğini görebiliriz. Kontrolör ayrıca senkronize UART iletişimi için bir saat çıkış pinine sahiptir ve ayrıca SmarCard, IrDA ve LIN'yi destekleyebilir. Ancak, bu eğitimde karmaşıklıktan uzak durmak için bunların hiçbirini araştırmayacağız. Basit UART okuma ve yazma işlemlerinin nasıl yapılacağını öğreneceğiz.
Öğretici ayrıca, Seri başlangıç, Seri okuma, seri yazdırma vb. Gibi basit UART komutlarını gerçekleştirebileceğiniz stm8s103 serial.h adlı bir başlık dosyası sağlar. Temel olarak, seri monitöre char, int ve string yazdırabileceksiniz. ve ayrıca seri monitörden karakter okuma. Bu eğitimin sonunda, seri monitörden bir LED'i kontrol edebilecek ve LED'in durumu hakkında geri bildirim alabileceksiniz. Yukarıda bahsedilen başlık dosyası SPL kitaplıklarına bağlıdır, bu nedenle başlangıç eğitimini takip ettiğinizden emin olun.
STM8S103F3P6'daki Seri Haberleşme Pinleri
Donanım tarafından başlayalım. Aşağıda verilen STM8S103F3P6 mikrodenetleyicideki pinout'lara hızlıca baktığımızda, 1, 2 ve 3 numaralı pinlerin UART iletişimi için kullanılacağını görebiliriz.
Üçü arasında, pin 1, yalnızca senkronize UART iletişimi sırasında kullanılacak olan UART saat pinidir, bu nedenle burada ona ihtiyacımız olmayacak. Pin 2, UART Verici pinidir ve Pin 3, UART Alıcı pinidir. Bu pinlerin analog pin veya normal GPIO pin olarak ikiye katlanabileceğini unutmayın.
STM8S Seri Haberleşmesi için Devre Şeması
Devre şeması burada çok basit, programlama için ST-LINK 2'mizi ve seri verileri okumak için bir USB'den TTL'ye dönüştürücümüzü bağlamamız gerekiyor. STM8S denetleyicimizin 3,3V mantık düzeyinde çalıştığını unutmayın, bu nedenle USB'den TTL'ye dönüştürücünüzün de 3,3V mantığı desteklediğinden emin olun. Tam devre şeması aşağıda gösterilmiştir.
ST-linkinizi bir USB bağlantı noktasına ve USB'den TTL dönüştürücüye dizüstü bilgisayarınızın başka bir USB bağlantı noktasına bağlamanız gerekir, böylece aynı anda hem verileri programlayabilir hem de izleyebilirsiniz. UART bağlantısı basittir, STM8S mikrodenetleyicinizin topraklamasını ve Rx / Tx pinini USB'den TTL'ye dönüştürücünün Tx / Rx pinlerine bağlayın. Burada denetleyiciye ST-Link'in Vcc pini ile güç verdim ve TTL dönüştürücünün vss pinini açık bıraktım, bunu başka bir şekilde de yapabilirsiniz. Piyasada birçok USB-TTL dönüştürücü türü vardır, sadece 3.3V Mantık sinyalleri üzerinde çalışabildiğinden ve Tx, Rx ve GND pinleri için basit bir görünüm ve yukarıda gösterilen bağlantıyı yapabildiğinden emin olun. Donanım kurulumum aşağıda gösterilmektedir.
Seri bir iletişim yolu oluşturmak için, STM8S_Serial.h başlık dosyasını sağladık . Bu başlık dosyasını kullanarak, seri iletişim için basit Arduino benzeri işlevleri gerçekleştirebilirsiniz.
Bu proje için gerekli tüm dosyaları STM8S103F3_SPL Github sayfamızda bulabilirsiniz. Yalnızca bu başlık dosyasına ihtiyacınız varsa, aşağıdaki bağlantıdan indirebilirsiniz.
STM8S_Serial.h dosyasını indirin
Seri İletişim için STVD'yi Ayarlama
Seri iletişimle çalışmak için, daha önce tartıştığımız STM8S_Serial.h başlık dosyası işlevini kullanan birçok kişi kullanacağız . Ancak kitaplığın başka bağımlılıkları vardır, birçok SPL UART ve Clock ile ilgili başlık ve C dosyaları. Bu nedenle, bu noktadan itibaren, bir derleme hatasını önlemek için tüm başlık ve C dosyalarını projemize dahil etmek daha iyidir. STVD çalışma ortamım buna benziyor.
İlk eğiticimizde yaptığımız gibi tüm SPL kaynak dosyalarını eklediğinizden ve Dosyayı dahil ettiğinizden emin olun. Ayrıca stm8s103_serial.h başlık dosyasını eklediğinizden emin olun. Bu başlık için C dosyası yok.
Seri İletişim için STM8S Programlama
STVD proje kurulumu hazır olduktan sonra kodumuzu main.c dosyasına yazmaya başlayabiliriz. Bu eğiticinin tam kodu, bu sayfanın alt kısmında bulunabilir. Açıklama aşağıdaki gibidir.
İlk adım gerekli başlık dosyalarını dahil etmektir, buraya ana başlık dosyasını (stm8s) ve indirdiğimiz stm8s_103_serial başlık dosyasını ekledim .
// Gerekli Başlıklar #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Ardından, giriş ve çıkış pinlerini belirlemek için tasarım makrolarını kullanıyoruz. Burada sadece B portunun pin5'ine bağlı yerleşik LED'i kontrol edecek, bu yüzden ona test_LED olarak bir isim vereceğiz .
#define test_LED GPIOB, GPIO_PIN_5 // test LED'i PB5'e bağlı
Ana fonksiyonun içinde ilerleyerek, pimi bir çıktı olarak tanımlayacağız. Temel GPIO işlevlerine aşina değilseniz, STM8S GPIO eğitimine geri dönün.
// Pin tanımlamaları // PB5'i itme çekme Çıkış pini olarak bildirin GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Ardından seri iletişim portlarımızı 9600 baud hızında başlatıyoruz. Yeni olanlar için, 9600, iletişim sırasında veri bitlerinin aktarılacağı hız oranıdır. Burada 9600'ü ayarlarsanız, aynısını izleme yazılımında da ayarlamanız gerekir. Sonra ayrıca bir “Enter command” dizesi yazdırıyoruz ve bir sonraki satıra geçiyoruz.
Seri_begin (9600); // Seri iletişimi 9600 baud hızında başlat Serial_print_string ("Komut girin"); // bir dizge yazdır Serial_newline (); // sonraki satıra geç
Sonsuz while döngüsüne geçerken , herhangi bir gelen seri veri olup olmadığını kontrol etmek için Serial_available fonksiyonunu kullanıyoruz. Cevabınız evet ise, onu ch adlı bir değişkene okur ve kaydederiz ve aynı şeyi Serial_print kullanarak yazdırırız . Daha sonra alınan değer 0 ise led'i kapatacağız ve 1 ise led'i yakacağız.
eğer (Serial_available ()) {Serial_print_string ("Bastığınız:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); eğer (ch == '0') GPIO_WriteHigh (test_LED); // LED KAPALI if (ch == '1') GPIO_WriteLow (test_LED); // LED AÇIK}
Bununla, bu öğretici için programlama tamamlanmıştır, sadece bu sayfanın altında verilen kodu yükleyin ve LED'i seri monitörden kontrol edebilmelisiniz.
LED'i Seri monitörden kontrol etme
Kodu yükledikten sonra, herhangi bir seri monitörü 9600 baud hızında açabilirsiniz. Kullanım kolaylığı için Arduino seri monitörü kullandım. Sıfırlama düğmesine basın ve "Bir komut girin" mesajını görmelisiniz. Daha sonra 1 girip enter tuşuna basarsanız, yerleşik led yanmalı, 0 için benzer şekilde kapanmalıdır.
Tam çalışma, bu sayfanın altında bağlantısı verilen videoda bulunabilir. Herhangi bir sorunuz varsa, lütfen yorum bölümüne bırakın. Diğer teknik soruları göndermek için forumlarımızı da kullanabilirsiniz.
STM8S Seri Kitaplığı Daha Derin Bir Bakış
STM8S103F3_Serial başlık dosyasında gerçekte ne olduğunu bilmek isteyen meraklı beyinler için okumaya devam edin….
Bu başlık dosyası başlangıç seviyesindeki programlama için iyi çalışır, ancak STM8S denetleyicisinin farklı bir sürümünü kullanıyorsanız veya bazı gelişmiş seçenekler arıyorsanız, bu başlığı biraz değiştirmek veya doğrudan SPL kitaplıklarıyla çalışmak isteyebilirsiniz. Bu başlık dosyasını tıpkı UART1 başlık dosyasından olgunlaşmış olarak yazdım, başlık dosyamın açıklaması aşağıdaki gibidir.
Seri Monitörden bir karakter okumak
Bu işlev, mikro denetleyiciye seri monitörden gönderilen tek bir karakterin okunmasına yardımcı olur.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); dönüş (UART1_ReceiveData8 ()); }
Alımı tamamlamak için RXE bayrağının AYARLANMASINI bekleriz ve ardından alımı onaylamak için bayrağı temizleriz. Son olarak bu fonksiyonun sonucu olarak alınan 8 bitlik veriyi gönderiyoruz.
Seri Monitöre bir karakter yazdırma
Bu işlev, bir mikro denetleyiciden seri monitöre tek bir karakter iletir.
void Serial_print_char (karakter değeri) {UART1_SendData8 (değer); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // göndermeyi bekle}
Fonksiyon basitçe 8 bitlik değeri yazar ve UART1_FLAG_TXE'yi SET'e kontrol ederek aktarımın tamamlanmasını bekler.
Seri İletişimi Başlatma
Bu işlev, gerekli baud hızında seri iletişimi başlatır.
void Serial_begin (uint32_t baud_rate) {GPIO_Init (GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init (GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); UART1_DeInit (); // UART çevre birimlerini sıfırlayın UART1_Init (baud_rate, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // (BaudRate, Wordlegth, StopBits, Parity, SyncMode, Mode) UART1_Cmd (ENABLE); }
Baud hızının yanı sıra, veri bitlerinin sayısı, durdurma bitlerinin sayısı, eşlik vb. Gibi seri iletişim için ayarlanması gereken başka parametreler vardır. En yaygın olanı (Arduino'ya benzer) 8 bitlik veridir. tek duraklı bit ve eşliksiz ve dolayısıyla bu varsayılan ayar olacaktır. Gerekirse değiştirebilirsiniz.
Seri Monitöre Tam Sayı Yazdırma
Çoğu zaman, hata ayıklama veya izleme için bir seri monitör kullanıyorsak, seri monitöre int türünde bir değişken yazdırmak isteyebiliriz. Bu işlev tam olarak bunu yapar
void Serial_print_int (int number) // int değerini seri monitöre yazdırma işlevi {char count = 0; karakter basamak = ""; while (sayı! = 0) // int'i karakter dizisine böler {basamak = sayı% 10; count ++; sayı = sayı / 10; } while (count! = 0) // karakter dizisini doğru yönde yazdır {UART1_SendData8 (rakam + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // sayım gönderilmesini bekleyin--; }}
Bir tamsayı değeri alır ve onu ilk while döngüsünde karakter dizisine dönüştürür, ardından ikinci while döngüsünde, karakterlerin her birini print char fonksiyonumuza benzer şekilde göndereceğiz.
Yeni bir satır yazdırmak
Bu, yeni bir satır yazdırmak için basit bir işlevdir. Bunu yapmak için onaltılı değer "0x0a" dır, biz sadece onu 8 bitlik iletim komutunu kullanarak gönderiyoruz.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // göndermeyi bekle}
Seri monitöre bir dizi yazdırma
Diğer bir kullanışlı işlev de dizileri seri monitörde yazdırmaktır.
void Serial_print_string (char string) {. karakter i = 0; while (string! = 0x00) {UART1_SendData8 (string); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Yine, bu işlev aynı zamanda dizeyi char dizisine dönüştürür ve her karakteri gönderir. Bildiğimiz gibi tüm dizelerin sonu boş olacaktır. Öyleyse, sıfır 0x00 değerine ulaşana kadar karakterleri geçip iletmeye devam etmeliyiz.
Seri verilerin okunabilir olup olmadığını kontrol etme
Bu işlev, ara bellekte okumaya hazır herhangi bir seri veri olup olmadığını kontrol eder.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) TRUE döndür; aksi takdirde FALSE döndürür; }
UART1_FLAG_RXNE bayrağını kontrol eder, eğer doğruysa, doğru döndürür ve değilse yanlış döndürür.