- Menyiapkan Perkakasan
- Memahami Pin Pin GPIO di STM8S103F
- Huraian Pinout dan Petua untuk Pemilihan GPIO STM8S103F
- Pengaturcaraan STM8S untuk Input dan Keluaran GPIO menggunakan SPL
- Memuat naik dan Menguji Program
Untuk mikrokontroler, program berkelip LED setara dengan program "hello world". Dalam tutorial sebelumnya, kami belajar bagaimana untuk memulakan dengan Lembaga Pembangunan STM8S103F3 dan cara menyiapkan IDE dan penyusun untuk memprogram pengawal STM8S kami. Kami juga telah belajar bagaimana menggunakan perpustakaan periferal standard, dan bagaimana menyusun dan memuat naik kod ke dalam mikrokontroler kami. Dengan semua asas yang diliputi, mari kita mula menulis kod. Dalam tutorial ini, kita akan belajar bagaimana melaksanakan fungsi GPIO umum pada pengawal STM8S. Papan sudah mempunyai LED onboard yang disambungkan ke pin 5 dari port B, kita akan belajar bagaimana untuk mengedipkan LED ini dan juga menambahkan LED luaran dan mengawalnya dengan menekan butang. Sekiranya anda benar-benar baru, sangat disarankan untuk membaca tutorial sebelumnya sebelum anda meneruskannya lebih jauh.
Menyiapkan Perkakasan
Sebelum kita menyelami program ini, mari siapkan sambungan perkakasan. Seperti yang telah disebutkan sebelumnya, kami akan menggunakan dua LED di sini, satu adalah LED onboard yang akan berkedip berterusan dan yang lain adalah LED luaran yang akan ditukar dengan butang tekan. Ideanya adalah untuk mempelajari semua fungsi GPIO dalam penyediaan yang mudah. Led on-board sudah disambungkan ke PB5 (pin5 PORTB), jadi saya baru saja menyambungkan LED ke PA3 dan butang tekan ke PA2, seperti yang anda lihat dalam rajah di bawah.
Tetapi, dari semua pin output yang ada di kawalan kami mengapa saya memilih PA3 untuk output dan PA2 untuk input? Soalannya sah dan saya akan menerangkannya kemudian dalam artikel ini. Penyediaan perkakasan saya untuk tutorial ini ditunjukkan di bawah. Seperti yang anda lihat, saya juga telah menghubungkan pemrogram ST-link saya ke pin pengaturcaraan yang bukan sahaja akan memprogram papan kami tetapi juga akan berfungsi sebagai sumber kuasa.
Memahami Pin Pin GPIO di STM8S103F
Sekarang kembali kepada persoalan, mengapa PA2 untuk input dan mengapa PA3 untuk output? Untuk memahaminya, mari kita perhatikan lebih dekat pin mikrokontroler yang ditunjukkan di bawah.
Seperti pada rajah pinout, kami mempunyai empat port pada mikrokontroler kami, yaitu, PORT A, B, C, dan D masing-masing dilambangkan oleh PA, PB, PC, dan PD. Setiap pin GPIO juga digabungkan dengan beberapa fungsi khas yang lain. Sebagai contoh, PB5 (pin 5 PORT B) tidak hanya dapat berfungsi sebagai pin GPIO tetapi juga sebagai pin SDA untuk komunikasi I2C dan sebagai pin output Timer 1. Oleh itu, jika kita menggunakan pin ini untuk tujuan GPIO sederhana seperti menyambungkan LED, kita tidak akan dapat menggunakan I2C dan LED pada masa yang sama. Malangnya, LED on-board disambungkan ke pin ini, jadi kami tidak mempunyai banyak pilihan di sini, dan dalam program ini, kami tidak akan menggunakan I2C, jadi tidak banyak masalah.
Huraian Pinout dan Petua untuk Pemilihan GPIO STM8S103F
Sejujurnya, tidak ada salahnya menggunakan pin input PA1 dan hanya berfungsi sebagai pin. Tetapi saya sengaja mengemukakannya untuk memberi saya peluang untuk menunjukkan kepada anda beberapa perangkap biasa yang mungkin anda hadapi ketika memilih pin GPIO pada mikrokontroler baru. Yang terbaik untuk mengelakkan perangkap adalah dengan membaca perincian pin dan keterangan pin yang terdapat dalam lembaran data STM8S103F3P6. Untuk perincian keterangan pin mikrokontroler STM8S103F3P6 yang dinyatakan dalam lembar data ditunjukkan gambar di bawah.
Pin input pada mikrokontroler kami boleh berupa tarikan apungan atau lemah dan pin output boleh menjadi Open Drain atau Push-pull. Perbezaan antara Open Drain dan Push-Pull Output pin sudah dibincangkan, oleh itu kami tidak akan memperincikannya. Sederhananya, pin output Open Drain dapat membuat output hanya serendah tidak setinggi, sedangkan pin output push-pull dapat membuat output sama tinggi dan tinggi.
Selain dari jadual di atas, anda juga dapat melihat bahawa pin output boleh menjadi output Cepat (10 Mhz) atau Slow Output (2 MHz). Ini menentukan Kelajuan GPIO, jika anda ingin menukar pin GPIO anda antara tinggi dan rendah sangat cepat, maka kita dapat memilih output Cepat.
Beberapa pin GPIO pada alat kawalan kami menyokong True Open Drain (T) dan High Sink Current (HS) seperti yang disebutkan dalam gambar di atas. Perbezaan yang ketara antara Open Drain dan True Open Drain adalah bahawa output yang disambungkan ke longkang terbuka tidak dapat ditarik lebih tinggi daripada voltan operasi mikrokontroler (Vdd) sementara pin output longkang terbuka dapat ditarik lebih tinggi daripada Vdd. Pin dengan Kapasiti Tenggelam Tinggi bermakna ia dapat tenggelam lebih banyak arus. Punca dan arus sink dari mana-mana pin GPIO HS ialah 20mA, sementara talian kuasa boleh menggunakan hingga 100 mA.
Dengan melihat lebih dekat pada gambar di atas, anda akan melihat bahawa hampir semua pin GPIO adalah jenis High Sink Current (HS) kecuali PB4 dan PB5 yang merupakan True Open Drain Type (T). Ini bermaksud bahawa pin ini tidak boleh dibuat tinggi, mereka tidak akan dapat menyediakan 3.3V walaupun pin dibuat tinggi. Inilah sebabnya mengapa plumbum onboard disambungkan ke 3.3V dan dibumikan melalui PB5 dan bukannya menyalakannya secara langsung dari pin GPIO.
Rujuk halaman 28 pada lembar data untuk keterangan pin terperinci. Seperti disebutkan dalam gambar di atas, PA1 secara otomatis dikonfigurasi sebagai pull-up yang lemah dan tidak disarankan untuk digunakan sebagai pin output. Bagaimanapun ia dapat digunakan sebagai pin masukan bersama dengan tombol tekan, tetapi saya memutuskan untuk menggunakan PA2 hanya untuk mencoba mengaktifkan program. Ini hanya beberapa perkara asas yang akan berguna ketika kita menulis program yang lebih rumit. Buat masa ini, tidak apa-apa jika banyak perkara melambung di kepala anda, kita akan masuk ke dalamnya dalam tutorial lain.
Pengaturcaraan STM8S untuk Input dan Keluaran GPIO menggunakan SPL
Buat ruang kerja dan projek baru seperti yang kita bincangkan dalam tutorial pertama kami. Anda boleh menambah semua fail header dan sumber atau hanya menambah fail gpio, config, dan stm8s. Buka fail main.c dan mulakan menulis program anda.
Pastikan anda memasukkan fail tajuk seperti yang ditunjukkan pada gambar di atas. Buka fail main.c dan mulakan kodnya. Kod main.c yang lengkap boleh didapati di bahagian bawah halaman ini dan anda juga dapat memuat turun fail projek dari sana. Penjelasan mengenai kodnya adalah seperti berikut, anda juga boleh merujuk ke manual Pengguna SPL atau video yang dipautkan di bahagian bawah halaman ini jika anda keliru mengenai bahagian pengekodan.
Nyah-Memulakan Port yang Diperlukan
Kami memulakan program kami dengan De-Initializing port yang diperlukan. Seperti yang telah kita bincangkan sebelumnya, setiap pin GPIO akan mempunyai banyak fungsi lain yang berkaitan dengannya selain hanya berfungsi seperti Input dan Output biasa. Sekiranya pin ini sebelumnya telah digunakan untuk beberapa aplikasi lain, maka pin ini harus Diinisialisasi sebelum kita menggunakannya. Itu tidak wajib, namun itu adalah amalan yang baik. Dua baris kod berikut digunakan untuk De-Initialize Port A dan Port B. Cukup gunakan sintaks GPIO_DeInit (GPIOx); dan sebutkan nama port di tempat x.
GPIO_DeInit (GPIOA); // sediakan Port A untuk berfungsi GPIO_DeInit (GPIOB); // sediakan Pelabuhan B untuk bekerja
Deklarasi GPIO Input dan Output
Seterusnya, kita harus menyatakan pin mana yang akan digunakan sebagai input dan mana sebagai output. Dalam kes kami, pin PA2 akan digunakan sebagai input, kami juga akan menyatakan pin ini dengan Pull-up dalaman sehingga kami tidak perlu menggunakannya secara luaran. Sintaksnya adalah GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Di mana x adalah nama port, y adalah nombor pin, dan z adalah mod Pin GPIO.
// Nyatakan PA2 sebagai pin pull up input GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Seterusnya, kita harus menyatakan pin PA3 dan PB5 sebagai output. Sekali lagi banyak jenis pengisytiharan output mungkin dilakukan tetapi kami akan menggunakan "GPIO_MODE_OUT_PP_LOW_SLOW" yang bermaksud bahawa kami akan menyatakannya sebagai pin output dari jenis push-pull dengan kecepatan perlahan. Dan secara lalai, nilainya akan rendah. Sintaksnya akan sama.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Nyatakan PB5 sebagai pin Output push pin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Petikan di bawah dari manual pengguna SPL menyebutkan semua kemungkinan mod GPIO (z).
Gelung sambil tak terhingga
Selepas pengisytiharan pin, kita perlu membuat gelung tanpa batas di mana kita akan terus berkelip LED untuk selamanya dan memantau status butang tekan untuk menukar LED. Gelung tak terhingga boleh dibuat dengan beberapa saat (1) atau dengan a untuk (;;) . Di sini saya telah menggunakan semasa (1).
semasa (1) {}
Memeriksa status pin Input
Kita harus menyemak status pin input, sintaks yang harus dilakukan ialah GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); di mana x adalah nama port dan y adalah nombor pin. Sekiranya pin tinggi, kita akan mendapat '1' dan jika pin rendah, kita akan mendapat '0'. Kami pernah menggunakan gelung if untuk memeriksa apakah pin tinggi atau rendah.
jika (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // jika butang ditekan
Membuat Pin GPIO Tinggi atau Rendah
Untuk membuat pin GPIO Tinggi atau Rendah, kita boleh menggunakan GPIO_WriteHigh (GPIOx, GPIO_PIN_y); dan GPIO_WriteLow (GPIOx, GPIO_PIN_y); masing-masing. Di sini kita telah menjadikan LED untuk menyala jika butang ditekan dan mati jika butang tidak ditekan.
jika (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // jika butang ditekan GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED ON lain GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED MATI
Menukar Pin GPIO
Untuk menukar pin GPIO, kami mempunyai GPIO_WriteReverse (GPIOx, GPIO_PIN_y); memanggil fungsi ini akan mengubah status pin output. Sekiranya pin tinggi, ia akan berubah menjadi rendah, dan jika rendah, ia akan berubah menjadi tinggi. Kami menggunakan fungsi ini untuk mengedipkan LED onboard pada PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Fungsi Kelewatan
Tidak seperti Arduino, penyusun kosmik tidak mempunyai fungsi kelewatan yang telah ditentukan. Oleh itu, kita mesti membuatnya sendiri. Fungsi kelewatan saya diberikan di bawah. Nilai penundaan akan diterima dalam pemboleh ubah ms dan kami akan menggunakan dua untuk gelung untuk menahan atau melaksanakan program. Seperti _asm ("nop") adalah arahan pemasangan yang tidak bermaksud operasi. Ini bermaksud bahawa pengawal akan beralih ke gelung untuk tanpa menjalankan sebarang operasi, sehingga menimbulkan kelewatan.
kelewatan kekosongan (int ms) // Definisi Fungsi {int i = 0; int j = 0; untuk (i = 0; i <= ms; i ++) {untuk (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // Tidak menjalankan operasi // kod pemasangan}}
Memuat naik dan Menguji Program
Setelah program kami siap, kami dapat memuat naiknya dan mengujinya. Setelah dimuat naik, perkakasan saya berfungsi seperti yang diharapkan. LED merah di papan berkelip untuk setiap 500 milisaat dan LED hijau luaran menyala setiap kali saya menekan suis.
Kerja yang lengkap boleh didapati dalam video yang dipautkan di bawah. Sebaik sahaja anda mencapai tahap ini, anda boleh mencuba menghubungkan suis dan LED ke pin yang berbeza dan menulis semula kod untuk memahami konsepnya. Anda juga boleh bermain dengan penundaan masa untuk memeriksa sama ada anda telah memahami konsepnya dengan jelas.
Sekiranya anda mempunyai pertanyaan, sila tinggalkan di bahagian komen di bawah dan untuk soalan teknikal yang lain, anda boleh menggunakan forum kami. Terima kasih kerana mengikuti, sampai jumpa di tutorial seterusnya.