|
1. Prepojenie hornej a dolnej úrovne V predchádzajúcej prednáške sme sa oboznámili so základným procesom vývoja programu CC2430 pomocou IAR prostredníctvom jednoduchého experimentu s blikaním LED. Nôž bol aj tak nabrúsený (hoci môj brúsny kameň nie je dobrý) a teraz začnem zabíjať hmyz :). Ďalej sa naučíme niekoľko základných experimentov s CC2430. Každý malý experiment je rozdelený do troch častí: "Úvod do experimentu", "Diagram vývoja programu" a "Experimentálny zdrojový kód a analýza". Tento článok vysvetľuje vonkajšie prerušenia. 2. Vonkajšie prerušenie(1) Úvod do experimentuPrerušenia sú vnútorný mechanizmus, ktorým mikrokontroléry spracovávajú vnútorné alebo externé udalosti v reálnom čase. Keď nastane interná alebo externá udalosť, systém prerušenia mikrokontroléra prinúti CPU pozastaviť vykonávaný program a namiesto toho spracovať prerušovaciu udalosť. Prerušenia sú rozdelené na externé a vnútorné prerušenia a CC2430 obsahuje celkovo 18 zdrojov prerušení (pre konkrétne popisy prerušení a definície vektorov prerušení prosím pozri "Čínsky manuál CC2430》)。 Teraz sa pozrime na schému zapojenia tejto vývojovej dosky:
Tlačidlo S1 bolo pripojené k P0.1 na vývojovej doske a efektom tohto experimentu je spustenie prerušenia P0.1 cez tlačidlo S1 a následné ovládanie zapnutia/vypnutia LED1 v podprograme služby prerušenia. (2) Experimentálny princíp a diagram tokuExperimentálny diagram je nasledovný:
(3) Experimentálny zdrojový kód//头文件
#include
//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3
prázdnotaOneskorenie(nepodpísanén)
{
nepodpísanétt;
pre(tt =0; tt<n; tt++);
pre(tt =0; tt<n; tt++);
pre(tt =0; tt<n; tt++);
pre(tt =0; tt<n; tt++);
pre(tt =0; tt<n; tt++);
}
//32M晶振初始化
prázdnotaxtal_init(prázdnota)
{ SPAJ &= ~0x04; //都上电
zatiaľ čo(! (SLEEP &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Vyberte 32MHz kryštálový oscilátor SPAK |=0x04;
}
//LED灯初始化
prázdnotaled_init(prázdnota)
{ P1SEL =0x00; P1 je bežný I/O port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 výstup
led1 = 0; Led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
prázdnotaio_init(prázdnota)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
prázdnotamain(prázdnota)
{ xtal_init(); led_init(); io_init();
zatiaľ čo(1); //等待中断
}
//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt prázdnotaP0_ISR(prázdnota)
{ EA =0; Brána je prerušená
Oneskorenie(10000); Oneskorenie(10000); Oneskorenie(10000); Oneskorenie(10000); Oneskorenie(10000);
ak((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Najprv inicializujte systémový takt: vyberte 32MHz kryštálový oscilátor. Potom inicializujte LEDky: nastavte P1 ako všeobecný I/O port, nastavte smer P1.0 ~ P1.3 ako výstup a potom vypnite 4 LED svetlá. Ďalej nakonfigurujte príslušné SFR registre pre externé prerušenia tak, aby umožnili prerušenia na všetkých úrovniach, pričom zahŕňajú 3 SFR:EA、IEN1、PICTL(Podrobnosti o každom SFR nájdete vČínsky manuál CC2430》): EA- Povolenie úplného prerušenia; IEN1.5- P0 povolenie prerušenia; OBRÁZOK.3—— P0.1 povolenie prerušenia portu; OBRÁZOK.0—— Nastavte vstupný okraj portu P0.1 tak, aby spôsoboval spúšťanie prerušenia. Potom použite while(1) v hlavnej funkcii a počkajte na prerušenie. Tipy na CC2430(1) Zhrnutie syntaxe priradenia bitov Mnohokrát musíme priradiť bit (0 alebo 1) k jednému bajtu SFR, aby sme presne ovládali hardvérové zariadenie. Existuje SFRAdresovanie podporných bitovNapríklad pri TCON, P0 a podobne, v súčasnosti je priraďovanie protibodov veľmi jednoduché, stačí sa opýtať na definíciu bitu v sekcii SFR Bit Access súboru hlavičky ioCC2430.h: P0_0 = 0; // priraďte 0 prvej číslici P0 P0_0 = 1; // priraďte hodnotu 1 prvej číslici P0
Ale niektoré SFR tam nie súBitové adresovanie nie je podporované, ako v tomto experimentePICTL, v tomto momente chcete priradiť hodnotu jednému z nich, syntax je nasledovná: PICTL &= ~0x01; Priraďte hodnotu 0 prvej číslici PICTL |= 0x01; Priraďte hodnotu 1 prvej číslici
Pamätáš si to&= ~,|=Tieto dve bežne používané syntax priraďovania bitov. (2) Zhrnutie umožnenia prerušenia Keď je v programe zapojené prerušenie, musí byť povolené pred jeho spustením. Hierarchia systému C51 na povolenie prerušenia je veľmi zrejmá: Prerušovací boss: EAje šéf, zodpovednýVšeobecnéUmožnenie prerušenia: EA = 1;
Každý prerušený veliteľ družstva: Ďalšie je pre každúFunkčné časti(napríklad P0, časovač 1, atď.), takéto SFR sú zvyčajne adresovateľné bitovo a názov zvyčajne obsahuje IE (Interrupt Enable): P0IE = 1;
Každý člen tímu bol prerušený: Squad Ale keďže každá funkcia obsahuje aj viacero prerušení, posledná úroveň je určená práve na totoKaždé prerušenieTento typ SFR je zvyčajne bezbitový a neadresovateľný, a zvyčajne obsahuje IE (Interrupt Enable) alebo IM (Interrupt Mask) v názve: OBRÁZOK |=0x01;
Nie je potrebné mechanicky prerušovať SFR, stačí pochopiť jeho hierarchiu a potom si nájsť čas na vyhľadanie manuálu alebo hlavičkového súboru. (3) Prerušiť písanie programov Použitie prerušení v programe zvyčajne zahŕňa dve časti: zápis podprogramu služby prerušenia a otvorenie povolenia prerušenia. Funkcia prerušenia bola predstavená vyššie a nasleduje stručný úvod do zápisu podprogramu služby prerušenia: Najprv špecifikujteVektor zlomu, ktorú možno dotazovať v sekcii Interrupt Vectors v súbore hlavičky ioCC2430.h s nasledujúcou syntaxou: #pragma vektor = vektor prerušenia
Potom ihneď nato zapíšte handler prerušenia, ktorý je štruktúrovaný nasledovne: __interrupt názov funkcie void (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. ZáverTento článok predstavuje metódu implementácie jednoduchých externých prerušení založenú na CC2430 a po základe prerušení predstavíme ďalší veľmi dôležitý modul – časovače. CC2430 má celkovo 4 časovače, ktoré možno rozdeliť do troch kategórií: časovač 1, časovač 2, časovač 3/4 (3 a 4 sú v podstate rovnaké použitie). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|