- Komunikasi Serial di STM8S103F3P6
- Pin Komunikasi Serial pada STM8S103F3P6
- Diagram Sirkuit untuk Komunikasi Serial STM8S
- Menyiapkan STVD untuk Komunikasi Serial
- Pemrograman STM8S untuk Komunikasi Serial
- Mengontrol LED dari monitor Serial
- STM8S Serial Library Lihat Lebih Dalam
Pemrograman mikrokontroler baru sering memakan waktu lebih lama karena metode penanganan register baru dan tidak tahu bit apa yang melakukan apa. Hal yang sama juga berlaku untuk debugging tanpa mengatakan. Inilah sebabnya mengapa programmer cukup sering menggunakan breakpoint dalam kode mereka dan melewatinya menggunakan debugger. Tetapi menggunakan debugger mungkin membutuhkan perangkat keras tambahan (biasanya mahal) dan juga waktu tambahan. Menjadi anak penggemar Arduino, satu hal yang kita semua bisa setujui adalah menggunakan pernyataan cetak serial untuk debugging dan memahami kode kita membuat hidup jauh lebih mudah. Apa yang bisa kita tiru sama pada STM8 dengan kompiler C kosmik dan pustaka SPL? Yah, itu sangat mungkin, dan itulah yang akan kita lakukan dalam tutorial ketiga dari seri tutorial kita ini.Anda juga dapat memeriksa cara memulai dengan STM8S (tutorial 1) dan kontrol GPIO STM8S (tutorial 2) jika Anda benar-benar baru di sini. Selain itu, kami juga telah menjajaki kemungkinan Pemrograman STM8S dengan Arduino sebagai permulaan cepat. Semua yang dikatakan mari kita masuk ke tutorial.
Komunikasi Serial di STM8S103F3P6
Dari lembar data STM8S103F3P6, kami dapat melihat bahwa pengontrol 8-bit kami mendukung komunikasi UART dalam berbagai mode. Pengontrol juga memiliki pin keluaran jam untuk komunikasi UART sinkron dan juga dapat mendukung SmarCard, IrDA, dan LIN. Tapi kita tidak akan mengeksplorasi semua itu dalam tutorial ini hanya untuk menjauh dari kerumitan. Kita akan belajar bagaimana membaca dan menulis UART sederhana.
Tutorial ini juga menyediakan file header bernama stm8s103 serial.h yang dengannya Anda dapat melakukan perintah UART sederhana seperti Serial begin, Serial read, serial print, dll. Pada dasarnya, Anda akan dapat mencetak char, int, dan string ke monitor serial dan juga membaca karakter dari monitor serial. Di akhir tutorial ini, Anda akan dapat mengontrol LED dari monitor serial dan mendapatkan umpan balik tentang status LED. File header yang disebutkan di atas bergantung pada pustaka SPL, jadi pastikan Anda telah mengikuti tutorial memulai.
Pin Komunikasi Serial pada STM8S103F3P6
Mari kita mulai dari sisi hardware. Melihat sekilas pinout pada mikrokontroler STM8S103F3P6 yang diberikan di bawah ini, kita dapat melihat bahwa pin 1, 2, dan 3 akan digunakan untuk komunikasi UART.
Di antara ketiganya, pin 1 adalah pin jam UART yang hanya akan digunakan selama komunikasi UART sinkron, jadi kami tidak memerlukannya di sini. Pin 2 adalah pin UART Transmitter dan Pin 3 adalah pin UART Receiver. Perhatikan bahwa pin ini juga dapat berfungsi ganda sebagai pin analog atau pin GPIO normal.
Diagram Sirkuit untuk Komunikasi Serial STM8S
Diagram rangkaian sangat sederhana di sini, kita perlu menghubungkan ST-LINK 2 untuk pemrograman dan konverter USB ke TTL untuk membaca data serial. Perhatikan bahwa pengontrol STM8S kami bekerja di level logika 3.3V, jadi pastikan konverter USB ke TTL Anda juga mendukung logika 3.3V. Diagram sirkuit lengkap ditunjukkan di bawah ini.
Anda harus menghubungkan ST-link di satu port USB dan konverter USB ke TTL di port USB lain di laptop Anda, sehingga Anda dapat memprogram dan memantau data pada saat yang bersamaan. Koneksi UART sederhana, cukup hubungkan ground dan pin Rx / Tx mikrokontroler STM8S Anda ke pin Tx / Rx dari konverter USB ke TTL. Di sini saya telah menyalakan pengontrol dengan pin Vcc dari ST-Link dan membiarkan pin vss dari konverter TTL terbuka, Anda juga dapat melakukan ini sebaliknya. Ada banyak jenis konverter USB ke TTL di pasaran, pastikan itu dapat beroperasi pada sinyal Logika 3.3V dan cari pin Tx, Rx, dan GND secara sederhana dan buat koneksi seperti yang ditunjukkan di atas. Pengaturan perangkat keras saya ditunjukkan di bawah ini.
Untuk membuat cara komunikasi serial, kami telah menyediakan file header STM8S_Serial.h . Dengan menggunakan file header ini, Anda dapat melakukan fungsi seperti Arduino sederhana untuk komunikasi serial.
Anda dapat menemukan semua file yang diperlukan untuk proyek ini di halaman Github STM8S103F3_SPL kami. Jika Anda hanya membutuhkan file header khusus ini, Anda dapat mengunduhnya dari tautan di bawah ini.
Unduh STM8S_Serial.h
Menyiapkan STVD untuk Komunikasi Serial
Untuk bekerja dengan komunikasi serial, kita akan menggunakan banyak fungsi file header STM8S_Serial.h yang telah kita diskusikan sebelumnya. Tetapi pustaka memiliki dependensi lain, banyak file C dan header terkait SPL UART dan Jam. Jadi dari titik ini, lebih baik menyertakan semua file header dan C ke proyek kita untuk menghindari kesalahan kompilasi. Lingkungan kerja STVD saya terlihat seperti ini.
Pastikan Anda telah menyertakan semua file sumber SPL dan Sertakan file seperti yang kami lakukan di tutorial pertama kami. Dan juga pastikan Anda telah menambahkan file header stm8s103_serial.h . Tidak ada file C untuk tajuk ini.
Pemrograman STM8S untuk Komunikasi Serial
Setelah pengaturan proyek STVD siap, kita dapat mulai menulis kode kita di file main.c. Kode lengkap untuk tutorial ini dapat ditemukan di bagian bawah halaman ini. Penjelasannya adalah sebagai berikut.
Langkah pertama adalah memasukkan file header yang diperlukan, di sini saya telah menambahkan file header utama (stm8s) dan file header stm8s_103_serial yang baru saja kita unduh.
// Header yang Diperlukan #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Selanjutnya, kami menggunakan makro desain untuk menentukan pin input dan output. Di sini hanya akan mengontrol LED on-board yang terhubung ke pin5 dari port B, jadi kami beri nama sebagai test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // test LED terhubung ke PB5
Pindah ke dalam fungsi utama, kita akan mendefinisikan pin sebagai keluaran. Jika Anda tidak terbiasa dengan fungsi GPIO dasar, kembali ke tutorial GPIO STM8S.
// Definisi pin // Deklarasikan PB5 sebagai push pull Pin keluaran GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Kemudian kami menginisialisasi port komunikasi serial kami pada 9600 baud rate. Bagi mereka yang baru, 9600 adalah kecepatan kecepatan bit data yang akan ditransfer selama komunikasi. Jika Anda menyetel 9600 di sini, Anda juga harus menyetelnya pada perangkat lunak pemantauan. Kemudian kami juga mencetak string "perintah Enter" dan melanjutkan ke baris berikutnya.
Serial_begin (9600); // Inisialisasi komunikasi Serial pada 9600 baud rate Serial_print_string ("Masukkan perintah"); // cetak string Serial_newline (); // pindah ke baris berikutnya
Pindah ke loop sementara tak terbatas, kami menggunakan fungsi Serial_available untuk memeriksa apakah ada data serial yang masuk. Jika ya, kami membaca dan menyimpannya dalam variabel bernama ch dan juga mencetaknya menggunakan Serial_print . Kemudian jika nilai yang diterima adalah 0 maka LED akan kita matikan dan jika nilainya 1 kita akan menyalakan LED
if (Serial_available ()) {Serial_print_string ("Anda telah menekan:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); jika (ch == '0') GPIO_WriteHigh (test_LED); // LED OFF jika (ch == '1') GPIO_WriteLow (test_LED); //MEMIMPIN }
Dengan ini, pemrograman untuk tutorial ini selesai, cukup unggah kode yang diberikan di bagian bawah halaman ini dan Anda harus dapat mengontrol LED dari monitor serial.
Mengontrol LED dari monitor Serial
Setelah Anda mengunggah kode, Anda dapat membuka monitor serial apa pun dengan kecepatan 9600 baud. Saya telah menggunakan monitor serial Arduino itu sendiri untuk kemudahan penggunaannya. Tekan tombol reset dan Anda akan melihat pesan "Enter a command". Kemudian jika Anda memasukkan 1 dan menekan enter, led on-board harus menyala, sama halnya untuk 0, itu harus mati.
Pekerjaan lengkap dapat ditemukan di video yang ditautkan di bagian bawah halaman ini. Jika Anda memiliki pertanyaan, silakan tinggalkan di bagian komentar. Anda juga dapat menggunakan forum kami untuk memposting pertanyaan teknis lainnya.
STM8S Serial Library Lihat Lebih Dalam
Bagi pemikir penasaran yang ingin tahu apa yang sebenarnya terjadi di dalam file header STM8S103F3_Serial, baca terus….
File header ini berfungsi dengan baik untuk pemrograman tingkat pemula, tetapi jika Anda menggunakan versi berbeda dari pengontrol STM8S atau mencari beberapa opsi lanjutan, Anda mungkin ingin mengubah sedikit header ini atau langsung bekerja dengan pustaka SPL. Saya menulis file header ini baru saja dari file header UART1, penjelasan file header saya adalah sebagai berikut.
Membaca karakter dari Serial Monitor
Fungsi ini membantu membaca satu karakter yang telah dikirim ke mikrokontroler dari monitor serial.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); kembali (UART1_ReceiveData8 ()); }
Kami menunggu sampai bendera RXE SET untuk menyelesaikan penerimaan dan kemudian menghapus bendera untuk menyatakan penerimaan. Akhirnya, kami mengirim data 8-bit yang diterima sebagai hasil dari fungsi ini.
Mencetak karakter ke Serial Monitor
Fungsi ini mentransmisikan satu karakter dari mikrokontroler ke monitor serial.
void Serial_print_char (nilai karakter) {UART1_SendData8 (nilai); sementara (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // tunggu pengiriman}
Fungsinya hanya menulis nilai 8-bit dan menunggu sampai transmisi selesai dengan memeriksa UART1_FLAG_TXE ke SET
Memulai Komunikasi Serial
Fungsi ini menginisialisasi komunikasi serial pada baud rate yang diperlukan.
batal 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 (); // Deinisialisasi periferal UART 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); }
Selain baud rate, ada parameter lain yang harus diatur untuk komunikasi serial, seperti jumlah bit data, jumlah stop bit, paritas, dll. Yang paling umum (mirip dengan Arduino) adalah data 8-bit dengan bit satu stop dan tanpa paritas dan karenanya akan menjadi pengaturan default. Anda dapat mengubahnya jika diperlukan.
Mencetak Integer ke Serial Monitor
Sering kali, jika kita menggunakan monitor serial untuk debugging atau monitoring, kita mungkin ingin mencetak variabel tipe int ke monitor serial. Fungsi ini melakukan hal itu
void Serial_print_int (int number) // Funtion untuk mencetak nilai int ke monitor serial {char count = 0; karakter digit = ""; while (number! = 0) // pisahkan int menjadi char array {digit = number% 10; hitung ++; angka = angka / 10; } while (count! = 0) // cetak array karakter ke arah yang benar {UART1_SendData8 (digit + 0x30); sementara (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // tunggu pengiriman hitungan--; }}
Ini mengambil nilai integer dan mengubahnya menjadi array karakter di loop sementara pertama, kemudian di loop sementara kedua, kami akan mengirimkan setiap karakter yang mirip dengan fungsi karakter cetak kami.
Mencetak baris baru
Ini adalah fungsi sederhana untuk mencetak baris baru. Nilai heks untuk melakukan itu adalah "0x0a", kami hanya mengirimkannya menggunakan perintah transmisi 8-bit.
batal Serial_newline (batal) {UART1_SendData8 (0x0a); sementara (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // tunggu pengiriman}
Mencetak string ke monitor serial
Fungsi lain yang berguna adalah mencetak string pada monitor serial.
void Serial_print_string (string karakter) {. char i = 0; sementara (string! = 0x00) {UART1_SendData8 (string); sementara (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Sekali lagi, fungsi ini juga mengubah string menjadi array karakter dan mengirimkan setiap karakter. Seperti yang kita ketahui, semua string akan bernilai null. Jadi kita hanya perlu terus melintasi dan mentransmisikan karakter sampai kita mencapai nol 0x00.
Memeriksa apakah data serial tersedia untuk dibaca
Fungsi ini memeriksa apakah ada data serial di buffer yang siap dibaca.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) return TRUE; jika tidak mengembalikan FALSE; }
Ia memeriksa bendera UART1_FLAG_RXNE , jika benar, ia mengembalikan benar dan jika tidak, ia mengembalikan salah.