| I. 前回から次回への引き継ぎ 前回の講義では、最も簡単なLED点滅の小さな実験を通して、IARでCC2430プログラムを開発する基本的なプロセスに慣れました。ナイフは少なくとも研がれ(この研ぎ石はあまり得意ではありませんが)、次は虫を屠る番です :)。次に、CC2430の基本的な実験をいくつか覚えよう。それぞれの小さな実験は、「実験紹介」、「プログラムフローチャート」、「実験ソースコードと解析」の3つのパートに分けて説明します。 今回は、外部割り込みについて説明します。 第2回 外部割り込み(1) 実験の紹介 割り込みは、リアルタイムマイコンが内部または外部のイベントに対処するための内部機構です。内部または外部イベントのいくつかの種類が発生したときに、マイコンの割り込みシステムは、CPUが実行中のプログラムを一時停止するように強制的に割り込みイベント処理に移動するには、割り込み処理が完了し、その後、プログラムによって中断されるように戻り、実行し続ける。 割り込みは外部割り込みと内部割り込みに分けられ、CC2430には合計18個の割り込みソースがあります(具体的な割り込みの説明と割り込みベクタの定義は、"CC2430中国語マニュアル"を参照してください)。 それでは、この開発ボードの回路図を見てみましょう:
開発ボードにはS1ボタンとP0.1が接続されており、この実験で実現したい効果は、キーS1を押すことでP0.1の割り込みをトリガし、割り込みサービスサブルーチンでLED1の点灯/消灯を制御することである。 (2) 実験原理とフローチャート 実験のフローチャートは以下の通りである: .gif")
c
(3)実験用ソースコード// ヘッダファイル# include // delay subfunction#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay(unsigned n) { & & & nbsp;unsigned tt
nbsp; 符号なし 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水晶の初期化void xtal_init(void) { SLEEP &=~0x04; &. nbsp; //全電源投入while(! (SLEEP & 0x40)); //水晶発振器オン、安定 CLKCON &=~0x47; & nbsp; //水晶発振器選択。
nbsp;//32MHz水晶発振器選択 SLEEP |=0x04; }//LED初期化void led_init(void) { P1SEL =0x00;  
; //P1は通常のI/Oポート P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 出力
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//ioと外部割り込みの初期化void io_init(void) { P0INP &=~0X02;
/ /P0.1はプルアップとプルダウンを持つ EA =1; //トータル割り込みイネーブル P0IE =1; &
nbsp; //P0割り込みイネーブル PICTL |=0X09; //P0.1ポート割り込みイネーブル、立ち下がりエッジトリガ P0IFG &=~0x02
; //P0.1割り込みフラグクリア 0 };//メイン関数void main(void) { xtal_init(); led_init();
io_init();while(1); //割り込み待ち }//割り込みサービスサブルーチン#pragma vector = P0INT_VECTOR__interrupt void P0_ISR(void) { EA =0;
/ / 割り込みをオフにする Delay
(10000); Delay(10000); Delay(10000); Delay(10000); &
nbsp; if((P0IFG & 0x02 )>0 ) //キー割り込み{ P0IFG &=~0x02; &
nbsp; //P0.1割り込みフラグクリア0 led1 = !led1; } P0IF =0; &
nbsp; //P0割り込みフラグクリア0 EA =1; & nbsp; // 割り込みオン } } P0IF = 0; & nbsp;//P0 割り込みフラグクリア 0
最初にユニティ・クロックの初期化を行います。 P1を汎用I/Oポートに設定し、P1.0~P1.3方向を出力に設定し、4つのLEDを消灯させます。 EA、IEN1、PICTLの3つのSFR(各SFRの詳細については『CC2430中国語マニュアル』を参照)を使って、外部割り込み用に関連するSFRレジスタを設定し、すべてのレベルで割り込みイネーブルをオンにする: EA -- トータル割り込みイネーブル; IEN1.5 -- P0 割り込みイネーブル; PICTL.3 -- P0.1ポート割り込みイネーブル; PICTL.0 -- P0.1ポート入力の立ち下がりエッジを割り込みトリガに設定する。 その後、メイン関数内でwhile(1)を使って割り込みを待つ。 CC2430 Tips(1) ビット割り当て構文 まとめ ハードウェア・デバイスを正確に制御するために、1バイトのSFRのビットに値(0か1)を割り当てる必要があることがよくあります。 このとき、TCON、P0などのビット・アドレッシングをサポートしているSFRもありますが、ビットの割り当ては非常に簡単で、ioCC2430.hヘッダーファイルのSFRビット・アクセス部のビット定義に問い合わせるだけです: P0_0 = 0; // P0 0の値を割り当てる最初のビット P0_0 = 1; / / P0 1の値を割り当てる最初のビット しかし、 ビット・アドレッシングをサポートしていないSFRもあります 。 PICTL &= ~0x01; //先頭ビットに0を代入 PICTL |= 0x01; //先頭ビットに1を代 入amp ;= ~, |= ~, |= ~,|= P0_0 =1; //P0の先頭ビットに1を代入 と覚えておけばよい。 amp;= ~,|= この2つは、一般的なビット割り当て構文です。 (2) 割り込みイネーブルの概要 割り込みがプログラムに関与する場合、割り込みがトリガされる前にイネーブルする必要がある。 C51割り込みイネーブルシステムは、その階層構造は非常に明白である: 割り込みボス:EAが ボスであり、総割り込みイネーブルの責任: EA = 1、 割り 込み切り離しキャプテン:次は、各機能コンポーネント(P0、タイマ1など)のイネーブル制御のためであり、そのようなSFRは一般的にビットアドレス指定可能であり、一般的に命名IE(割り込みイネーブル)が含まれています: P0IE = 1、 割り込みチーム メンバー:切り離しが、プログラムの中断の ために、割り込みを トリガする前に割り込みを 有効にする必要があります。
各割り込みチームメンバー:チームしかし、各機能コンポーネントはまた、複数の割り込みが含まれているため、最後のレベルは、各割り込みイネーブル制御のため、そのようなSFRは、一般的にIE(割り込みイネーブル)またはIM(割り込みマスク)を含む一般的に命名されたビットアドレス指定可能ではありません: PICTL|= 0x01; 割り込みSFRを記憶する必要はありません 。 割り込みSFRの階層を理解し、使用する際にマニュアルやヘッダファイルを参照すれば、割り込みSFRを記憶する必要はありません。 (3) 割り込みプログラムの書き方 割り込みプログラムの書き方は、一般に割り込みサービスサブルーチンの記述と割り込みイネーブルのオープン の2つからなります。 割り込みサービスサブルーチンの作成は、割り込み イネーブルの作成と 割り込み イネーブルのオープンの 2 つから構成さ れます 。
割り込み void 関数名(void){ //割り込みオン //割り込み処理 //割り込みフラグクリア 0 //割り込みオフ } . まとめ この記事では、CC2430 をベースにした簡単な外部割り込みの実装方法を紹介しましたが、割り込みを基本として、もう 1 つの非常に重要なモジュールであるタイマについても紹介します。 CC2430 には合計 4 つのタイマがあり、タイマ 1、タイマ 2、タイマ 3/4 の 3 つのカテゴリに分けられます(タイマ 3 と 4 は基本的に同じものを使用します)。は同じ)。 </n;tt++)である。 </n;tt++);。 </n;tt++)。 </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++).
|