[CC2530はじめにチュートリアル-06] CC2530のADCの動作原理とアプリケーション
[CC2530はじめにチュートリアル-05] CC2530のシリアルインターフェースの原理と応用
【CC2530入門コース-04】CC2530タイマー/カウンターの原理と応用
【CC2530入門コース-03】CC2530割り込みシステムと外部割り込みアプリケーション
[CC2530はじめにチュートリアル-02] CC2530の一般的なI / Oポートの入出力制御
[CC2530入門チュートリアル-01] CC2530マイクロコントローラー開発入門基本
1.割り込みに関連する基本概念
カーネルと周辺機器の間の相互作用には、ポーリングと割り込みの2つの主な方法があります。ポーリング方法は公平に見えますが、実際の作業効率は非常に低く、時間内に緊急事態に対応できません。割り込みシステムにより、カーネルは緊急事態に対応できるようになります。
CPUの現在のプログラムを実行する場合、システムの緊急事態により、CPUは実行中のプログラムを一時停止し、緊急事態に対処するために別の特別なプログラムを実行します。処理が終了すると、CPUは自動的にに戻ります。元の中断されたプログラムでの実行を継続します。この種のプログラムは、中断と呼ばれる外部の理由により実行中に中断されます。
2つの重要な概念:
<1> 割り込みサービス機能:カーネルが割り込みに応答した後に実行される対応する処理プログラム。
<2> 割り込みベクタ:割り込みサービスルーチンのエントリアドレス。各割り込みソースは、固定エントリアドレスに対応しています。カーネルが割り込み要求に応答すると、現在のプログラムの実行を一時停止し、エントリアドレスにジャンプしてコードを実行します。
第二に、CC2530の割り込みシステム
CC2530には18個の割り込みソースがあり、各割り込みソースは独自の一連の特殊機能レジスタによって制御されます。関連する特殊機能レジスタを設定し、18個の割り込みソースの優先度を設定し、割り込みアプリケーションの応答を有効にするようにプログラムできます。一般的に使用される割り込みソースは次のとおりです。
3、CC2530割り込み処理関数の書き込み方法
割り込みサービス関数は、一般的なカスタム関数とは異なり、特定の書き込み形式があります。
<1>各割り込みサービス機能の前に、最初の文を追加する必要があります。
#pragma vector = <割り込みベクトル>
<割り込みベクタ>は、次に書き込む割り込みサービス関数がその割り込みソースにサービスを提供することを示します。このステートメントを記述する方法は2つあります。
#pragma vector = 0x7B または #pragmavector = P1INT_VECTOR
前者は割り込みベクタのエントリアドレスであり、後者はヘッダーファイル「ioCC2530.h」のマクロ定義です。
<2> _ _interruptキーワードは、関数が割り込みサービス関数であり、<関数名>をカスタマイズでき、関数本体にパラメーターや戻り値を含めることができないことを示します。
第四に、CC2530の外部割り込み
CC2530のP0、P1、P2ポートの各ピンには外部割り込み入力機能があります。一部のピンに外部割り込み機能を持たせるには、IENxレジスタ、PxIENレジスタ、PICTLレジスタを正しく設定する必要があります。各割り込みソースには独自の割り込みイネーブルスイッチがあるほか、割り込みシステムにはマスタースイッチもあり、「EA = 1 ;」でオンにできます。
ポートP0、P1、およびP2は、それぞれP0IF、P1IF、およびP2IFを割り込みフラグビットとして使用します。いずれかのポートグループのピンで外部割り込みが発生すると、対応するポートグループの割り込みフラグが自動的に設定されます。割り込みサービス機能では、外部割り込みフラグを手動でクリアする必要があることに注意してください。そうしないと、CPUが繰り返し割り込みを入力します。 ポートステータスフラグレジスタP0IFG、P1IGF、およびP2IFGは、3つのポートの各ピンの割り込みトリガーステータスに対応します。ピンで外部割り込みトリガーが発生すると、対応するフラグビットが自動的に設定されます。このフラグも必要です。手動でクリアしました。
5、トレーニングケース:LEDライトを制御するための外部割り込み入力
[1]外部割り込み初期化関数Init_INTP()を設計する
外部割り込み初期化機能は、主に割り込みに関連する特殊機能レジスタの設定を完了するためのものです。
<1>ポートグループの割り込み機能を有効にするようにIENxレジスタを設定します。
<2>特定の外部割り込みピンを有効にするようにPxIENレジスタを設定します。
<3> PICTLレジスタを設定し、割り込みトリガーモードを設定します。
[2]外部割り込みサービス関数Int1_Sevice()を設計する
割り込みサービス関数を書き込むときは、書き込み形式が正しく、割り込みベクタを間違えないようにする必要があります。特に注意してください:関数内のポートグループとピンフラグをクリアしないと、CPUが繰り返し割り込みを入力します。最初にピンフラグPxIFGをクリアしてから、ポートグループフラグPxIFをクリアする必要があります。
[3]トレーニングプロジェクトのソースコードとコメント
#include "ioCC2530.h"
#define LED6 P1_4
#define LED3 P1_0
#define LED4 P1_1
/*===================延时函数=========================*/
void Delay(unsigned int t)
{
while(t--);
}
/*==================端口初始化函数=====================*/
void Init_Port()
{
//将P1_0、P1_1和P1_4设置为通用I/O端口功能
P1SEL &= ~0x13;
//将P1_0、P1_1和P1_4的端口传输方式设置为输出
P1DIR |= 0x13;
LED6 = 0;
LED3 = 0;
LED4 = 0;
}
/*==================跑马灯子函数=====================*/
void LED_Running()
{
LED3 = 1;
Delay(50000);
LED4 = 1;
Delay(50000);
LED3 = 0;
Delay(50000);
LED4 = 0;
Delay(50000);
}
/*===============外部中断初始化函数==================*/
void Init_INTP()
{
IEN2 |= 0x10; //端口1中断使能
P1IEN |= 0x04; //端口P1_2外部中断使能
PICTL |= 0x02; //端口P1_0到P1_3下降沿触发
EA = 1; //使能总中断
}
/*================外部中断1服务函数====================*/
#pragma vector = P1INT_VECTOR //外部中断1的向量入口
__interrupt void Int1_Sevice()
{
LED6 = ~LED6;
/*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
P1IFG &= ~ 0x04; //软件清除P1_2引脚的标志位
P1IF = 0; //软件清除P1端口组的标志位
}
/*====================主函数==========================*/
void main()
{
Init_Port(); //初始化通用I/O端口
Init_INTP(); //初始化外部中断
while(1)
{
LED_Running(); //跑马灯
}
}