- Jenis Gangguan dan ISR
- Sintaks untuk Gangguan dalam STM32
- Komponen Diperlukan
- Diagram dan Sambungan Litar
- Pengaturcaraan STM32F103C8 untuk gangguan
Interupsi adalah mekanisme di mana I / O atau arahan dapat menangguhkan pelaksanaan prosesor yang normal dan diservis sendiri seperti yang mempunyai keutamaan tertinggi. Seperti misalnya, pemproses yang melakukan pelaksanaan normal juga dapat terus memantau beberapa jenis kejadian atau gangguan yang berlaku. Iaitu apabila gangguan luaran berlaku (seperti dari beberapa sensor) maka pemproses menjeda pelaksanaan normalnya dan pertama kali menghentikan gangguan tersebut dan kemudian meneruskan pelaksanaannya yang normal.
Di sini, dalam projek ini, untuk memahami gangguan di STM32F103C8, kami akan menggunakan butang tekan sebagai gangguan luaran. Di sini kita akan menambah angka dari 0 dan memaparkannya pada LCD 16x2, dan setiap kali butang tekan ditekan, LED menyala dan paparan LCD menunjukkan INTERRUPT. LED mati sebaik sahaja butang dilepaskan.
Jenis Gangguan dan ISR
Gangguan boleh dikelaskan secara meluas kepada dua jenis:
Gangguan Perkakasan: Sekiranya isyarat ke pemproses adalah dari beberapa peranti luaran seperti butang atau sensor atau dari beberapa peranti perkakasan lain yang menghasilkan isyarat dan menyuruh pemproses untuk melakukan tugas tertentu yang terdapat dalam ISR dikenali sebagai gangguan perkakasan.
Gangguan Perisian: Gangguan yang dihasilkan oleh arahan perisian.
Ganggu Perkhidmatan Rutin
Rutin Perkhidmatan Interrupt atau pengendali Interrupt adalah peristiwa yang mempunyai sekumpulan kecil instruksi di dalamnya dan ketika gangguan berlaku, pemproses terlebih dahulu melaksanakan kod ini yang ada di ISR dan kemudian meneruskan tugas yang dilakukannya sebelum gangguan tersebut.
Sintaks untuk Gangguan dalam STM32
ISR telah mengikuti sintaks attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) di Arduino dan yang sama juga dapat digunakan di STM32 kerana kami menggunakan arduino IDE untuk memuat naik kod.
- digitalPinToInterrupt (pin): Seperti di papan Arduino Uno kita mempunyai pin 2,3 & di mega kita mempunyai 2,3,18,19,20,21 untuk gangguan. Di STM32F103C8 kami juga mempunyai pin interrupt mana-mana pin GPIO boleh digunakan untuk gangguan. Kami hanya untuk menentukan pin input yang kami gunakan untuk gangguan. Tetapi semasa menggunakan lebih dari satu gangguan pada masa yang sama, kita mungkin perlu mengikuti beberapa batasan.
- ISR: Ini fungsi pengendali Interrupt yang dipanggil ketika gangguan luaran berlaku. Ia tidak mempunyai argumen dan jenis pengembalian yang tidak sah.
- Mod: Jenis peralihan untuk mencetuskan gangguan
- RISING: Untuk mencetuskan gangguan ketika pin bergerak dari RENDAH ke TINGGI.
- JATUH: Untuk mencetuskan gangguan ketika pin beralih dari TINGGI ke RENDAH.
- PERUBAHAN: Untuk mencetuskan gangguan ketika pin bergerak sama ada dari RENDAH ke TINGGI atau TINGGI ke RENDAH (iaitu, apabila pin berubah).
Beberapa keadaan semasa menggunakan gangguan
- Fungsi Interrupt Service Routine (ISR) mestilah sesingkat mungkin.
- Fungsi Delay () tidak berfungsi di dalam ISR dan harus dielakkan.
Komponen Diperlukan
- STM32F103C8
- Tekan butang
- LED
- Perintang (10K)
- LCD (16x2)
Diagram dan Sambungan Litar
Satu sisi pin butang disambungkan ke 3.3V STM32 dan sisi lain disambungkan ke pin input (PA0) STM32 melalui perintang tarik ke bawah.
Pull Down resistor digunakan supaya mikrokontroler hanya akan mendapat sama ada TINGGI atau RENDAH pada inputnya apabila butang ditekan atau dilepaskan. Jika tidak, tanpa perintang tarik ke bawah, MCU mungkin menjadi keliru dan memasukkan beberapa nilai terapung secara rawak ke input.
Sambungan antara STM32F103C8 dan LCD
Jadual berikut menunjukkan sambungan 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 |
A |
GND |
K |
Pengaturcaraan STM32F103C8 untuk gangguan
Program untuk tutorial ini mudah dan diberikan pada akhir tutorial ini. Kami tidak memerlukan programmer FTDI untuk memprogram STM32, cukup sambungkan PC anda ke port USB STM32 dan mulakan pengaturcaraan dengan Arduino IDE. Ketahui lebih lanjut mengenai pengaturcaraan STM32 melalui port USB.
Seperti yang kami katakan di sini, dalam tutorial ini kita akan menambah angka dari 0 dan memaparkannya pada LCD 16x2 dan setiap kali butang tekan ditekan, LED akan menyala dan paparan LCD menunjukkan 'INTERRUPT'.
Pertama tentukan sambungan pin LCD dengan STM32. Anda boleh mengubahnya mengikut keperluan anda.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Seterusnya, kami memasukkan fail tajuk untuk paparan LCD. Ini memanggil perpustakaan yang mengandungi kod bagaimana STM32 harus berkomunikasi dengan LCD. Pastikan juga fungsi LiquidCrystal dipanggil dengan nama pin yang baru kita tentukan di atas.
merangkumi
Pemboleh ubah global digunakan untuk menyampaikan data antara ISR dan program utama. Kami menyatakan pemboleh ubah ledOn sebagai tidak menentu dan juga sebagai Boolean untuk menentukan Betul atau Salah.
ledOn boolean yang tidak menentu = false;
Di dalam fungsi setup void () , kami akan memaparkan pesan intro dan membersihkannya setelah 2 saat.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); kelewatan (2000); lcd.clear ();
Sekali lagi dalam fungsi setup void yang sama () , kita perlu menentukan pin input dan output. Kami menetapkan pin PA1 untuk output ke LED dan PA0 untuk input dari butang tekan.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Kami juga akan menambah nombor, jadi nyatakan pemboleh ubah dengan nilai sifar.
int i = 0;
Sekarang bahagian penting kod adalah fungsi attachInterrupt () , ia juga disertakan di dalam persediaan kosong
attachInterrupt (digitalPinToInterrupt (PA0), butang Ditekan, TUKAR)
Kami dinyatakan pin PA0 untuk sampukan luaran, dan buttonPressed adalah fungsi yang hendak dipanggil apabila terdapat TUKAR (Rendah ke Tinggi atau HIGH kepada LOW) dalam pin PA0. Anda juga dapat menggunakan nama, pin, dan mode fungsi lain sesuai dengan kebutuhan.
Di dalam gelung kekosongan () kita menambah nombor (i) dari sifar dan mencetak nombor dalam LCD (16x2).
lcd.clear (); lcd.print ("NOMBOR:"); lcd.print (i); ++ i; kelewatan (1000);
Bahagian yang paling penting adalah membuat fungsi pengendali interrupt mengikut nama yang kita gunakan dalam fungsi attachInterrupt () . Kami menggunakan butang Ditekan jadi di sini kami telah membuat butang kekosongan fungsiTekanan ()
butang batalTekanan () { if (ledOn) { ledOn = false; digitalWrite (PA1, RENDAH); } lain { ledOn = benar; digitalWrite (PA1, TINGGI); lcd.setCursor (0,1); lcd.print ("Mengganggu"); } }
Mengendalikan butang ini Ditekan () ISR:
Mengikut nilai pemboleh ubah ledOn , LED menyala dan mati.
NEGERI BUTANG |
ledOn (Nilai) |
LED (Merah) |
LCD (16x2) |
TIDAK DIPERCAYAI |
Salah |
MATI |
- |
TEKANAN |
Betul |
HIDUP |
Rancangan 'INTERRUPT' |
Sekiranya nilai ledOn salah maka LED tetap dimatikan dan jika nilai ledOn adalah benar maka LED menyala dan paparan LCD menunjukkan 'Selang' di atasnya.
CATATAN: Kadang-kadang ada kesan singgah suis dan ini mungkin mengira beberapa pencetus semasa butang tekan ditekan, ini kerana beberapa lonjakan voltan disebabkan oleh sebab mekanikal menukar butang tekan. Ini dapat dikurangkan dengan memperkenalkan penapis RC.
Selesai kerja gangguan di STM32F103C8 ditunjukkan dalam video di bawah.