モノのインターネット|タイマカウンタ開発の割り込み方法|タイマ割り込み処理関数|テストコード完成|モノのインターネットのBluetooth 4.0 BLE基礎 - 学習メモ(6)

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)
  {
    //空循环即可
  };
};

おすすめ

転載: blog.csdn.net/Medlar_CN/article/details/130640937