- Jenis Interupsi dan ISR
- Sintaks untuk Interupsi di STM32
- Komponen Diperlukan
- Diagram Sirkuit dan Koneksi
- Pemrograman STM32F103C8 untuk interupsi
Interupsi adalah mekanisme di mana I / O atau instruksi dapat menangguhkan eksekusi normal prosesor dan mendapatkan servis sendiri seolah-olah memiliki prioritas tertinggi. Seperti misalnya, prosesor yang melakukan eksekusi normal juga dapat terus memantau beberapa jenis peristiwa atau interupsi yang akan terjadi. Yaitu ketika terjadi interupsi eksternal (seperti dari beberapa sensor) maka prosesor menghentikan eksekusi normalnya dan pertama-tama melayani interupsi dan kemudian melanjutkan eksekusi normalnya.
Di sini, di proyek ini, untuk memahami Interupsi di STM32F103C8, kami akan menggunakan tombol tekan sebagai interupsi eksternal. Di sini kita akan menambah angka dari 0 dan menampilkannya pada LCD 16x2, dan setiap kali tombol ditekan, led menyala dan layar LCD menunjukkan INTERRUPT. LED mati segera setelah tombol dilepaskan.
Jenis Interupsi dan ISR
Interupsi secara luas dapat diklasifikasikan menjadi dua jenis:
Interupsi Perangkat Keras: Jika sinyal ke prosesor berasal dari beberapa perangkat eksternal seperti tombol atau sensor atau dari perangkat keras lain yang menghasilkan sinyal dan memberi tahu prosesor untuk melakukan tugas tertentu yang ada di ISR dikenal sebagai interupsi perangkat keras.
Interupsi Perangkat Lunak: Interupsi yang dihasilkan oleh instruksi perangkat lunak.
Rutin Layanan Interupsi
Interrupt Service Routine atau Interrupt handler adalah peristiwa yang memiliki sekumpulan kecil instruksi di dalamnya dan ketika terjadi interupsi, prosesor pertama-tama menjalankan kode ini yang ada di ISR dan kemudian melanjutkan tugas yang dilakukannya sebelum interupsi.
Sintaks untuk Interupsi di STM32
ISR memiliki sintaks berikut attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) di Arduino dan hal yang sama juga dapat digunakan di STM32 karena kami menggunakan arduino IDE untuk mengunggah kode.
- digitalPinToInterrupt (pin): Seperti di papan Arduino Uno kami memiliki pin 2,3 & di mega kami memiliki 2,3,18,19,20,21 untuk interupsi. Di STM32F103C8 kami juga memiliki pin interupsi, semua pin GPIO dapat digunakan untuk interupsi. Kami hanya menentukan pin input yang kami gunakan untuk interupsi. Namun saat menggunakan lebih dari satu interupsi pada saat yang sama, kami mungkin perlu mengikuti beberapa batasan.
- ISR: Ini adalah fungsi pengendali Interupsi yang dipanggil ketika interupsi eksternal terjadi. Tidak ada argumen dan tipe pengembalian kosong.
- Mode: Jenis transisi untuk memicu interupsi
- RISING: Untuk memicu interupsi ketika pin berpindah dari LOW ke HIGH.
- JATUH: Untuk memicu interupsi saat pin berpindah dari HIGH ke LOW.
- CHANGE: Untuk memicu interupsi saat pin berpindah dari LOW ke HIGH atau HIGH ke LOW (yaitu, saat pin berubah).
Beberapa kondisi saat menggunakan interupsi
- Fungsi Interrupt Service Routine (ISR) harus sesingkat mungkin.
- Fungsi Delay () tidak bekerja di dalam ISR dan harus dihindari.
Komponen Diperlukan
- STM32F103C8
- Tekan tombol
- LED
- Resistor (10K)
- LCD (16x2)
Diagram Sirkuit dan Koneksi
Satu sisi pin push button terhubung ke 3.3V STM32 dan sisi lainnya terhubung ke pin input (PA0) STM32 melalui resistor pull down.
Resistor Pull Down digunakan sehingga mikrokontroler hanya akan mendapatkan input TINGGI atau RENDAH ketika tombol ditekan atau dilepaskan. Jika tidak, tanpa resistor pull down, MCU mungkin bingung dan memberi makan beberapa nilai mengambang acak ke input.
Koneksi antara STM32F103C8 dan LCD
Tabel berikut menunjukkan hubungan pin antara LCD (16X2) dan mikrokontroler STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Ke PIN Pusat Potensiometer |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
SEBUAH |
GND |
K |
Pemrograman STM32F103C8 untuk interupsi
Program untuk tutorial ini sederhana dan diberikan di akhir tutorial ini. Kami tidak memerlukan programmer FTDI untuk memprogram STM32, cukup hubungkan PC Anda ke port USB STM32 dan mulai pemrograman dengan Arduino IDE. Pelajari lebih lanjut tentang pemrograman STM32 melalui port USB.
Seperti yang kami katakan bahwa di sini dalam tutorial ini kita akan menambah angka dari 0 dan menampilkannya pada LCD 16x2 dan setiap kali tombol tekan ditekan, led menyala dan layar LCD menunjukkan 'INTERRUPT'.
Pertama tentukan koneksi pin LCD dengan STM32. Anda dapat memodifikasinya sesuai kebutuhan Anda.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Selanjutnya, kami menyertakan file header untuk tampilan LCD. Ini memanggil perpustakaan yang berisi kode bagaimana STM32 harus berkomunikasi dengan LCD. Juga pastikan fungsi LiquidCrystal dipanggil dengan nama pin yang baru saja kita definisikan di atas.
termasuk
Variabel global digunakan untuk melewatkan data antara ISR dan program utama. Kami mendeklarasikan variabel ledOn sebagai volatile dan juga sebagai Boolean untuk menentukan True atau False.
volatile boolean ledOn = false;
Di dalam fungsi void setup () , kami akan menampilkan pesan intro dan menghapusnya setelah 2 detik.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); penundaan (2000); lcd.clear ();
Sekali lagi dalam fungsi void setup () yang sama , kita perlu menentukan pin input dan output. Kami mengatur pin PA1 untuk output ke LED dan PA0 untuk input dari tombol tekan.
PinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Kami juga akan menambah angka, jadi nyatakan variabel dengan nilai nol.
int i = 0;
Sekarang bagian penting dari kode tersebut adalah fungsi attachInterrupt () , itu juga termasuk di dalam void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Kami menetapkan pin PA0 untuk interupsi eksternal, dan buttonPressed adalah fungsi yang akan dipanggil ketika ada CHANGE (LOW to HIGH atau HIGH to LOW) di pin PA0. Anda juga dapat menggunakan nama fungsi, pin dan mode lainnya sesuai kebutuhan.
Di dalam void loop () kami menambah angka (i) dari nol dan mencetak angka dalam LCD (16x2).
lcd.clear (); lcd.print ("NOMOR:"); lcd.print (i); ++ i; penundaan (1000);
Bagian terpenting adalah membuat fungsi penangan interupsi sesuai dengan nama yang kita gunakan dalam fungsi attachInterrupt () . Kami menggunakan buttonPressed jadi di sini kami telah membuat fungsi void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } lain { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interupsi"); } }
Cara kerja tombol iniTekan () ISR:
Menurut nilai variabel ledOn , LED menyala dan mati.
TOMBOL NEGARA |
ledOn (Nilai) |
LED (Merah) |
LCD (16x2) |
TERTEKAN |
Salah |
MATI |
- |
PRESSED |
Benar |
DI |
Menunjukkan '' INTERRUPT ' |
Jika nilai ledOn false maka LED tetap mati dan jika nilai ledOn adalah True maka LED menyala dan layar LCD menampilkan 'Interrupt'.
CATATAN: Kadang-kadang mungkin ada efek pantulan sakelar dan dapat menghitung beberapa pemicu saat tombol ditekan, ini karena beberapa lonjakan tegangan karena alasan mekanis mengganti tombol tekan. Ini dapat dikurangi dengan memperkenalkan filter RC.
Kerja lengkap interupsi di STM32F103C8 ditunjukkan pada video di bawah ini.