|
1. Menghubungkan tingkat atas dan bawah Dalam kuliah sebelumnya, kami membiasakan diri dengan proses dasar IAR mengembangkan program CC2430 melalui eksperimen berkedip LED sederhana. Pisaunya telah diasah (meskipun batu asah saya tidak bagus), dan sekarang saya akan mulai menyembelih serangga :). Selanjutnya, mari kita pelajari beberapa eksperimen dasar CC2430. Setiap eksperimen kecil dibagi menjadi tiga bagian: "Pengenalan Eksperimen", "Bagan Alur Program", dan "Kode Sumber dan Analisis Eksperimental". Artikel ini menjelaskan interupsi eksternal. 2. Gangguan eksternal(1) Pengantar percobaanInterupsi adalah mekanisme internal mikrokontroler untuk memproses peristiwa internal atau eksternal secara real time. Ketika peristiwa internal atau eksternal terjadi, sistem interupsi mikrokontroler akan memaksa CPU untuk menjeda program yang sedang dijalankan dan sebagai gantinya memproses peristiwa interupsi. Interupsi dibagi menjadi interupsi eksternal dan internal, dan CC2430 berisi total 18 sumber interupsi (untuk deskripsi interupsi spesifik dan definisi vektor interupsi, silakan lihat "CC2430 Manual Bahasa Cina》)。 Sekarang mari kita lihat diagram sirkuit papan pengembangan ini:
Tombol S1 telah terhubung ke P0.1 pada papan pengembangan, dan efek dari percobaan ini adalah memicu interupsi P0.1 melalui tombol S1, dan kemudian mengontrol on/off LED1 di subprogram layanan interupsi. (2) Prinsip eksperimental dan diagram alirBagan alir eksperimental adalah sebagai berikut:
(3) Kode sumber eksperimental//头文件
#include
//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3
kosongPenundaan(tidak ditandatanganin)
{
tidak ditandatanganitt;
untuk(tt =0; tt<n; tt++);
untuk(tt =0; tt<n; tt++);
untuk(tt =0; tt<n; tt++);
untuk(tt =0; tt<n; tt++);
untuk(tt =0; tt<n; tt++);
}
//32M晶振初始化
kosongxtal_init(kosong)
{ TIDUR &= ~0x04; //都上电
sementara(! (TIDUR &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Pilih osilator kristal 32MHz TIDUR |=0x04;
}
//LED灯初始化
kosongled_init(kosong)
{ P1SEL =0x00; P1 adalah port I/O normal P1DIR |=0x0F; Keluaran P1.0 P1.1 P1.2 P1.3
led1 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
kosongio_init(kosong)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
kosongutama(kosong)
{ xtal_init(); led_init(); io_init();
sementara(1); //等待中断
}
//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt kosongP0_ISR(kosong)
{ EA =0; Gerbang terputus
Penundaan(10000); Penundaan(10000); Penundaan(10000); Penundaan(10000); Penundaan(10000);
jika((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0JIKA =0; //P0中断标志清0
EA =1; //开中断
}
Pertama, inisialisasi jam sistem: pilih osilator kristal 32MHz. Kemudian inisialisasi LED: atur P1 sebagai port I/O umum, atur arah P1.0 ~ P1.3 sebagai output, lalu matikan 4 lampu LED. Selanjutnya, konfigurasikan register SFR yang relevan untuk interupsi eksternal untuk mengaktifkan interupsi di semua tingkatan, yang melibatkan 3 SFR:EA、IEN1、PICTL(Untuk detail setiap SFR, silakan lihatCC2430 Manual Bahasa Cina》): EA- Mengaktifkan interupsi total; IEN1.5- P0 mengaktifkan interupsi; PICTL.3—— P0.1 interupsi port mengaktifkan; PICTL.0—— Atur drop edge input port P0.1 untuk menyebabkan pemicu interupsi. Kemudian gunakan while(1) di fungsi utama dan tunggu interupsi. CC2430 Tips(1) Ringkasan sintaks penetapan bit Sering kali, kita perlu menetapkan bit (0 atau 1) ke satu byte SFR untuk mengontrol perangkat keras secara tepat. Ada SFRMendukung pengalamatan bitMisalnya, TCON, P0, dll., saat ini, penetapan counterpoint sangat sederhana, cukup kueri definisi bit di bagian SFR Bit Access dari file header ioCC2430.h: P0_0 = 0; // tetapkan 0 ke digit pertama P0 P0_0 = 1; // tetapkan nilai 1 ke digit pertama P0
Tetapi beberapa SFR tidak ada di sanaPengalamatan bit tidak didukung, seperti dalam percobaan iniPICTL, saat ini, Anda ingin menetapkan nilai ke salah satunya, sintaksnya adalah sebagai berikut: PICTL &= ~0x01; Tetapkan nilai 0 ke digit pertama PICTL |= 0x01; Tetapkan nilai 1 ke digit pertama
Anda dapat mengingat&= ~,|=Dua sintaks penetapan bit yang umum digunakan ini. (2) Ringkasan pemberdayaan interupsi Ketika interupsi terlibat dalam program, itu harus diaktifkan sebelum interupsi dipicu. Hierarki sistem pengaktifan interupsi C51 sangat jelas: Mengganggu Bos: EAadalah bos, bertanggung jawabUmumAktifkan Interupsi: EA = 1;
Setiap pemimpin regu yang terputus: Berikutnya adalah untuk masing-masingBagian fungsional(seperti P0, timer 1, dll.), SFR tersebut umumnya dapat dialamatkan bit, dan namanya umumnya berisi IE (Interrupt Enable): P0IE = 1;
Setiap anggota tim diinterupsi: Squad Tetapi karena setiap fitur juga berisi beberapa interupsi di dalamnya, level terakhir adalah untuk iniSetiap interupsiJenis SFR ini umumnya bitless dan tidak dapat dialamatkan, dan biasanya berisi IE (Interrupt Enable) atau IM (Interrupt Mask) dalam nama: PICTL |=0x01;
Tidak perlu menghafal interupsi SFR, cukup pahami hierarkinya dan kemudian luangkan waktu untuk mencari file manual atau header. (3) Mengganggu penulisan program Penggunaan interupsi dalam suatu program umumnya mencakup dua bagian: penulisan subprogram layanan interupsi dan pembukaan pemberdayaan interupsi. Fungsi interupsi telah diperkenalkan di atas, dan berikut ini adalah pengantar singkat untuk penulisan subprogram layanan interupsi: Tentukan terlebih dahuluVektor putus, yang dapat dikueri di bagian Vektor Interupsi dari file header ioCC2430.h, dengan sintaks berikut: #pragma vektor = vektor interupsi
Kemudian tulis penangan interupsi segera setelahnya, yang disusun sebagai berikut: __interrupt nama fungsi void (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. KesimpulanArtikel ini memperkenalkan metode implementasi interupsi eksternal sederhana berdasarkan CC2430, dan setelah dasar interupsi, kami akan memperkenalkan modul lain yang sangat penting - pengatur waktu. CC2430 memiliki total 4 pengatur waktu, yang dapat dibagi menjadi tiga kategori: pengatur waktu 1, pengatur waktu 2, pengatur waktu 3/4 (3 dan 4 pada dasarnya adalah penggunaan yang sama). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|