|
1. Menghubungkan tingkat atas dan bawah Pada artikel ini, kita akan membahas fungsi tidur dan metode bangun CC2430. Dalam penggunaan aktual, node CC2430 umumnya ditenagai oleh baterai, sehingga kontrol konsumsi dayanya sangat penting. Berikut ini adalah kutipan dari manual Cina CC2430 untuk pengenalan 4 mode konsumsi daya CC2430:
Seperti yang Anda lihat dari tabel di atas, CC2430 memiliki total 4 mode daya:PM0(terjaga sepenuhnya),PM1(sedikit mengantuk),PM2(setengah terjaga dan setengah tertidur),PM3(Tidur sangat nyenyak). Semakin jauh ke belakang, semakin banyak fungsi yang dimatikan, dan konsumsi daya semakin rendah. Hubungan konversi di antara mereka adalah sebagai berikut:
menempatkanPM1、PM2BangunPM0, ada tiga cara: reset, gangguan eksternal, gangguan pengatur waktu tidur; Tapi letakkanPM3BangunPM0, hanya ada dua cara: reset, interupsi eksternal (ini karena diPM3Semua osilator berhenti bekerja, dan tentu saja pengatur waktu tidur dimatikan ~) Mari kita lihat eksperimen kecil untuk memperkenalkan cara masuk ke mode tidur dan cara bangunPM0negara. 2. Tidur sistematis dan eksperimen bangun yang terganggu(1) Pengantar percobaaninisialisasi sistem, diPM0
→ masukPM1
→ Bangun dengan pengatur waktu tidur setelah 1 detikPM0
→ masukPM2
→ dibangunkan oleh pengatur waktu tidur setelah 2 detikPM0
→ masukPM3
→ Tunggu hingga tombol S1 ditekan, memicu interupsi eksternal dan bangunPM0
(2) Bagan alir program
(Catatan: Kotak bulat pada gambar di atas menunjukkan status kesehatan sistem)
(3) Kode sumber eksperimental dan analisis (Kotak-kotak berikut dapat diklik~)File header dan definisi makro[url =]
[/url]
/* Deskripsi eksperimental: Eksperimen tidur bangun yang terputus, yang memperkenalkan terjaga dalam tiga mode tidur
*/
#include #define LED_ON 0 #define LED_OFF 1#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3 [url =] [/url]
Subfungsi[url =] [/url]
/*Inisialisasi jam sistem -------------------------------------------------------*/
kosongxtal_init(kosong)
{ TIDUR &= ~0x04; //Semua bertenaga
sementara(! (TIDUR &0x40)); //Osilator kristal menyala dan stabil
CLKCON &= ~0x47; //Pilih osilator kristal 32MHz
TIDUR |=0x04;
}
/*Inisialisasi LED -------------------------------------------------------*/
kosongled_init(kosong)
{ P1SEL =0x00; //P1 adalah port I/O normal
P1DIR |=0x0F; //Keluaran P1.0 P1.1 P1.2 P1.3
led1 = LED_OFF; //Matikan semua LED
led2 = LED_OFF; led3 = LED_OFF; led4 = LED_OFF;
}
/*Inisialisasi interupsi eksternal -------------------------------------------------------*/
kosongio_init(kosong)
{ P0INP &= ~0X02; //P0.1 memiliki pull-up dan pull-down
EA =1; //Gangguan total yang diizinkan
IEN1 |= 0X20; //P0IE = 1, P0 mengaktifkan interupsi
PICTL |= 0X09; //P0.1 memungkinkan interupsi, pemicu tepi jatuh
P0IFG &= ~0x02; //P0.1 Tanda interupsi jelas0
}
/*Inisialisasi interupsi pengatur waktu tidur -------------------------------------------------------*/
kosongsleepTimer_init(kosong)
{ STIF=0; //Tanda interupsi pengatur waktu tidur jelas 0
STIE=1; //Nyalakan pengatur waktu tidur terputus
EA =1; //Buka interupsi total
}
/*Atur interval terjadwal untuk pengatur waktu tidur -------------------------------------------------------*/
kosongsetSleepTimer(tidak ditandatanganiintdetik)
{ tidak ditandatanganipanjangsleepTimer =0;
sleepTimer |= ST0; //Dapatkan nilai hitungan pengatur waktu tidur saat ini
sleepTimer |= (tidak ditandatanganipanjang)ST1 <<8; sleepTimer |= (tidak ditandatanganipanjang)ST2 <<16;
sleepTimer += ((tidak ditandatanganipanjang)sec * (tidak ditandatanganipanjang)32768); //Ditambah durasi waktu yang diperlukan
ST2 = (tidak ditandatanganiarang)(sleepTimer >>16); //Atur nilai perbandingan pengatur waktu tidur
ST1 = (tidak ditandatanganiarang)(sleepTimer >>8); ST0 = (tidak ditandatanganiarang)pengatur waktu tidur;
}
/*Pilih Mode Daya -------------------------------------------------------*/
kosongPowerMode(tidak ditandatanganiarangmode)
{
jika(mode <4) { TIDUR &=0xfc; //Hapus SLEEP.MODE ke 0
TIDUR |= mode; //Pilih Mode Daya
PCON |=0x01; //Aktifkan mode daya ini
}
}
/*Fungsi penundaan -------------------------------------------------------*/
kosongPenundaan(tidak ditandatanganiintn)
{ tidak ditandatanganiinti,j;
untuk(i=0; i<n; i++)
untuk(j=0; j <1000; j++);
}
[url =] [/url]
Fungsi utama[url =] [/url]
/*Fungsi utama -------------------------------------------------------*/
kosongutama(kosong)
{ xtal_init(); led_init();
//Status PM0, lampu menyala dan menunda
led1 = LED_ON; //Kecerahan LED1 menunjukkan bahwa sistem bekerja dalam mode PM0
Penundaan(10);
//Status PM1, lampu mati
setSleepTimer(1); //Atur interval waktu pengatur waktu tidur ke 1 detik
sleepTimer_init(); //Nyalakan pengatur waktu tidur terputus
led1 = LED_OFF; Mode Kekuasaan(1); //Atur mode daya ke PM1
//Setelah 1 detik, PM1 memasuki PM0, menyala dan menunda
led1 = LED_ON; Penundaan(50);
//PM2, lampu mati
setSleepTimer(2); //Atur interval waktu untuk pengatur waktu tidur ke 2 detik
led1 = LED_OFF; Mode Kekuasaan(2); //Atur mode daya ke PM2
//Setelah 2 detik, PM2 memasuki PM0, menyala dan tertunda
led1=0; Penundaan(50);
//PM3, lampu padam
io_init(); //Menginisialisasi interupsi eksternal
led1 = LED_OFF; Mode Kekuasaan(3); //Atur mode daya ke PM3
//Ketika gangguan eksternal terjadi, PM3 memasuki PM0 dan menyala
led1 = LED_ON;
sementara(1);
}
[url =] [/url]
Prosedur layanan interupsi[url =] [/url]
/*Program layanan interupsi eksternal -------------------------------------------------------*/
#pragmavektor = P0INT_VECTOR __interruptkosongP0_ISR(kosong)
{ EA =0; //Gerbang terputus
Penundaan(50);
jika((P0IFG &0x02) >0) //Kunci terputus
{ P0IFG &= ~0x02; //P0.1 Tanda interupsi jelas0
} P0JIKA =0; //Tanda interupsi P0 jelas0
EA =1; //Interupsi terbuka
}
/*Pengatur waktu tidur mengganggu program servis -------------------------------------------------------*/
#pragmavektor= ST_VECTOR __interruptkosongsleepTimer_IRQ(kosong)
{ EA =0; //Gerbang terputus
STIF=0; //Tanda interupsi pengatur waktu tidur jelas 0
EA =1; //Interupsi terbuka
}
[url =] [/url]
Cara menggunakan pengatur waktu tidur untuk membangunkan sistem dapat diringkas sebagai berikut:Buka Interupsi Pengatur Waktu Tidur → Atur Interval Waktu Tidur → Atur Mode Daya (Catatan: langkah "Atur Interval Pengatur Waktu Tidur" harus sebelum "Atur Mode Daya", karena sistem tidak akan terus menjalankan program setelah memasuki tidur) Selanjutnya, mari kita fokus pada subfungsi yang mengatur interval pengatur waktu tidur:setSleepTimer Pertama-tama, pengenalan singkat tentang pengatur waktu tidur: itu berjalan32.768kHzdariTempat ke-24Timer, saat sistem berjalanSelain PM3Di semua mode daya, pengatur waktu tidur akanPengoperasian tanpa gangguan。 Register yang digunakan oleh pengatur waktu tidur adalah:ST0,ST1,ST2。 Berikut ini adalah pengantar terperinci tentang fungsinya dari manual bahasa Cina CC2430:
Dapat dilihat bahwa fungsinya mencakup dua aspek:Baca,Tulis。 Baca: Digunakan untuk membaca nilai hitungan pengatur waktu saat ini, urutan pembacaan harus diikuti:Baca ST0 → Baca ST1 → Baca ST2 Tulis: Digunakan untuk mengatur nilai perbandingan timer (ketika nilai hitungan timer = nilai perbandingan, interupsi terjadi), urutan penulisan harus mengikuti:Tulis ST2 → tulis ST1 → tulis ST0 Oke, mari kita jelaskan dalam kombinasi dengan kode sumber: (1) Pertama, tentukan sleepTimer variabel panjang yang tidak ditandatangani (32-bit) untuk menerima nilai hitungan saat ini dari pengatur waktu tidur: tidak ditandatanganipanjangsleepTimer =0;
sleepTimer |= ST0; //Dapatkan nilai hitungan pengatur waktu tidur saat ini
sleepTimer |= (tidak ditandatanganipanjang)ST1 <<8; sleepTimer |= (tidak ditandatanganipanjang)ST2 <<16;
(2) Kemudian tambahkan interval waktu yang diperlukan: sleepTimer += ((tidak ditandatanganipanjang)sec * (tidak ditandatanganipanjang)32768); //Ditambah durasi waktu yang diperlukan
Berikut penjelasannya singkat: Mengapa 1s mewakili 32768? Karena timer bekerja di bawah 32.768kHz, dibutuhkan 1/32768 detik untuk setiap 1 yang ditambahkan ke timer; Tambahkan 32768, dan Anda akan membutuhkan 1 detik; (3) Terakhir, nilai sleepTimer digunakan sebagai nilai perbandingan timer: ST2 = (tidak ditandatanganiarang)(sleepTimer >>16); //Atur nilai perbandingan pengatur waktu tidur
ST1 = (tidak ditandatanganiarang)(sleepTimer >>8); ST0 = (tidak ditandatanganiarang)pengatur waktu tidur;
Dengan cara ini, Anda dapat berhasil mengatur periode waktu pengatur waktu~ (Catatan: Adapun bagian lain dari kode sumber, saya percaya bahwa dikombinasikan dengan anotasi terperinci, Anda dapat dengan mudah memahami, dan saya tidak akan mengulanginya di sini) (4) Hasil eksperimenProgram berjalan, mengamati LED1, fenomenanya adalah:LED1 berkedip (yaitu, hidup-> mati 1 kali), berkedip lagi setelah 1 detik, berkedip lagi setelah 2 detik, lalu tetap mati, lalu menekan S1, LED1 menyala. Fenomena eksperimental sepenuhnya konsisten dengan harapan, Lebih ~
3. KesimpulanOh ~ Setelah meluangkan waktu luang selama 2 hari, akhirnya saya mendapatkan log ini. Saya benar-benar menemukan bahwa menulis blog, terutama posting blog yang "ramah pembaca", memang merupakan pekerjaan fisik: ketelitian, estetika, logika... Ini semua tentang pertimbangan. Setiap kali saya memposting kode, saya pikir itu terlalu panjang, tetapi saya enggan menggunakan alat lipat yang disertakan dengan taman blog. Oleh karena itu, dalam posting blog ini, penulis secara tentatif menambahkan beberapa elemen JQuery untuk mencapai pelipatan kode yang mulus, dan masih ada sedikit rasa pencapaian, hehe (Pemula JQuery, jangan menertawakan master~). Tapi saya tidak tahu apakah ini benar-benar meningkatkan keterbacaan artikel, dan pembaca serta teman dipersilakan untuk berkomentar:) Bulan ini, penulis benar-benar memutuskan untuk berakar di taman blog, jadi saya menghabiskan banyak waktu luang untuk menulis posting blog. Ketika saya menulis blog untuk pertama kalinya, meskipun hanya ada sedikit komentar, sebagian besar log memiliki rasio klik-tayang lebih dari 500, yang merupakan sedikit dorongan bagi saya! Memang dibutuhkan keberanian untuk mempublikasikan konten tentang mikrokontroler di taman blog, tetapi saya akan berpegang teguh padanya~ Sembilan posting blog dari awal hingga saat ini berfokus pada penggunaan modul perangkat keras dasar pada chip CC2430. Sejauh ini, kami pada dasarnya telah melalui sebagian besar periferal pada CC2430, tetapi masih ada hal-hal seperti akses Flash, generator nomor acak, koprosesor AES, komunikasi RF, dll., yang belum disentuh. Namun, perjalanan Zigbee belum berakhir, dan penulis bermaksud untuk secara selektif mengisi kelalaian ini di topik berikutnya (implementasi protokol Z-Stack). Dalam posting blog berikutnya, saya berencana untuk mengakhiri perjalanan pertama Zigbee dengan eksperimen yang sedikit lebih komprehensif dan diperluas - "sistem pemantauan suhu", dan menjelaskan cara menerapkan poin-poin pengetahuan yang dipelajari sebelumnya secara komprehensif. Bahkan, tidak memenuhi syarat untuk disebut "PenjelasanSebagai pemula, penulis hanya berharap dapat saling mendorong dan membuat kemajuan bersama dalam proses penulisan gelar doktor! </n; i++)
|