|
1. 上層と下層の接続 前回の記事では、シンプルな外部割り込みの実装について共に学びました。 割り込みの実践的な経験ができたので、このセクションではタイマー割り込みについて話しましょう。 CC2430には合計4つのタイマーがあり、タイマー1、タイマー2、タイマー3/4(3と4の使い方は同じ)の3つのカテゴリーに分けられます。 著者もCC2430に慣れておらず、タイマーに関する実務経験がほとんどないため、タイマーを深く分析するつもりはなく(何もできません)。 本記事では、カウントオーバーフロー割り込みにおけるタイマー1の使用に関する簡単な実験的探求のみを提供しており、その入力キャプチャ/出力比較/PWM機能については言及していません。 タイマー2とタイマー3/4は単純な関数導入に過ぎません。 著者の技術が一定のレベルに達したら、私はジグビーの実践経験の頂点に立ち、このエッセイを改善しようと思います。 2. タイマー1タイマー1はタイマー/カウンター/パルス幅変調を備えた16ビットタイマーです。 3つの個別にプログラム可能な入力キャプチャ/出力比較チャネルがあり、それぞれPWM出力または入力信号をキャプチャするためのエッジタイムとして使用できます(入力キャプチャ/出力比較とは何か、PWM出力の実装方法についてはCC2430中国語マニュアルを参照してください)。 タイマーにはとても重要な概念があります:動作モード。 動作モードには以下が含まれます:自由運転モード(フリーランニング)、型モード(モジュロ)およびポジティブカウント/カウントダウンモード(上下)。 以下は、3モード導入に関するCC2430中国語マニュアルからの抜粋です。
3つのモードを比較すると、自由動作モードのオーバーフロー値は0xFFFF変更不可能であることがわかります。 他の2つのモードは、T1CC0に値を割り当てることでタイマーのオーバーフロー値を正確に制御できます。 この実験では、タイマーが特定のT1CC0を通じて1秒ごとに割り込みをトリガーし、LEDライトの点滅間隔を正確に1秒まで制御します。 (1) 実験への導入タイマーのモジュロモードでは、LEDライトの点滅間隔は1秒単位で正確に制御されます。明るさは0.5秒、暗→0.5秒→明るい0.5秒→暗い0.5秒...... → 光は0.5秒→暗闇0.5秒(つまり暗から明までの時間間隔は1秒)です。 明暗反転は、溢れる割り込みによって実現されます。 (2) プログラムフローチャート
(3) 関連する計算前述の通り、LEDライトの状態は明るい0.5秒→暗0.5秒→明るい0.5秒→暗い0.5秒...... →0.5秒の光→0.5秒の暗光で、オーバーフロー割り込みで実装する必要があるため、タイマーのオーバーフロー時間は0.5秒でなければなりません。 これを行うには、対応するオーバーフロー値を計算する必要があります(一時的にNに設定)。 システムのクロック周波数は32MHzとして選択され、与えられたクロック周波数はデフォルトで16MHzです(どちらも特殊な機能レジスタによって決定されます)。CLKCON詳細については、CC2430中国語マニュアルをご参照ください。 タイマー1では、そのクロッククロスオーバーを128ディビジョンに設定します。 まとめると、リストは以下の通りです。
N=62500 を求めるには、その十六進数は 0xF424 であり、つまり T1CC0H=0xF4、T1CC0L=0x24 を設定する必要があります。 (4) 実験的ソースコードと解析/*
実験説明:タイマータイマー1実験、タイマーカウントオーバーフロー、LED1点滅
*/
#include
#define リード1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
虚無xtal_init(虚無)
{ 眠り &= ~0x04; //都上电
ただし(! (眠りと0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; 32MHzのクリスタルオシレーターを選びましょう 眠り |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
虚無led_init(虚無)
{ P1SEL =0x00; P1は通常のI/Oポートです P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 出力
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
虚無timer1_init(虚無)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; クロスオーバーは128台、 モジュロモード(0x0000->T1CC0); 走り始め; T1IF=0; 割り込み標識をクリアしてください
}
/*主函数
-------------------------------------------------------*/
虚無メイン(虚無)
{ xtal_init(); led_init(); timer1_init();
ただし(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma ベクトル=T1_VECTOR __interrupt虚無T1_ISR(虚無)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
よし、プログラムをコンパイルしてオンラインでデバッグし、開発ボードのLED1は予定通り点滅し、点滅間隔は約1秒くらいに感じます。 しかし、これだけでは実験の成功を証明するには不十分です。もし間隔が厳密に1秒と特定できれば、完璧です~そこでWIN 7の時計をオンにしました(タスクバーの右側の時間をクリックしてください)。 秒針を見ながら、彼は視界の端でLED1の点滅を見た。 その結果、2分以内に2つのテンポがほぼ同じになります(この精度は許容範囲です~)。 この時点で、実験はほぼ完了したと言える、へへ~ 3. タイマー2タイマー2とも呼ばれますMACタイマーはIEEE 802.15.4 MACにおけるイベントトラッキングプロトコルをサポートするために特別に設計されています。 タイマーには8桁のオーバーフローカウンターがあり、発生したサイクル数を記録できます。 フレームの受信開始・送信開始時刻、または送信が完了する正確な時刻を記録する16ビットのキャプチャレジスタがあります。 また、特定のタイミングで無線モジュールに様々なコマンドゲーティング信号(受信開始、送信開始など)を生成する16ビット出力比較レジスタも含まれます。 4. タイマー 3/4タイマー3/4はタイマー/カウンター/PWM機能を備えた8ビットタイマーです。 T3/T4には2つの出力比較チャネルがあり、それぞれPWM出力として使用できます。 5. 結論このセクションでは主にタイマー1のカウントオーバーフロー割り込みの方法を学び、LED点滅間隔1の正確な制御を実現します。 他に数個のタイマーはほんの一瞬で、後で追加します。 次のセクションでは、CC2430シリアルポート通信を紹介します。
|