| I. Bir öncekinden bir sonrakine devam etmek Bir önceki derste, en basit LED yanıp sönmesi ile küçük bir deney yaparak IAR'da CC2430 programları geliştirmenin temel sürecine aşina olduk. Bıçak en azından bilendi (her ne kadar bu bileme taşında çok iyi olmasam da) ve şimdi böcekleri kesmeye başlama zamanı :). Sonra, birkaç temel CC2430 deneyini öğrenelim. Her küçük deney, açıklamanın "deneysel giriş", "program akış şeması", "deneysel kaynak kodu ve analizi" üç bölümüne ayrılmıştır. Bu makale harici kesmeyi açıklamaktadır. İkinci olarak, harici kesme(1) Deneye giriş Kesme, dahili bir mekanizma olan dahili veya harici olaylarla başa çıkmak için gerçek zamanlı bir mikrodenetleyicidir. Bir tür dahili veya harici olay meydana geldiğinde, mikrodenetleyici kesme sistemi CPU'yu yürütülmekte olan programı duraklatmaya zorlar, ancak kesme olayı işlemeye gitmek için, kesme işlemi tamamlanır ve ardından program tarafından kesilmek üzere geri döner, yürütmeye devam eder. Kesmeler harici kesmelere ve dahili kesmelere ayrılır, CC2430 toplam 18 kesme kaynağı içerir (özel kesme açıklaması ve kesme vektör tanımı, " CC2430 Çince Kılavuzuna " başvurabilirsiniz). Şimdi bu geliştirme kartının devre şemasına bir göz atalım:
Geliştirme kartı S1 düğmesine ve P0.1'e bağlanmıştır, bu deneyin elde etmek istediği etki, S1 tuşuna basarak P0.1'in kesilmesini tetiklemek ve ardından kesme hizmeti alt programında LED1 ışığını / çıkışını kontrol etmektir. (2) Deneysel prensip ve akış şeması Deneyin akış şeması aşağıdaki gibidir:
c
(3) Deneysel kaynak kodu// başlık dosyası#include // gecikme alt fonksiyonu#define led1 P1_0#define led2 P1_1 #define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & &
nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); &
nbsp; for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//32M kristal başlatmavoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //tüm güç açmawhile (! (SLEEP & 0x40 )); //kristal osilatör açık ve kararlı CLKCON &=~0x47; &
nbsp; //Select 32MHz crystal oscillator SLEEP |=0x04; }//LED başlatmavoid led_init( void ) { P1SEL =0x00;  
; //P1 normal bir I/O portudur P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Çıkış
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//io ve harici kesme başlatmavoid io_init( void ) { P0INP &=~0X02;
/ /P0.1'de pull-up ve pull-down vardır EA =1; //Toplam kesme etkinleştirme P0IE =1; &
nbsp; //P0 kesme etkinleştirme PICTL |=0X09; //P0.1 port kesme etkinleştirme, düşen kenar tetikleme P0IFG &=~0x02
; //P0.1 kesme bayrağı clear 0 };//ana fonksiyonvoid main ( void ) { xtal_init(); led_init();
io_init();while ( 1 ); //wait for interrupt }//interrupt service subroutine#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;
/ / kesme gecikmesini kapat
( 10000 ); Gecikme(10000 ); Gecikme(10000 ); Gecikme( 10000 ); Gecikme(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) //anahtar kesmesi { P0IFG &=~0x02; &
nbsp; //P0.1 kesme bayrağı clear 0 led1 = !led1; } P0IF =0; &
nbsp; //P0 kesme bayrağı temiz 0 EA =1; & nbsp; // kesmeyi aç } Önce Birlik Saatini başlatın: 32MHz kristal osilatör seçin. Ardından LED'leri başlatın: P1'i genel amaçlı I/O portu olarak ayarlayın, P1.0 ~ P1.3 yönünü çıkış olarak ayarlayın ve ardından 4 LED'i kapatın. Daha sonra harici kesmeler için ilgili SFR kayıtlarını yapılandırın ve 3 SFR içeren tüm seviyelerde kesme etkinliğini açın: EA, IEN1, PICTL (her SFR'nin ayrıntılı açıklaması için lütfen " CC2430 Çince Kılavuzuna " bakın): EA -- toplam kesme etkinleştirme; IEN1.5 -- P0 kesme etkinleştirme; PICTL.3 -- P0.1 port kesme etkinleştirme; PICTL.0 -- P0.1 port girişinin düşen kenarını kesme tetiklemesine neden olacak şekilde ayarlayın. Daha sonra ana fonksiyonda while(1) kullanarak kesmeyi bekleyin. CC2430 İpuçları(1) Bit Atama Sözdizimi Özeti Çoğu zaman, bir donanım aygıtını tam olarak kontrol etmek için tek baytlık bir SFR'deki bir bite bir değer (0 veya 1) atamamız gerekir. T CON, P0, vb. gibi bazı SFR'ler bit adreslemeyi destekler, şu anda bitin atanması çok basittir, sadece SFR'deki ioCC2430.h başlık dosyasını sorgulayın Bit tanımının Bit Erişimi kısmı şöyle olabilir: P0_0 = 0; // P0 0 değerinin atanmasının ilk biti P0_0 = 1; / / / P0 1 değerinin atanmasının ilk bitiAncak, ilk bitin ilk bitinin ilk bitinin ilk bitinin değerinin atanmasının ilk biti durumunda olduğu gibi, bit adreslemeyi desteklemeyen SFR'ler vardır . ikinci bitin ilk bitinin ilk bitinin . Ancak, bu deneydeki PICTL gibi bazı SFR'ler bit adreslemeyi desteklemez, bunlardan birine bir değer atamak istediğinizde sözdizimi aşağıdaki gibidir: PICTL &= ~0x01; //ilk bite 0 değeri atayın PICTL |= 0x01; //ilk bite 1 değeri atayın & amp;= ~, |= ~, |= P0_0 = 1; //P0'ın ilk bitine 1 değeri atayın . amp;= ~, |= bu iki yaygın bit atama sözdizimi. (2) Kesme Etkinleştirme Özeti Bir kesme bir programa dahil olduğunda, kesme tetiklenmeden önce etkinleştirilmelidir. C 51 kesme etkinleştirme sistemi, hiyerarşik yapısı çok açıktır: kesme patronu: EA patrondur, toplamkesme etkinliğinden sorumludur: EA = 1; kesme ayırma kaptanı : sonraki her işlevsel bileşen içindir (P0, zamanlayıcı 1, vb.) kontrolü etkinleştirir, bu tür SFR genellikle bit adreslenebilir, adlandırma genellikle IE (Kesme Etkinleştirme) içerir: P0IE = 1; kesme ekibi üyeleri: ayırma , ancak programınkesintiye uğraması nedeniyle , kesme tetiklenmeden önce kesme etkinleştirilmelidir.
h er bir kesme ekibi üyeleri: ekip ancak her bir işlevsel bileşen aynı zamanda birden fazla kesme içerdiğinden, son seviye her bir kesme etkinleştirme kontrolü içindir, bu tür SFR genellikle bit adreslenebilir değildir, adı genellikle IE (Kesme Etkinleştirme) veya IM (Kesme Maskesi) içerir: PICTL | = 0x01; kesme SFR'lerini ezberlemeye gerek yoktur Hiyerarşiyi anladığınız sürece kesme SFR'lerini ezberlemenize gerek yoktur ve bunları kullandığınızda kılavuza veya başlık dosyalarına başvurun. (3) Kesme Programlarının Yazılması Bir programda kesme kullanımı genellikle iki bölümden oluşur: kesme servis alt programının yazılması ve kesme etkinliğinin açılması. K esme etkinleştirme yukarıda tanıtılmıştır, aşağıda kesme hizmet alt rutininin hazırlanmasına kısa bir giriş yapılmıştır: Öncelikle , kesme vektörünü belirtin, sorgunun Kesme Vektörleri bölümünde ioCC2430.h başlık dosyasında olabilir, sözdizimi aşağıdaki gibidir: # pragma vector = Kesme Vektörleri ve ardından kesme işleyicisinin hazırlanması, yapı aşağıdaki gibidir : ___ interrupt void İşlev Adı (___)
i nterrupt void function name(void) { //on interrupt //interrupt handling //interrupt flag clear 0 //off interrupt } III. Sonuç Bu makale, CC2430'a dayalı basit bir harici kesme uygulama yöntemini, kesme temelinde tanıtıyor, ardından çok önemli bir modül olan zamanlayıcıyı tanıtıyoruz. CC2430, üç kategoriye ayrılabilen toplam dört zamanlayıcıya sahiptir: zamanlayıcı 1, zamanlayıcı 2, zamanlayıcı 3/4 (aynı temelin kullanımının 3 ve 4'ü). aynı). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |