11 タイマカウンタ開発の割り込みメソッド
LED 制御回路は前のセクションと同じです。CC2530
の T3 タイマー (8 ビット) は、T3GJL、T3CCTLO、T3CCO、T3CCTL1、T3CC レジスタを理解する必要があります。テーブルレジスタ
の内容に従って T3 を設定します タイマ T3 は 8 ビットなので、設定が若干異なります。
T3CTL = 0x08 ;
オーバーフロー割り込みを有効にする
T3IE = 1;
合計割り込みと T3 割り込みを有効にする
TRCTL = OxE0;
//128 分周、128/16000000*N=0.5S、N=62500
T3CTL &=~Ox03;
自動リロード 00 one > Oxff 62500/255=245 (回)
T3CTL = Ox10;
!Start
EA= 1;
その後、合計割り込みをオンにする
注:
(1) T3CTL &= ~0X03; このステートメントは次のように理解されます: 0X03=0000 0011, then~ 0X03 =1111 1100; したがって、T3CTL &= ~0X03 を実行した後、T3CTL の他のビットは変更されず、D0 と D1 は 0 になります。
(2) 128で割るので、1回カウントするのにt=128/16000000の時間がかかり、0.5秒の遅延を得たい場合は、128/16000000*N=0.5Sとなり、N=65200カウントしなければなりません。回。そして、Timer3 を 0x00 ~ 0xFF を自動的にリロードするように設定します。つまり、256 回カウントするオーバーフロー割り込みを生成します。今度は 65200 回カウントしたいので、LED1 を反転させるには 254 回のオーバーフロー割り込みを蓄積する必要があります。
| はビット単位の演算であり、演算オブジェクトは 1 です。& もビット単位の演算ですが、演算オブジェクトは 0 で、~ の反転演算です。
実装コード:
void T3init(void)
{
T3CTL |= 0x08; //0x08=1000 或操作1,仅操作第3位,不影响其他位使溢出中断可以,不操作其他位
T3IE= 1; //开总中断
T3CTL |= 0xE0; //0xE0=1110 0000 或操作1,仅操作7:5位,128分频 128/16000000*N=0.5s,N=62500
T3CTL &= ~0x03; //0x03=0000 0011,取反1111 1100,Free running, repeatedly count from Ox00 to OxFF
//自动从0x00到0xff(255)重装,62500/255=245次,&操作0,1:0位置0,其他位不变
T3CTL != 0x10; //启动 0x10=0001 0000 或操作1,仅改变第4位,启动
EA= 1; //再开启一开总中断
}
タイマー割り込みハンドラー関数:
テンプレート:
#pragma Vector = T3_VECTOR // 形式: #pragma Vector = 割り込みベクトルの後に割り込みハンドラーが続く
__interrupt void T3_ISR(void)
{
この
場合:
#pragma vector = T3_VECTOR //格式:#pragma vector = 中断向量,紧接着是中断处理程序
__interrupt void T3_ISR(void)
{
IRCON = 0x00;//来中断就清0,防止误操作,方便下一次判断
if(count ++ > 245) //0.5s时间
{
count = 0; //每次进入就计数清零
LED1 = ~LED1;
}
/*Delay(10); //去除抖动
LED1=~LED1; //改变LED1状态
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
*/
}
プログラム本体:
/*************************
*程序入口函数
*************************/
void main(void)
{
ledinit();
T3init();
while(1)
{
//空循环即可
};
};
完全なテストコード:
#include <ioCC2540.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define LED1 P1_0 //
uint count; //定时器计数
void ledinit(void)
{
P1DIR |= 0x01;//输出模式
LED1 =0;//上电默认输出0,即关灯
}
void T3init(void)
{
T3CTL |= 0x08; //0x08=1000 或操作1,仅操作第3位,不影响其他位使溢出中断可以,不操作其他位
T3IE= 1; //开总中断
T3CTL |= 0xE0; //0xE0=1110 0000 或操作1,仅操作7:5位,128分频 128/16000000*N=0.5s,N=62500
T3CTL &= ~0x03; //0x03=0000 0011,取反1111 1100,Free running, repeatedly count from Ox00 to OxFF
//自动从0x00到0xff(255)重装,62500/255=245次,&操作0,1:0位置0,其他位不变
T3CTL != 0x10; //启动 0x10=0001 0000 或操作1,仅改变第4位,启动
EA= 1; //再开启一开总中断
}
/****************************
定时器中断处理函数
*****************************/
#pragma vector = T3_VECTOR //格式:#pragma vector = 中断向量,紧接着是中断处理程序
__interrupt void T3_ISR(void)
{
IRCON = 0x00;//来中断就清0,防止误操作,方便下一次判断
if(count ++ > 245) //0.5s时间
{
count = 0; //每次进入就计数清零
LED1 = ~LED1;
}
/*Delay(10); //去除抖动
LED1=~LED1; //改变LED1状态
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
*/
}
/*************************
*程序入口函数
*************************/
void main(void)
{
ledinit();
T3init();
while(1)
{
//空循环即可
};
};