| I. Turpinot no iepriekšējā uz nākamo Iepriekšējā lekcijā mēs iepazināmies ar CC2430 programmu izstrādes pamatprocesu IAR programmā, veicot nelielu eksperimentu ar visvienkāršāko LED mirgošanu. Peilis vismaz ir uzasināts (lai gan man tas asināšanas akmens ne pārāk labi padodas), un tagad ir pienācis laiks ķerties pie kļūdu gaļas griešanas :). Tālāk apgūsim dažus CC2430 pamateksperimentus. Katrs neliels eksperiments, sadalīts "eksperimentālā ievada", "programmas plūsmas diagrammas", "eksperimentālā pirmkoda un analīzes" apraksta trīs daļās. Šajā rakstā izskaidrots ārējais pārtraukums. Otrkārt, ārējais pārtraukums(1) Eksperimenta ievads Pārtraukums ir reāllaika mikrokontrolieris, lai reaģētu uz iekšējiem vai ārējiem notikumiem, iekšējais mehānisms. Kad notiek kāds iekšējs vai ārējs notikums, mikrokontroliera pārtraukšanas sistēma piespiedīs centrālo procesoru apturēt izpildāmo programmu, bet pāriet uz pārtraukšanas notikuma apstrādi, pārtrauktā apstrāde ir pabeigta, un pēc tam atgriezties, lai pārtrauktu programmu, turpināt izpildīt. Pārtraukumi tiek iedalīti ārējos pārtraukumos un iekšējos pārtraukumos, CC2430 kopumā ir 18 pārtraukumu avoti (konkrētu pārtraukumu aprakstu un pārtraukuma vektora definīciju var atrast " CC2430 ķīniešu valodas rokasgrāmatā "). Tagad aplūkosim šīs izstrādes plates shēmas shēmu:
Izstrādes plate ir savienota ar S1 pogu un P0.1, efekts, ko vēlas panākt ar šo eksperimentu, ir iedarbināt P0.1 pārrāvumu, nospiežot S1 taustiņu, un pēc tam pārrāvuma apkalpošanas apakšprogrammā kontrolēt LED1 gaismu/izslēgšanos. (2) Eksperimenta princips un plūsmas shēma Eksperimenta shēma ir šāda:
c
(3) Eksperimentālais avota kods// header fails#include // delay apakšfunkcija#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 kristāla inicializācijavoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //visu jaudu ieslēgšanawhile (! (SLEEP & 0x40 )); //kristāla oscilators ieslēgts un stabils CLKCON &=~0x47; &
nbsp; /Izvēlēt 32MHz kristāla oscilatoru SLEEP |=0x04; }//LED inicializācijavoid led_init( void ) { P1SEL =0x00;  
; //P1 ir parastais I/O ports P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 iz eja
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//io un ārējo pārtraukumu inicializācijavoid io_init( void ) { P0INP &=~0X02;
/ /P0.1 ir pull-up un pull-down EA =1; //Total interrupt enable P0IE =1; &
nbsp; //P0 pārtraukuma iespējošana PICTL |=0X09; //P0.1 porta pārtraukuma iespējošana, krītošās malas ierosinātājs P0IFG &=~0x02
; //P0.1 pārrāvuma karodziņš clear 0 };//main functionvoid main( void ) { xtal_init(); led_init();
io_init();while ( 1); //gaida pārtraukumu }//pārtraukumu apkalpošanas apakšprogramma#pragma vektors = P0INT_VECTOR__pārtraukums void P0_ISR( void ) { EA =0;
/ / izslēgt pārtraukumu Delay
( 10000 ); Delay(10000 ); Delay(10000); Delay(10000 ); Delay(10000 ); Delay(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) // atslēgas pārtraukums { P0IFG &=~0x02; &
nbsp; //P0.1 pārtraukuma karodziņš notīrīts 0 led1 = !led1; } P0IF =0; & &
nbsp; //P0 pārtraukuma karodziņa dzēšana 0 EA =1; & nbsp; // ieslēgt pārtraukumu } Vispirms inicializējiet vienoto pulksteni: izvēlieties 32 MHz kristāla oscilatoru. Pēc tam inicializējiet gaismas diodes: iestatiet P1 kā vispārējas nozīmes I/O portu, iestatiet P1.0 ~ P1.3 virzienu kā izeju un pēc tam izslēdziet 4 gaismas diodes. Pēc tam konfigurējiet attiecīgos SFR reģistrus ārējiem pārtraukumiem un ieslēdziet pārtraukšanas iespējošanu visos līmeņos, iesaistot 3 SFR: EA, IEN1, PICTL (sīkāku katra SFR aprakstu skatīt " CC2430 ķīniešu valodas rokasgrāmatā "): EA - kopējais pārtraukšanas iespējojums; IEN1.5 -- P0 pārtraukšanas iespējošana; PICTL.3 -- P0.1 porta pārtraukuma iespējošana; PICTL.0 -- iestatīt P0.1 porta ieejas krītošo malu, lai izraisītu pārtraukuma aktivizēšanu. Tad galvenajā funkcijā izmantojiet while(1), lai gaidītu pārtraukumu. CC2430 padomi(1) Bitu piešķiršanas sintakses kopsavilkums Ļoti bieži mums ir jāpiešķir vērtība (0 vai 1) bitu vienbajta SFR, lai precīzi vadītu kādu aparatūras ierīci. D aži SFR atbalsta bitu adresēšanu, piemēram, TCON, P0 u. c., šajā laikā bitu piešķiršana ir ļoti vienkārša, vienkārši pieprasiet ioCC2430.h galvenes faila SFR bitu piekļuves daļas SFR bitu definīcijas daļa var būt: P0_0 = 0; // P0 pirmais bits, kam piešķirta vērtība 0 P0_0 = 1; / / / P0 pirmais bits, kam piešķirta vērtība 1 Tomēr ir SFR, kas neatbalsta bitu adresēšanu , piemēram, pirmā bita vērtības piešķiršanas gadījumā. Tomēr daži SFR neatbalsta bitu adresēšanu, piemēram, PICTL šajā eksperimentā, kad vēlaties piešķirt vērtību kādam no tiem, sintakse ir šāda: PICTL &= ~0x01; //piešķirt vērtību 0 pirmajam bitu PICTL |= 0x01; //piešķirt vērtību 1 pirmajam bitu Var atcerēties, ka & amp;= ~, |= ~, |= ~, |= ~, |= ~, |= P0_0 = 1; //piešķirt vērtību 1 pirmajam bitu P0 . amp;= ~, |= šīs divas parastās bitu piešķiršanas sintakses. (2) Pārtraucēju aktivizēšanas kopsavilkums Ja programmā ir iesaistīts pārtraukums, tas ir jāaktivizē, pirms tiek aktivizēts pārtraukums. C 51 pārtraukšanas iespējošanas sistēma, tās hierarhiskā struktūra ir ļoti acīmredzama: pārtraukšanas priekšnieks: EA ir priekšnieks, atbildīgs par kopējo pārtraukšanas iespējošanu: EA = 1; pārtraukšanas atdalīšanas kapteinis: nākamais ir katra funkcionālā komponenta (piemēram, P0, taimera 1 utt.) iespējošanas kontrole, šāds SFR parasti ir bitu adresējams, nosaukumā parasti ir IE (Interrupt Enable): P0IE = 1; pārtraukšanas komandas dalībnieki: atdalīšana, bet programmaspārtraukšanas dēļ pārtraukums ir jāiedrošina pirms pārtraukuma iedarbināšanas.
k atra pārtraukuma komandas locekļi: komanda, bet, tā kā katrs funkcionālais komponents satur arī vairākus pārtraukumus, tāpēc pēdējais līmenis ir katra pārtraukuma ieslēgšanas kontrolei, šāds SFR parasti nav bitu adresējams, nosaukums parasti satur IE (Interrupt Enable) vai IM (Interrupt Mask): PICTL | = 0x01; nav jāiegaumē pārtraukuma SFR Pārtraucēju SFR nav nepieciešams iegaumēt, ja vien jūs saprotat hierarhiju, un pēc tam, kad tos izmantojat, skatiet rokasgrāmatu vai galvenes failus. (3) Pārtraucēju programmu rakstīšana Pārtraucēju izmantošana programmā parasti sastāv no divām daļām: pārtraukšanas apkalpošanas apakšprogrammas rakstīšanas un pārtraukšanas iespējamības atvēršanas. P ārtraukuma iespējošana ir ieviesta iepriekš, tālāk ir īss ievads par pārtraukuma apkalpošanas apakšprogrammas sagatavošanu: Vispirms norādiet pārtraukuma vektoru, tas var būt ioCC2430.h galvenes faila ioCC2430.h daļā Interrupt Vectors, sintakse ir šāda: # pragma vector = Interrupt Vectors (# pragma vektors = Pārtraukuma vektori ), un tad seko pārtraukuma apkalpošanas apakšprogrammas sagatavošana, struktūra ir šāda: ___ interrupt void Function Name (___)
i nterrupt void function name(void) { //pārtraucis //pārtraucēja apstrāde //pārtraucēja karodziņš clear 0 //izslēgts pārtraukums } III. Secinājumi Šajā rakstā iepazīstinām ar vienkāršu ārējo pārtraukumu implementācijas metodi, kas balstīta uz CC2430, pamatojoties uz pārtraukumu, pēc tam iepazīstinām ar vēl vienu ļoti svarīgu moduli - taimeri. CC2430 kopumā ir četri taimeri, kurus var iedalīt trīs kategorijās: taimeris 1, taimeris 2, taimeris 3/4 (3 un 4 izmanto vienu un to pašu bāzes). tas pats). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |