CC2530學習路線-基礎實驗-定時器控制LED燈亮滅(3)



1. 前期預備知識

1.1 定時器中斷觸發

本次實驗需關注的中斷寄存器。ui

image_1bqbsemrp897bm6hhja68i9vp.png-497.2kB

在本次實驗中,分別會使用T1和T3定時器完成功能,因此咱們須要注意上圖中標註出的中斷寄存器。
T1定時器:16位定時器(0~65535)。T3定時器:8位定時器(0~255)3d

1.2 相關寄存器

注:一下只給出實驗中新出現的寄存器,並非本次實驗需用到的全部寄存器;想了解其它寄存器做用及功能請看以前的基礎實驗文檔,或查看CC2530中文數據手冊。
寄存器名稱 做用 寄存器描述
T1CTL (0xE4) 定時器1的控制和狀態 T1CTL (bit 3~2) 爲分頻器劃分值,具體值以下:
00:標記頻率/1
01:標記頻率/8
10:標記頻率/32
11:標記頻率/128
T1CTL (bit 1~0) 爲選擇定時器1模式
00:暫停運行
01:自由運行
10:模,從0x0000到T1CC0反計數
11:正計數/倒計數,從0x0000到T1CC0反覆計數而且從T1CCO倒計數到0x000
T1STAT (0xAF) 定時器1 狀態 bit5:定時器 計數器溢出中斷標誌
bit4:定時器1通道4中斷標誌
bit3:定時器1通道3中斷標誌
bit2:定時器1通道2中斷標誌
bit1:定時器1通道1中斷標誌
bit0:定時器1通道0中斷標誌
IEN1 (0xB8) 中斷使能 1 IEN1寄存器中咱們只使用了bit1,bit3所在的功能,
bit1 : T1計時器中斷使能
bit3 : T3計時器中斷使能
TIMIF (0xD8) 定時器1/3/4中斷屏蔽/標誌 TIMIF咱們這一次實驗只用到了bit6爲定時器1溢出中斷屏蔽
IRCON (0xC0) 中斷標誌4 bit1:定時器1中斷標誌。當定時器1中斷髮生時設爲1而且當CPU向量指向中斷服務例程時清除。
0:無中斷未決
1:中斷未決
T3CTL (0xCB) 定時器3的控制和狀態 bit[7:5] : 定時器時鐘分頻倍數選擇:
000:不分頻; 001:2分頻; 010:4分頻
011:8分頻; 100:16分頻; 101:32分頻
110:64分頻; 111:128 分頻.

bit4 : T3 起止控制位
bit3 : 溢出中斷掩碼 0:關溢出中斷 1:開溢出中斷
bit2 : 清計數值 高電平有效
Bit[1:0]T3模式選擇
00:自動重裝 0x00-0xFF
01:DOWN (從T3CC0 到0X00計數一次)
10:模計數(反覆從 0X00到T3CC0 計數)
11:UP/DOWN(反覆從0X00到T3CC0 計數再到0X00)
T3CCTL0(0xCC) T3 通道 0 捕獲/比較控制寄存器 bit6: 通道0中斷屏蔽 0:中斷禁止 1:中斷使能
bit5~3: T3 通道0 比較輸出模式選擇
bit2: T3 通道0模式選擇: 0:捕獲 1:比較
bit1~0 T3 通道 0 捕獲模式選擇
00 沒有捕獲 01 上升沿捕獲10 降低沿捕獲 11 邊沿捕獲
T3CC0(0xCD) 定時器 3 通道0捕獲/比較值 定時器捕獲/比較值通道 0。當 T3CCTL0.MODE=1(比較模式)時寫該寄存器會致使 T3CC0.VAL[7:0]更新到寫入值延遲到 T3CNT.CNT[7:0]=0x00。
T3CCTL1(0xCE) T3 通道 1 捕獲/比較控制寄存器 bit6: 通道1中斷屏蔽 0:中斷禁止 1:中斷使能
bit5~3: T3 通道1 比較輸出模式選擇
bit2: T3 通道 1 模式選擇: 0:捕獲 1 :比較
Bit[1:0] T3 通道 1 捕獲模式選擇
00 沒有捕獲01 上升沿捕獲10 降低沿捕獲 11 邊沿捕獲
T3CC1(0xCF) 定時器 3 通道1捕獲/比較值 定時器捕獲/比較值通道 1。當 T3CCTL1.MODE=1(比較模式)時寫該寄存器會致使 T3CC1.VAL[7:0]更新寫入值延遲到 T3CNT.CNT[7:0]=0x00。

1.3 寄存器相關問題

1.什麼是標記頻率,什麼是分頻?code

標記頻率能夠理解爲是外部晶振的頻率,在新大陸CC2530模塊中,外部晶振頻率是32MHz。分頻的意思就是經過模塊將高頻率信號下降值原來的X分之一。這裏舉個例子,如將32MHz進行2分頻,那就是32Mhz/X=16MHz的信號;將32MHz進行4分頻就是32Mhz/X=8Mhz。在CC2530中會對51內核進行默認的2分頻,也就是說51內核實際標記頻率爲16Mhz;若是不使用CLKCONCMD寄存器對晶振頻率進行設定,那麼51內核實際頻率爲16Mhz.blog

2.什麼是無中斷未決,什麼是中斷未決?文檔

英文手冊中是Interrupt not pending(中斷未掛起)和Interrupt pending(中斷掛起)。所謂無中斷未決就是說中斷都進入其中斷處理函數進行處理了;而中斷未決就是中斷被掛起目前沒有進入對應的中斷處理函數進行處理。it

3.爲何有寫書籍上T1中斷使能是IEN1|=0x02,而有些直接是T1IE=1?io

/*  Interrupt Enable 1                                                              */
SFRBIT( IEN1    ,  0xB8, _IEN17, _IEN16, P0IE, T4IE, T3IE, T2IE, T1IE, DMAIE )

咱們查看IEN1在ioCC2530.h中的定義,其中針對其bit位的定義(高位在前),我麼能夠發現T1IE就是IEN1的bit1,因此T1中斷使能操做IEN1|=0x02和T1IE=1是同樣的效果。table

4.如何根據標記頻率和分頻計算溢出所須要的時間?class

這是有一個公式的 溢出時間 = 1S/(標記頻率/分頻)2^定時器位數.
若是咱們使用的是16Mhz標記頻率,64分頻,T3定時器,它的位數是8位.那麼結果就是
1/(16mhz/64)
256 = 0.001s

在好比咱們使用的是16Mhz標記頻率,128分頻,T1定時器,它的位數是16位.那麼結果就是 **1/(16mhz/128)*65535 = 0.524s**

1.4 T一、T3定時器初始化流程


1.4.1 T1定時器初始化流程

首先咱們來看T1定時器的初始化流程圖,T1定時器是一個16位的定時器,咱們實現簡單的功能。

5

1.4.2 T3定時器初始化流程

T3定時器初始化流程和T1定時器初始化流程基本一致.

8

T3寄存器多了一個步驟,就是啓動定時器。固然一樣能夠暫停寄存器。

2 程序及代碼

#include <ioCC2530.h>
typedef unsigned int uint;
typedef unsigned char uchar;

uint t1_count = 0;
uint t3_count = 0;

void init_gpio(void)
{
  P1SEL &=~ 0x03;
  P1DIR |= 0x03;
  P1 = 0x00;
  
  P1_0 = 0;
  P1_1 = 1;
}

void init_timer3()
{
  T3CTL |= 0xC0;  // 設置64分頻,自動重裝,每次溢出時間 1/(16mhz/64)*256 = 0.001s(幾乎1ms)
  T3CTL |= 0x04;  // 打開T3溢出中斷使能
  EA = 1; // 打開總開關
  T3IE = 1; // 打開T3中斷使能
  T3CTL |= 0x10;  // 啓動定時器
}

void init_timer1()
{
  T1CTL |= 0x0d;  // 設置128分頻,自由運行; 每次溢出時間 1/(16mhz/128)*65535 = 0.524s
  TIMIF |= 0x40; //打開T1溢出中斷
  EA = 1; // 打開總開關
  IEN1 |= 0x02; // 打開t1中斷使能
}

#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{
  t3_count ++;
  if(t3_count % 2000 == 0)  // 2S翻轉一次
  {
    P1_0 = ~P1_0;
    P1_1 = ~P1_1;
  }
}

#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
  t1_count++;
  if(t1_count%2 == 0) // 1S翻轉一次狀態
  {
    P1_0 = ~P1_0;
    P1_1 = ~P1_1;
  }
}

void main(void)
{
  init_gpio();
  //init_timer1();
  init_timer3();
  while(1)
  {
    ;
  }
}
經過註釋init_timer1();或init_timer3()能夠分別看到使用兩個定時器實現不一樣延時的效果。

THE END

相關文章
相關標籤/搜索