- Mempersiapkan Perangkat Keras
- Memahami Pinouts GPIO di STM8S103F
- Deskripsi Pinout dan Tip untuk Pemilihan GPIO STM8S103F
- Pemrograman STM8S untuk Input dan Output GPIO menggunakan SPL
- Mengupload dan Menguji Program
Untuk mikrokontroler, program kedip LED sama dengan program “hello world”. Dalam tutorial sebelumnya, kita belajar bagaimana memulai dengan Papan Pengembangan STM8S103F3 dan bagaimana mengatur IDE dan kompiler untuk memprogram pengontrol STM8S kita. Kami juga telah mempelajari cara menggunakan pustaka periferal standar, dan cara mengompilasi dan mengunggah kode ke mikrokontroler kami. Dengan semua dasar yang tercakup, mari kita mulai menulis kode. Dalam tutorial ini, kita akan belajar bagaimana melakukan fungsi GPIO umum pada pengontrol STM8S. Papan sudah memiliki LED onboard yang terhubung ke pin 5 dari port B, kita akan belajar cara mengedipkan LED ini dan juga menambahkan LED eksternal dan mengontrolnya dengan tombol tekan. Jika Anda benar-benar baru, sangat disarankan untuk membaca tutorial sebelumnya sebelum melanjutkan lebih jauh.
Mempersiapkan Perangkat Keras
Sebelum kita menyelami program ini, persiapkan koneksi perangkat keras. Seperti yang disebutkan sebelumnya, kami akan menggunakan dua LED di sini, satu adalah LED onboard yang akan berkedip terus menerus dan yang lainnya adalah LED eksternal yang akan diaktifkan dengan menekan tombol. Idenya adalah mempelajari semua fungsi GPIO dalam pengaturan sederhana. Led on-board sudah terhubung ke PB5 (pin5 dari PORTB), jadi saya baru saja menghubungkan LED ke PA3 dan tombol tekan ke PA2, seperti yang Anda lihat pada diagram di bawah ini.
Tapi, dari semua pin output yang tersedia di control kami, mengapa saya memilih PA3 untuk output dan PA2 untuk input? Pertanyaannya valid dan saya akan menjelaskannya nanti di artikel ini. Pengaturan perangkat keras saya untuk tutorial ini ditunjukkan di bawah. Seperti yang Anda lihat, saya juga telah menghubungkan pemrogram ST-link saya ke pin pemrograman yang tidak hanya akan memprogram papan kami tetapi juga akan bertindak sebagai sumber daya.
Memahami Pinouts GPIO di STM8S103F
Sekarang kembali ke pertanyaan, mengapa PA2 untuk input dan mengapa PA3 untuk output? Untuk memahami itu, mari kita lihat lebih dekat pinout dari mikrokontroler yang ditunjukkan di bawah ini.
Sesuai diagram pinout, kami memiliki empat port pada mikrokontroler kami, yaitu, PORT A, B, C, dan D masing-masing dilambangkan dengan PA, PB, PC, dan PD. Setiap pin GPIO juga dipukuli dengan beberapa fungsi khusus lainnya. Misalnya, 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. Jadi, jika kita menggunakan pin ini untuk keperluan GPIO sederhana seperti menghubungkan LED, maka kita tidak akan dapat menggunakan I2C dan LED secara bersamaan. Sayangnya, LED on-board terhubung ke pin ini, jadi kami tidak punya banyak pilihan di sini, dan dalam program ini, kami tidak akan menggunakan I2C, jadi tidak terlalu menjadi masalah.
Deskripsi Pinout dan Tip untuk Pemilihan GPIO STM8S103F
Sebenarnya, tidak ada salahnya menggunakan PA1 pin input dan itu hanya akan berfungsi. Tetapi saya sengaja mengemukakan ini untuk memberi saya kesempatan untuk menunjukkan kepada Anda beberapa perangkap umum yang mungkin Anda hadapi saat memilih pin GPIO pada mikrokontroler baru. Cara terbaik untuk menghindari jebakan adalah dengan membaca detail pin dan deskripsi pin yang disediakan di lembar data STM8S103F3P6. Untuk keterangan pin mikrokontroler STM8S103F3P6 detail keterangan yang ada di datasheet ditunjukkan gambar dibawah ini.
Pin input pada mikrokontroler kami dapat berupa floating atau pull-up lemah dan pin output dapat berupa Open Drain atau Push-pull. Perbedaan antara pin Open Drain dan Push-Pull Output sudah dibahas, oleh karena itu kita tidak akan membahasnya secara detail. Sederhananya, pin keluaran Open Drain dapat membuat keluaran hanya serendah tidak setinggi mungkin, sedangkan pin keluaran push-pull dapat membuat keluaran sama-sama tinggi dan juga tinggi.
Selain dari tabel di atas, Anda juga dapat melihat bahwa pin output dapat berupa output Cepat (10 Mhz) atau Output Lambat (2 MHz). Ini menentukan Kecepatan GPIO, jika Anda ingin mengganti pin GPIO Anda antara tinggi dan rendah dengan sangat cepat, maka kita dapat memilih keluaran Cepat.
Beberapa pin GPIO pada pengontrol kami mendukung True Open Drain (T) dan High Sink Current (HS) seperti yang disebutkan pada gambar di atas. Perbedaan yang cukup besar antara Open Drain dan True Open Drain adalah bahwa output yang terhubung ke open drain tidak dapat ditarik lebih tinggi daripada tegangan operasi mikrokontroler (Vdd) sementara pin output open-drain yang sebenarnya dapat ditarik lebih tinggi dari Vdd. Pin dengan Kemampuan Tenggelam Tinggi berarti dapat menenggelamkan lebih banyak arus. Sumber dan arus sink dari pin GPIO HS adalah 20mA, sedangkan saluran listrik dapat mengkonsumsi hingga 100 mA.
Melihat lebih dekat gambar di atas, Anda akan melihat bahwa hampir semua pin GPIO adalah tipe High Sink Current (HS) kecuali untuk PB4 dan PB5 yang merupakan True Open Drain Type (T). Ini berarti bahwa pin ini tidak dapat dibuat tinggi, mereka tidak akan dapat memberikan 3,3V bahkan ketika pin dibuat tinggi. Inilah sebabnya mengapa led onboard terhubung ke 3.3V dan diarde melalui PB5 alih-alih menyalakannya langsung dari pin GPIO.
Lihat halaman 28 di lembar data untuk mengetahui deskripsi pin secara mendetail. Seperti yang disebutkan pada gambar di atas, PA1 secara otomatis dikonfigurasi sebagai pull-up lemah dan tidak disarankan untuk digunakan sebagai pin keluaran. Bagaimanapun itu dapat digunakan sebagai pin input bersama dengan tombol tekan, tetapi saya memutuskan untuk menggunakan PA2 hanya untuk mencoba mengaktifkan pull up dari program. Ini hanyalah beberapa hal dasar yang akan berguna ketika kita menulis program yang jauh lebih rumit. Untuk saat ini, tidak apa-apa jika banyak hal yang terlintas di kepala Anda, kita akan membahasnya di tutorial lain.
Pemrograman STM8S untuk Input dan Output GPIO menggunakan SPL
Buat ruang kerja dan proyek baru seperti yang kita bahas di tutorial pertama kita. Anda dapat menambahkan semua file header dan sumber atau hanya menambahkan file gpio, config, dan stm8s. Buka file main.c dan mulailah menulis program Anda.
Pastikan Anda telah menyertakan file header seperti yang ditunjukkan pada gambar di atas. Buka file main.c dan mulai kode. Kode main.c lengkap dapat ditemukan di bagian bawah halaman ini dan Anda juga dapat mengunduh file proyek dari sana. Penjelasan kodenya adalah sebagai berikut, Anda juga bisa merujuk ke Panduan Pengguna SPL atau video yang ditautkan di bagian bawah halaman ini jika Anda bingung tentang bagian pengkodean.
De-Inisialisasi Port yang Diperlukan
Kami memulai program kami dengan De-Inisialisasi port yang diperlukan. Seperti yang kita bahas sebelumnya, setiap pin GPIO akan memiliki banyak fungsi lain yang terkait dengannya selain hanya berfungsi seperti Input dan Output normal. Jika pin ini sebelumnya telah digunakan untuk beberapa aplikasi lain, maka itu harus De-Inisialisasi sebelum kita menggunakannya. Ini tidak wajib, namun ini adalah praktik yang baik. Dua baris kode berikut digunakan untuk De-Inisialisasi Port A dan Port B. Cukup gunakan sintaks GPIO_DeInit (GPIOx); dan sebutkan nama port di tempat x.
GPIO_DeInit (GPIOA); // siapkan Port A untuk menjalankan GPIO_DeInit (GPIOB); // siapkan Port B untuk bekerja
Deklarasi GPIO Input dan Output
Selanjutnya kita harus mendeklarasikan pin mana yang akan digunakan sebagai input dan yang mana sebagai output. Dalam kasus kami, pin PA2 akan digunakan sebagai input, kami juga akan mendeklarasikan pin ini dengan Pull-up internal sehingga kami tidak perlu menggunakannya secara eksternal. Sintaksnya adalah GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Di mana x adalah nama port, y adalah nomor pin, dan z adalah mode Pin GPIO.
// Deklarasikan PA2 sebagai input pull up pin GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Selanjutnya, kita harus mendeklarasikan pin PA3 dan PB5 sebagai output. Sekali lagi banyak jenis deklarasi keluaran yang mungkin tetapi kita akan menggunakan "GPIO_MODE_OUT_PP_LOW_SLOW" yang berarti bahwa kita akan mendeklarasikannya sebagai pin keluaran tipe push-pull dengan kecepatan lambat. Dan secara default, nilainya akan rendah. Sintaksnya akan sama.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Deklarasikan PB5 sebagai push pull Output pin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Cuplikan di bawah ini dari manual pengguna SPL menyebutkan semua kemungkinan mode GPIO (z).
Loop sementara tak terbatas
Setelah deklarasi pin, kita perlu membuat loop tanpa batas yang di dalamnya kita akan terus mengedipkan LED selamanya dan memantau status tombol tekan untuk mengaktifkan LED. Loop tak hingga dapat dibuat dengan a while (1) atau dengan a for (;;) . Disini saya telah menggunakan while (1).
sementara (1) {}
Memeriksa status pin Input
Kita harus memeriksa status dari pin input, sintaks untuk melakukannya adalah GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); dimana x adalah nama port dan y adalah nomor pin. Jika pin tinggi, kita akan mendapatkan '1' dan jika pin rendah, kita akan mendapatkan '0'. Kami telah terbiasa di dalam loop if untuk memeriksa apakah pin tinggi atau rendah.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // jika tombol ditekan
Membuat Pin GPIO Tinggi atau Rendah
Untuk membuat pin GPIO High atau Low, kita bisa menggunakan GPIO_WriteHigh (GPIOx, GPIO_PIN_y); dan GPIO_WriteLow (GPIOx, GPIO_PIN_y); masing-masing. Disini kita telah membuat LED menyala jika tombol ditekan dan mati jika tombol tidak ditekan.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // jika tombol ditekan GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED ON lain GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED MATI
Mengalihkan Pin GPIO
Untuk mengaktifkan pin GPIO, kami memiliki GPIO_WriteReverse (GPIOx, GPIO_PIN_y); memanggil fungsi ini akan mengubah status pin keluaran. Jika pin tinggi maka akan diubah menjadi rendah, dan jika rendah akan diubah menjadi tinggi. Kami menggunakan fungsi ini untuk mengedipkan LED onboard pada PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Fungsi Delay
Tidak seperti Arduino, penyusun kosmik tidak memiliki fungsi penundaan yang telah ditentukan sebelumnya. Jadi kita harus membuatnya sendiri. Fungsi penundaan saya diberikan di bawah ini. Nilai delay akan diterima dalam variabel ms dan kita akan menggunakan dua for loop untuk menahan atau mengeksekusi program. Seperti _asm ("nop") adalah instruksi perakitan yang berarti tidak ada operasi. Ini berarti bahwa pengontrol akan melakukan perulangan ke loop for tanpa melakukan operasi apa pun, sehingga menimbulkan penundaan.
void delay (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 melakukan operasi // kode perakitan}}
Mengupload dan Menguji Program
Sekarang program kita sudah siap, kita dapat mengunggah dan mengujinya. Setelah diunggah, perangkat keras saya berfungsi seperti yang diharapkan. LED merah on-board berkedip setiap 500 milidetik dan LED hijau eksternal menyala setiap kali saya menekan sakelar.
Pekerjaan lengkap dapat ditemukan di video yang ditautkan di bawah ini. Setelah Anda mencapai titik ini, Anda dapat mencoba menghubungkan sakelar dan LED ke pin yang berbeda dan menulis ulang kode untuk memahami konsepnya. Anda juga dapat bermain-main dengan waktu tunda untuk memeriksa apakah Anda telah memahami konsep dengan jelas.
Jika Anda memiliki pertanyaan, silakan tinggalkan di bagian komentar di bawah dan untuk pertanyaan teknis lainnya, Anda dapat menggunakan forum kami. Terima kasih telah mengikuti, sampai jumpa di tutorial berikutnya.