CC2540開發板學習筆記(四)——定時器


一、實驗內容

     分別使用定時器T1和T3使得LED周期性閃爍

二、實驗過程

1、定時器T1(查詢IRCON來控制)

(1)需要調配的寄存器

T1CTL(0XE4) Timer1控制寄存器
  BIT3,BIT2:定時器分頻倍數選擇
00:不分
01:8分頻
10:32分頻
11:128分頻
  BIT1,BIT0:定時器模式選擇:
00:暫停
01:自動重裝:0X0000—0XFFFF
10:比較計數:0X0000—T1CC0
11:PWM方式
T1STAT(0XAF) Timer1狀態寄存器:
  BIT5:OVFIF
定時器溢出中斷標志,在數值達到計數終值時置為1.
 

Bit4: 定時器 1 通道 4 中斷標志位
Bit3: 定時器 1 通道 3 中斷標志位
Bit2: 定時器 1 通道 2 中斷標志位
Bit1: 定時器 1 通道 1 中斷標志位
Bit0: 定時器 1 通道 0 中斷標志位

IRCON(0XCO) 中斷標志位寄存器;

(2)定時器T1的初始化:

T1CTL=0X0d;
T1STAT=0X21;

(3)代碼實現

#include<ioCC2540.h>

#define LED1 P1_0    //定義LED1,方便查閱代碼

void Init()//初始化函數
{
  P1SEL = 0X00;    //實現LED的初始化
  P1DIR = 0X01;
  P1INP = 0X00;
  LED1 = 0;
  
  T1CTL = 0X0d;  //128分頻,自動重裝0X0000-0XFFFF;,時鍾頻率為16MHZ
  T1STAT = 0X21; //通道0,中斷有效
  EA=1;
}


void main(void)
{
  Init();
  unsigned char count=0;

  while(1)
  {
    if(IRCON>0)       //檢查是否置位為1
    {
      IRCON=0;
      count++;         //由於分頻128后,已經滿足1s的閃爍周期。

      if(count>=1)
      {
        count=0;
        LED1=~LED1;
      }
    }
  }
}

image

 

2、定時器T3(中斷方式)

(1)需要調配的寄存器

T3CTL(0XCB) Timer3:控制寄存器
  BIT7,BIT6,BIT5:定時器時鍾分頻倍數選擇

000:不分頻

001 :2 分頻

010 : 4 分頻

011 : 8分頻

100 :16 分頻

101 :32 分頻

110 : 64 分頻

111 :128分頻

  BIT4:T3起止控制位
  BIT3:溢出中斷掩碼
0:關中斷溢出
1:開中斷溢出
  BIT2:清計數值,高電平有效
  BIT1,BIT0:T3模式選擇:

00 :自動重裝 0X00 -0XFF
01 : DOWN ( 從 T3CC0 到 0X00 計數一次 )
10 : 模計數(反復從 0X00 到 T3CC0 計數)
11 : UP/DOWN( 反復從 0X00 到 T3CC0計數再到 0X00)

T3CCTL0(0XCC) T3通道 0 捕獲/比較控制寄存器
  BIT6:T3通道 0 中斷掩碼
0:關中斷,1:開中斷
  BIT5,BIT4,BIT3:T3通道 0 比較輸出模式選擇
  BIT2:T3通道 0 模式選擇:
0:捕獲     1:比較
  BIT1,BIT0:T3通道 0 捕獲模式選擇:

00 沒有捕獲

01 上升沿捕獲

10 下降沿捕獲

11 邊沿捕獲

T3CC0(0XCD) T3 通道 0 捕獲 / 比較寄存器
T3CCTL1(0XCE) T3通道 1 捕獲/比較控制寄存器
  BIT6:T3通道1中斷掩碼
0:關中斷,1:開中斷
  BIT5,BIT4,BIT3:T3通道 1 比較輸出模式選擇
  BIT2:T3通道 1 模式選擇:
0:捕獲     1:比較
  BIT1,BIT0:T3通道 1 捕獲模式選擇:

00 沒有捕獲

01 上升沿捕獲

10 下降沿捕獲

11 邊沿捕獲

T3CC1(0XCF) T3 通道 1 捕獲 / 比較寄存器

定時器T3有 4種工作模式:分別是自由、正計數 /倒計數模式、 倒計數模式。
image

(2)代碼實現(使用自由模式)

無法解析此遠程名稱: 'util.cnblogs.com#include<ioCC2540.h>

#define LED1 P1_0    //定義LED1,方便查閱代碼

unsigned char count=0;

void Init()//初始化函數
{
  P1SEL = 0X00;    //實現LED的初始化
  P1DIR = 0X01;
  P1INP = 0X00;
  LED1 = 0;
  
  T3CTL = 0X08;  //開溢出中斷
  T3IE = 1;      //開縱中斷和T3中斷
  T3CTL |= 0XE0; //開128分頻,128/(16*10e6)*N=0.5s,N=65536;
  T3CTL &= ~0x03; //自動重裝   貌似溢出的數值改變成256.。不懂為什么。。
  T3CTL |= 0X10; //2分頻(16MHZ),然后就是開始啟動
  EA=1;          //打開中斷總閘
  
}


void main(void)
{
  Init();

  while(1)
  {
   
  }
}
  

#pragma vector = T3_VECTOR
__interrupt void fu()
{
  IRCON = 0x00;   //清除中斷標志
  count++;
  if(count>250)
  {
    count = 0;
    LED1=~LED1;
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM