- Kesinti Türleri ve ISR
- STM32'de Interrupt için Sözdizimi
- Gerekli Bileşenler
- Devre Şeması ve Bağlantılar
- Kesintiler için STM32F103C8'i programlama
Kesmeler, bir G / Ç'nin veya bir talimatın işlemcinin normal çalışmasını askıya alabildiği ve en yüksek önceliğe sahip olduğu gibi kendisine hizmet verilmesini sağlayan bir mekanizmadır. Örneğin, normal bir yürütme yapan bir işlemci bir tür olayı veya bir kesintinin meydana gelip gelmediğini sürekli olarak izleyebilir. Yani, harici bir kesinti meydana geldiğinde (bazı sensörlerden olduğu gibi), işlemci normal çalışmasını duraklatır ve önce kesmeye hizmet eder ve ardından normal çalışmasına devam eder.
İşte bu projede, STM32F103C8'deki Kesmeleri anlamak için, harici kesme olarak basma butonunu kullanacağız. Burada 0'dan bir sayı çıkaracağız ve bunu 16x2 LCD'de görüntüleyeceğiz ve düğmeye her basıldığında led YANACAK ve LCD ekran KESİNTİ gösterir. Düğme bırakılır bırakılmaz LED söner.
Kesinti Türleri ve ISR
Kesmeler genel olarak iki türe ayrılabilir:
Donanım Kesintileri: İşlemciye giden sinyal, düğme veya sensör gibi bazı harici cihazlardan veya bir sinyal üreten ve işlemciye ISR'de bulunan belirli bir görevi yapmasını söyleyen başka bir donanım cihazından geliyorsa, donanım kesintileri olarak bilinir.
Yazılım Kesintileri: Yazılım talimatları tarafından oluşturulan kesintiler.
Kesinti Servis Rutini
Kesinti Hizmeti Rutini veya bir Kesme işleyicisi, içinde küçük bir talimat seti bulunan bir olaydır ve bir kesme gerçekleştiğinde, işlemci önce ISR'de bulunan bu kodu çalıştırır ve ardından kesmeden önce yaptığı göreve devam eder.
STM32'de Interrupt için Sözdizimi
ISR, Arduino'da aşağıdaki sözdizimi attachInterrupt'a (digitalPinToInterrupt (pin), ISR, mode) sahiptir ve aynı kod yüklemek için arduino IDE kullandığımız için STM32'de de kullanılabilir.
- digitalPinToInterrupt (pin): Arduino board Uno'da olduğu gibi 2,3 pinlerimiz ve mega'da kesintiler için 2,3,18,19,20,21 pinlerimiz var. STM32F103C8'de ayrıca kesinti için herhangi bir GPIO pini kullanılabilen kesme pinlerimiz vardır. Sadece interrupt için kullandığımız giriş pinini belirtmek istiyoruz. Ancak aynı anda birden fazla kesinti kullanırken bazı kısıtlamalara uymamız gerekebilir.
- ISR: Harici bir kesme oluştuğunda çağrılan bir Kesme işleyici işlevidir. Argümanları ve void dönüş türü yoktur.
- Mod: Kesmeyi tetiklemek için geçiş türü
- YÜKSELEN: Pim DÜŞÜK'ten YÜKSEK'e geçtiğinde bir kesintiyi tetiklemek için.
- DÜŞME: Pim YÜKSEK'ten DÜŞÜK'e geçiş yaptığında bir kesintiyi tetiklemek için.
- DEĞİŞTİR: Pim DÜŞÜK'ten YÜKSEK'e veya YÜKSEK'ten DÜŞÜK'e geçiş yaptığında (yani, pim değiştiğinde) bir kesintiyi tetiklemek için.
Interrupt kullanırken bazı koşullar
- Interrupt Service Routine işlevi (ISR) mümkün olduğunca kısa olmalıdır.
- Delay () işlevi ISR içinde çalışmaz ve bundan kaçınılmalıdır.
Gerekli Bileşenler
- STM32F103C8
- Butona basınız
- LED
- Direnç (10K)
- LCD (16x2)
Devre Şeması ve Bağlantılar
Basma buton piminin bir tarafı 3,3V STM32'ye bağlanır ve diğer tarafı aşağı çekme direnci ile STM32'nin giriş pinine (PA0) bağlanır.
Aşağı Çekme direnci kullanılır, böylece mikro denetleyici, düğmeye basıldığında veya bırakıldığında girişinde yalnızca YÜKSEK veya DÜŞÜK olur. Aksi takdirde, aşağı çekme direnci olmadan, MCU'nun kafası karışabilir ve girişe bazı rastgele kayan değerler besleyebilir.
STM32F103C8 ve LCD arasındaki bağlantı
Aşağıdaki tablo, LCD (16X2) ve STM32F103C8 mikro denetleyici arasındaki pin bağlantısını gösterir.
STM32F103C8 |
LCD ekran |
GND |
VSS |
+ 5V |
VDD |
Potansiyometre Merkez PIN'ine |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
Bir |
GND |
K |
Kesintiler için STM32F103C8'i programlama
Bu öğreticinin programı basittir ve bu eğitimin sonunda verilmiştir. STM32'yi programlamak için FTDI programlayıcıya ihtiyacımız yok, sadece bilgisayarınızı STM32'nin USB portuna bağlayın ve Arduino IDE ile programlamaya başlayın. STM32'yi USB bağlantı noktası üzerinden programlama hakkında daha fazla bilgi edinin.
Burada söylediğimiz gibi, bu eğitimde 0'dan bir sayı artırıp 16x2 LCD'de göstereceğiz ve bir düğmeye her basıldığında led YANACAK ve LCD ekran 'KESİNTİ' gösteriyor.
Önce STM32 ile LCD pin bağlantılarını tanımlayın. Gereksinimlerinize göre değiştirebilirsiniz.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Daha sonra, LCD ekran için başlık dosyasını ekliyoruz. Bu, STM32'nin LCD ile nasıl iletişim kurması gerektiğine ilişkin kodu içeren kitaplığı çağırır. Ayrıca LiquidCrystal fonksiyonunun yukarıda tanımladığımız pin isimleriyle çağrıldığından emin olun.
Dahil etmek
Global değişkenler, ISR ile ana program arasında veri iletmek için kullanılır. LedOn değişkenini uçucu ve ayrıca Doğru veya Yanlış belirtmek için Boolean olarak ilan ediyoruz.
uçucu boolean ledOn = false;
İçinde boşluk kurulum () fonksiyonu, bir intro mesajı görüntüler ve 2 saniye sonra temizlemek.
lcd.begin (16,2); lcd.print ("DEVRE DIGEST"); gecikme (2000); lcd.clear ();
Yine aynı void setup () fonksiyonunda giriş ve çıkış pinlerini belirtmemiz gerekiyor. PA1 pinini çıkış için LED'e ve PA0'ı butondan giriş için ayarladık.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Ayrıca bir sayıyı artıracağız, bu nedenle sıfır değerine sahip bir değişken tanımlayın.
int i = 0;
Artık kodun önemli kısmı attachInterrupt () işlevidir, ayrıca void setup () içine de dahil edilmiştir.
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Bu pim, belirtilen PA0 dış kesme için ve ButtonPressed PA0 pimi DEĞİŞİM (yüksekten düşüğe veya düşükten yükseğe) olduğunda çağrılacak olan bir fonksiyondur. İhtiyaca göre başka bir işlev adı, pin ve modu da kullanabilirsiniz.
Boş döngü () içinde sıfırdan bir sayı (i) arttırır ve LCD'de (16x2) sayıyı yazdırırız.
lcd.clear (); lcd.print ("NUMARA:"); lcd.print (i); ++ i; gecikme (1000);
En önemli kısım, attachInterrupt () işlevinde kullandığımız isme göre bir kesme işleyici işlevi oluşturmaktır. ButtonPressed kullandık ve burada bir işlev void button oluşturduk.
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, DÜŞÜK); } else { ledOn = true; digitalWrite (PA1, YÜKSEK); lcd.setCursor (0,1); lcd.print ("Kesme"); } }
Bu düğmenin çalışması Basılı () ISR:
LedOn değişkeninin değerine göre led yanar ve söner.
DÜĞME DURUMU |
ledOn (Değer) |
LED (Kırmızı) |
LCD (16x2) |
BASKISIZ |
Yanlış |
KAPALI |
- |
BASILI |
Doğru |
AÇIK |
'' INTERRUPT 'gösterir |
Eğer ledon değerdir yanlış ardından LED kalıntılar kapalı ve eğer ledon değeri True ardından dönüşleri ve üzerinde LCD ekranda "rahatsız etmeyin LED.
NOT: Bazen anahtar geri alma etkisi olabilir ve basma düğmesine basıldığında birden fazla tetik sayılabilir, bunun nedeni, düğmenin değiştirilmesinin mekanik nedeni nedeniyle voltajda birkaç artış olmasıdır. Bu, RC filtresi eklenerek azaltılabilir.
STM32F103C8'deki kesintilerin tam çalışması aşağıdaki videoda gösterilmektedir.