- Komunikasi Bersiri pada STM8S103F3P6
- Pin Komunikasi Bersiri pada STM8S103F3P6
- Diagram Litar untuk Komunikasi Bersiri STM8S
- Menyiapkan STVD untuk Komunikasi Bersiri
- Pengaturcaraan STM8S untuk Komunikasi Bersiri
- Mengawal LED dari monitor Serial
- Pandangan Lebih Dalam Perpustakaan Bersiri STM8S
Memprogram mikrokontroler baru sering memerlukan masa yang lebih lama kerana kaedah pengendalian daftar baru dan tidak mengetahui apa yang dilakukan dengan tepat. Perkara yang sama berlaku untuk penyahpepijatan juga tanpa mengatakan. Inilah sebabnya mengapa pengaturcara sering menggunakan titik putus dalam kod mereka dan melaluinya menggunakan penyahpepijat. Tetapi menggunakan penyahpepijat mungkin memerlukan perkakasan tambahan (paling mahal sekali) dan juga masa tambahan. Sebagai penggemar Arduino, satu perkara yang dapat kita semua setuju ialah menggunakan pernyataan cetak bersiri untuk menyahpepijat dan memahami kod kita menjadikan hidup lebih mudah. Apa yang dapat kita gandakan yang sama pada STM8 dengan pengkomputer kosmik C dan perpustakaan SPL? Nah, sangat mungkin, dan itulah yang akan kita lakukan dalam tutorial siri siri tutorial ketiga ini.Anda juga memeriksa cara memulakan STM8S (tutorial 1) dan STM8S GPIO (tutorial 2) jika anda benar-benar baru di sini. Selain itu, kami juga telah meneroka kemungkinan Pengaturcaraan STM8S dengan Arduino untuk permulaan yang cepat. Semua yang dikatakan mari masuk ke dalam tutorial.
Komunikasi Bersiri pada STM8S103F3P6
Dari lembaran data STM8S103F3P6, kita dapat melihat bahawa pengawal 8-bit kami menyokong komunikasi UART dalam pelbagai mod. Pengawal juga mempunyai pin output jam untuk komunikasi UART segerak dan juga dapat menyokong SmarCard, IrDA, dan LIN. Tetapi kita tidak akan menerangkan perkara itu dalam tutorial ini hanya untuk menjauhi kerumitan. Kami akan belajar bagaimana membaca dan menulis UART sederhana.
Tutorial ini juga menyediakan fail header yang disebut stm8s103 serial.h dengan menggunakan mana 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 char dari monitor bersiri. Pada akhir tutorial ini, anda akan dapat mengawal LED dari monitor bersiri dan mendapatkan maklum balas mengenai status LED. Fail tajuk yang disebutkan di atas bergantung pada perpustakaan SPL, jadi pastikan anda telah mengikuti tutorial permulaan.
Pin Komunikasi Bersiri pada STM8S103F3P6
Mari kita mulakan dari bahagian perkakasan. Melihat sekilas pin pada mikrokontroler STM8S103F3P6 yang diberikan di bawah, kita dapat melihat bahawa pin 1, 2, dan 3 akan digunakan untuk komunikasi UART.
Di antara ketiganya, pin 1 adalah pin jam UART yang akan digunakan hanya semasa komunikasi UART segerak, jadi kami tidak memerlukannya di sini. Pin 2 adalah pin Pemancar UART dan Pin 3 adalah pin Penerima UART. Perhatikan bahawa pin ini juga boleh digandakan sebagai pin analog atau pin GPIO biasa.
Diagram Litar untuk Komunikasi Bersiri STM8S
Gambarajah litar sangat mudah di sini, kita perlu menyambungkan ST-LINK 2 kita untuk pengaturcaraan dan penukar USB ke TTL untuk membaca data bersiri. Perhatikan bahawa pengawal STM8S kami berfungsi dalam tahap logik 3.3V, jadi pastikan penukar USB ke TTL anda juga menyokong logik 3.3V. Gambarajah litar lengkap ditunjukkan di bawah.
Anda harus menyambungkan pautan ST anda dalam satu port USB dan penukar USB ke TTL di port USB komputer riba yang lain, supaya anda dapat memprogram dan memantau data pada masa yang sama. Sambungan UART mudah, cukup sambungkan ground dan pin Rx / Tx mikrokontroler STM8S anda ke pin Tx / Rx penukar USB ke TTL. Di sini saya telah menghidupkan pengawal dengan pin Vcc ST-Link dan membiarkan pin vss dari TTL converter terbuka, anda juga boleh melakukan ini sebaliknya. Terdapat banyak jenis penukar USB ke TTL di pasaran, pastikan ia boleh beroperasi pada isyarat Logik 3.3V dan penampilan ringkas untuk pin Tx, Rx, dan GND dan buat sambungan seperti di atas. Penyediaan perkakasan saya ditunjukkan di bawah.
Untuk membuat cara komunikasi bersiri, kami telah menyediakan fail tajuk STM8S_Serial.h . Dengan menggunakan fail tajuk ini, anda dapat menjalankan fungsi seperti Arduino yang sederhana untuk komunikasi bersiri.
Anda boleh mendapatkan semua fail yang diperlukan untuk projek ini di halaman Github STM8S103F3_SPL kami. Sekiranya anda hanya memerlukan fail tajuk ini, anda boleh memuat turunnya dari pautan di bawah.
Muat turun STM8S_Serial.h
Menyiapkan STVD untuk Komunikasi Bersiri
Untuk bekerja dengan komunikasi bersiri, kita akan menggunakan banyak menggunakan fungsi fail header STM8S_Serial.h yang telah kita bincangkan sebelumnya. Tetapi perpustakaan mempunyai kebergantungan lain, banyak fail header dan C yang berkaitan dengan SPL UART dan Jam. Oleh itu, lebih baik memasukkan semua tajuk dan fail C ke projek kami untuk mengelakkan ralat penyusunan. Persekitaran kerja STVD saya kelihatan seperti ini.
Pastikan anda telah memasukkan semua fail sumber SPL dan Sertakan fail seperti yang kami lakukan dalam tutorial pertama kami. Dan juga pastikan anda telah menambahkan fail tajuk stm8s103_serial.h . Tidak ada fail C untuk tajuk ini.
Pengaturcaraan STM8S untuk Komunikasi Bersiri
Setelah persediaan projek STVD siap, kita boleh mula menulis kod kita dalam fail main.c. Kod lengkap untuk tutorial ini terdapat di bahagian bawah halaman ini. Penjelasannya adalah seperti berikut.
Langkah pertama adalah memasukkan fail tajuk yang diperlukan, di sini saya telah menambahkan fail tajuk utama (stm8s) dan fail tajuk stm8s_103_serial yang baru sahaja kita muat turun.
// Header yang diperlukan #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Seterusnya, kami menggunakan makro reka bentuk untuk menentukan pin input dan output. Di sini hanya akan mengawal LED on-board yang disambungkan ke pin5 port B, jadi kami memberikannya sebagai test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // LED ujian disambungkan ke PB5
Melangkah ke dalam fungsi utama, kita akan menentukan pin sebagai output. Sekiranya anda tidak biasa dengan fungsi GPIO asas, kembali ke tutorial STIO STM8S.
// Definisi pin // Nyatakan PB5 sebagai pin Output tarik GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Kemudian kami memulakan port komunikasi bersiri kami pada kadar 9600 baud. Bagi mereka yang baru, 9600 adalah kadar kelajuan bit data akan dipindahkan semasa komunikasi. Sekiranya anda menetapkan 9600 di sini, anda juga harus menetapkan yang sama pada perisian pemantauan. Kemudian kami juga mencetak string "Enter command" dan beralih ke baris seterusnya.
Serial_begin (9600); // Memulakan komunikasi Serial pada kadar baud 9600 Serial_print_string ("Enter command"); // cetak rentetan Serial_newline (); // beralih ke baris seterusnya
Melangkah ke loop sementara tanpa batas , kami menggunakan fungsi Serial_available untuk memeriksa apakah ada data bersiri yang masuk. Sekiranya ya, kami membaca dan menyimpannya dalam pemboleh ubah yang disebut ch dan juga mencetak yang sama menggunakan Serial_print . Kemudian jika nilai yang diterima adalah 0, kita akan mematikan LED dan jika 1, kita akan menyalakan LED
if (Serial_available ()) {Serial_print_string ("Anda telah menekan:"); ch = Serial_read_char (); Serial_print_char (ch); Talian_siri (); jika (ch == '0') GPIO_WriteHigh (test_LED); // LED MATI jika (ch == '1') GPIO_WriteLow (test_LED); // LED HIDUP}
Dengan ini, pengaturcaraan untuk tutorial ini selesai, cukup muat naik kod yang diberikan di bahagian bawah halaman ini dan anda seharusnya dapat mengawal LED dari monitor bersiri.
Mengawal LED dari monitor Serial
Setelah memuat naik kod, anda boleh membuka monitor bersiri pada kadar 9600 baud. Saya telah menggunakan monitor bersiri Arduino itu sendiri untuk kemudahan menggunakannya. Tekan butang reset dan anda akan melihat pesan "Masukkan perintah". Kemudian jika anda memasukkan 1 dan tekan enter, led on-board harus dihidupkan, sama seperti 0, ia harus dimatikan.
Penyelesaian yang lengkap boleh didapati dalam video yang dipautkan di bahagian bawah halaman ini. Sekiranya anda mempunyai pertanyaan, sila tinggalkan di bahagian komen. Anda juga boleh menggunakan forum kami untuk menghantar soalan teknikal lain.
Pandangan Lebih Dalam Perpustakaan Bersiri STM8S
Bagi mereka yang ingin tahu yang ingin mengetahui apa yang sebenarnya berlaku di dalam fail tajuk STM8S103F3_Serial yang dibaca pada….
Fail header ini berfungsi dengan baik untuk pengaturcaraan peringkat pemula, tetapi jika anda menggunakan pengawal STM8S versi lain atau mencari beberapa pilihan lanjutan, anda mungkin ingin mengubah header ini sedikit atau bekerja secara langsung dengan perpustakaan SPL. Saya menulis fail header ini sama seperti fail header UART1, penjelasan fail header saya adalah seperti berikut.
Membaca watak dari Serial Monitor
Fungsi ini membantu membaca satu watak yang telah dihantar ke mikrokontroler dari monitor bersiri.
char Serial_read_char (void) {sementara (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); pulangan (UART1_ReceiveData8 ()); }
Kami menunggu sehingga bendera RXE diatur untuk menyelesaikan penerimaan dan kemudian membersihkan bendera untuk mengetahui penerimaannya. Akhirnya, kami menghantar data 8-bit yang diterima sebagai hasil daripada fungsi ini.
Mencetak watak ke Serial Monitor
Fungsi ini menghantar satu watak dari mikrokontroler ke monitor bersiri.
batal Serial_print_char (nilai char) {UART1_SendData8 (nilai); sementara (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // tunggu penghantaran}
Fungsi hanya menulis nilai 8-bit dan menunggu sehingga penghantaran selesai dengan memeriksa UART1_FLAG_TXE ke SET
Memulakan Komunikasi Bersiri
Fungsi ini memulakan komunikasi bersiri pada kadar baud 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 (); // Deinitialize UART periferal 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 dari kadar baud, ada parameter lain yang harus ditetapkan untuk komunikasi bersiri, seperti jumlah bit data, jumlah bit berhenti, paritas, dan lain-lain. Yang paling biasa (serupa dengan Arduino) adalah data 8-bit dengan sekali berhenti dan tanpa pariti dan oleh itu itu akan menjadi tetapan lalai. Anda boleh mengubahnya jika diperlukan.
Mencetak Integer ke Serial Monitor
Selalunya, jika kita menggunakan monitor bersiri untuk debug atau pemantauan, kita mungkin ingin mencetak variabel jenis int ke monitor bersiri. Fungsi ini betul-betul melakukannya
batal Serial_print_int (nombor int) // Kesediaan untuk mencetak nilai int ke monitor bersiri {char count = 0; digit char = ""; while (number! = 0) // bahagikan int ke char char {digit = number% 10; kira ++; nombor = nombor / 10; } sementara (hitung! = 0) // cetak array char ke arah yang betul {UART1_SendData8 (digit + 0x30); sementara (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // tunggu kiriman--; }}
Ia mengambil nilai integer dan mengubahnya menjadi array watak pada gelung while pertama, kemudian pada loop sementara kedua, kami akan menghantar setiap watak yang serupa dengan fungsi char print kami.
Mencetak baris baru
Ini adalah fungsi mudah untuk mencetak baris baru. Nilai hex yang harus dilakukan adalah "0x0a", kami hanya menghantarnya menggunakan perintah transmit 8-bit.
batal Serial_newline (batal) {UART1_SendData8 (0x0a); sementara (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // tunggu penghantaran}
Mencetak rentetan ke monitor bersiri
Fungsi lain yang berguna ialah mencetak rentetan pada monitor bersiri.
batal Serial_print_string (rentetan char) {. char i = 0; sementara (tali! = 0x00) {UART1_SendData8 (rentetan); sementara (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); saya ++; }}
Sekali lagi, fungsi ini juga menukar rentetan ke array char dan menghantar setiap watak. Seperti yang kita ketahui, semua tali akan sia-sia. Oleh itu, kita harus terus melintasi dan menghantar watak-watak sehingga kita mencapai 0x00 nol.
Memeriksa sama ada data bersiri tersedia untuk dibaca
Fungsi ini memeriksa sama ada terdapat data bersiri dalam penyangga yang siap dibaca.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) pulangkan TRUE; lain pulangkan SALAH; }
Ia memeriksa bendera UART1_FLAG_RXNE , jika benar, ia akan kembali benar dan jika tidak, ia akan kembali palsu.