|
1. Üst ve alt katların birbirine bağlanması Önceki derste, IAR'ın CC2430 programını basit bir LED yanıp sönme deneyi ile geliştirme sürecini öğrendik. Bıçak zaten biliyor (gerçi eşleme taşım iyi değil), şimdi böcek kesmeye :) başlayacağım. Sonra, CC2430'un birkaç temel deneyini öğrenelim. Her küçük deney üç bölüme ayrılır: "Deney Girişi", "Program Akış Şeması" ve "Deneysel Kaynak Kodu ve Analiz". Bu makale dış kesintileri açıklamaktadır. 2. Dış kesinti(1) Deneye girişKesintiler, mikrodenetleyicilerin iç veya harici olayları gerçek zamanlı olarak işlemesi için iç mekanizmadır. Dahili veya harici bir olay meydana geldiğinde, mikrodenetleyicinin kesme sistemi CPU'yu çalıştıran programı duraklatmaya zorlar ve bunun yerine kesme olayını işlemeye çalışır. Kesintiler harici ve iç kesintilere ayrılır ve CC2430 toplamda 18 kesinti kaynağı içerir (kesinti vektörlerinin özel kesinti açıklamaları ve tanımları için lütfen "CC2430 Çin Kılavuzu》)。 Şimdi bu geliştirme kartının devre diyagramına bir göz atalım:
S1 düğmesi, geliştirme kartındaki P0.1'e bağlanmıştır ve bu deneyin etkisi, P0.1'in kesintisini S1 düğmesi üzerinden tetiklemek ve ardından kesme hizmeti alt programında LED1'in açılıp kapatılmasını kontrol etmektir. (2) Deneysel ilke ve akış şemasıDeneysel akış şeması şöyledir:
(3) Deneysel kaynak kodu//头文件
#include
//延时子函数
#defineled1 P1_0
#defineled2 P1_1
#defineled3 P1_2
#defineled4 P1_3
VoidGecikme(imzasızn)
{
imzasıztt;
için(tt =0; tt<n; tt++);
için(tt =0; tt<n; tt++);
için(tt =0; tt<n; tt++);
için(tt =0; tt<n; tt++);
için(tt =0; tt<n; tt++);
}
//32M晶振初始化
Voidxtal_init(Void)
{ UYKU &= ~0x04; //都上电
while(! (UYKU &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //32MHz kristal osilatör seçin UYKU |=0x04;
}
//LED灯初始化
Voidled_init(Void)
{ P1SEL =0x00; P1 normal I/O portudur P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 çıkışı
led1 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
Voidio_init(Void)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
Voidmain(Void)
{ xtal_init(); led_init(); io_init();
while(1); //等待中断
}
//中断服务子程序
#pragma vektör = P0INT_VECTOR
__interrupt VoidP0_ISR(Void)
{ EA =0; Kapı kesintiye girdi
Gecikme(10000); Gecikme(10000); Gecikme(10000); Gecikme(10000); Gecikme(10000);
eğer((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
İlk olarak, sistem saatini başlatın: 32MHz kristal osilatör seçin. Sonra LED'leri başlatın: P1'i genel G/O portu olarak ayarlayın, çıkış olarak P1.0 ~ P1.3 yönünü ayarlayın ve ardından 4 LED ışığını kapatın. Sonra, harici kesintiler için ilgili SFR kayıtlarını tüm seviyelerde kesintileri etkinleştirecek şekilde yapılandırın; bu da 3 SFR içerir:EA、IEN1、PICTL(Her SFR hakkında detaylar için lütfenCC2430 Çin Kılavuzu》): EA- Toplam kesinti etkinleştirilmeli; IEN1.5- P0 kesintisi etkinleştirir; PICTL.3—— P0.1 port kesintisi etkinleştirildi; PICTL.0—— P0.1 port giriş bırakma kenarını kesme tetiklenmesine neden olacak şekilde ayarlayın. Sonra ana fonksiyonda while(1) kullanın ve kesintiyi bekleyin. CC2430 İpuçları(1) Bit atama sözdiziminin özeti Çoğu zaman, donanım cihazını tam olarak kontrol etmek için tek bir bayt SFR'ye bir bit (0 veya 1) atamamız gerekir. SFR varDestek bit adreslemeÖrneğin, TCON, P0 vb. için şu anda karşı noktaların atanması çok basittir, sadece ioCC2430.h başlık dosyasının SFR Bit Erişim bölümünde bit tanımını sorgulayın: P0_0 = 0; // P0'un ilk rakamına 0 atan P0_0 = 1; // P0'un ilk rakamına 1 değeri atayın
Ama bazı SFR'ler yokBit adresleme desteklenmemektedir, bu deneyde olduğu gibiPICTL, bu sırada, birine bir değer vermek isterseniz, sözdizimi şöyledir: PICTL &= ~0x01; İlk rakamın 0 değerini atayın PICTL |= 0x01; İlk rakamın 1 değerini atayın
Hatırlayabilirsin&= ~,|=Bu iki yaygın kullanılan bit atama sözdizimi. (2) Kesinti etkinleştirme özeti Programda bir kesme varsa, kesme tetiklenmeden önce etkinleştirilmelidir. C51 kesme etkinleştirme sisteminin hiyerarşisi çok açıktır: Interrupt Boss: EApatron mı, sorumluGenelKesinti Etkinleştir: EA = 1;
Her kesintiye uğrayan birim lideri: Sonraki her biri içinFonksiyonel parçalar(örneğin P0, zamanlayıcı 1 vb.), bu tür SFR'ler genellikle bit adreslenebilirdir ve isim genellikle IE (Kesme Etkinleştirme) içerir: P0IE = 1;
Her takım üyesi kesildi: Takım Ancak her özellik içinde birden fazla kesme olduğu için, son seviye buna aittirHer kesintiBu tür SFR genellikle bitsiz ve adreslenemezdir ve genellikle adında IE (Kesme Etkinleştirme) veya IM (Kesme Maskası) bulunur: PICTL |=0x01;
SFR'yi ezbere kesmek zorunda değilsiniz, sadece hiyerarşisini anlayın ve sonra el kitabını veya başlık dosyasını araştırmak için zaman ayırın. (3) Program yazımını kesin Bir programda kesintilerin kullanımı genellikle iki bölümden oluşur: kesme hizmeti alt programının yazılması ve kesinti etkinleştirmesinin açılması. Kesme fonksiyonu yukarıda tanıtılmıştır ve aşağıda kesme hizmeti alt programının yazımına kısa bir giriş verilmiştir: Önce belirtinKırılma vektörü, bu soru ioCC2430.h başlık dosyasının Kesme Vektörleri bölümünde aşağıdaki sözdizimi ile sorgulanabilir: #pragma vektör = kesme vektörü
Hemen ardından kesme işleyicisini yazın, bu yapı şu şekilde yapılıyor: __interrupt void fonksiyon adı (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. SonuçBu makale, CC2430 temelli basit harici kesintilerin uygulama yöntemini tanıtır ve kesmelerin temelinden sonra başka çok önemli bir modülü - zamanlayıcıları tanıtacağız. CC2430'un toplamda 4 zamanlayıcısı vardır ve bunlar üç kategoriye ayrılabilir: zamanlayıcı 1, zamanlayıcı 2, zamanlayıcı 3/4 (3 ve 4 temelde aynı kullanım). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|