第一章 外部中斷與按鍵硬件原理圖分析
中斷在單片機里非常常用,專門來處理緊急事件。比如: 串口接收中斷可以實時知道有數(shù)據(jù)到達,定時器超時中斷可以實時知道時間到達,外部中斷可以實時知道外部設(shè)備產(chǎn)生了事件需要立即處理。
CC2530一個有18個中斷源,每個中斷源都由各自的一系列特殊功能寄存器來進行控制。可以配置相關(guān)特殊功能寄存器,設(shè)置18個中斷源的優(yōu)先級以及使能中斷申請響應(yīng)。
CC2530的P0、P1和P2端口中的每個引腳都具有外部中斷輸入功能,要使某些引腳具有外部中斷功能,需要對IENx寄存器、PxIEN寄存器和PICTL寄存器進行適當(dāng)?shù)脑O(shè)置。
除了各個中斷源都有自己的中斷使能開關(guān)之外,中斷系統(tǒng)還有一個總開關(guān),可以同"EA = 1;"來打開總中斷。
P0、P1和P2端口分別使用P0IF、P1IF和P2IF作為中斷標(biāo)志位,任何一個端口組上的引腳產(chǎn)生外部中斷時,都會將對應(yīng)端口組的中斷標(biāo)志自動置位。注意,外部中斷標(biāo)志必須在中斷服務(wù)函數(shù)中手工清除,否則CPU會反復(fù)進入中斷。 端口狀態(tài)標(biāo)志寄存器P0IFG、P1IGF和P2IFG,分別對應(yīng)3個端口中各引腳的中斷觸發(fā)狀態(tài),當(dāng)某引腳發(fā)生外部中斷觸發(fā)時,對應(yīng)的標(biāo)志位會自動置位,這個標(biāo)志同樣需要手工清除。
中斷服務(wù)函數(shù)與一般自定義函數(shù)不同,有特定的書寫格式:
<1> 在每一個中斷服務(wù)函數(shù)之前,都要加上一句起始語句:
#pragma vector = <中斷向量>
<中斷向量>表示接下來要寫的中斷服務(wù)函數(shù)是為那個中斷源服務(wù)的,該 語句有兩種寫法:
#pragma vector = 0x7B 或者 #pragma vector = P1INT_VECTOR
前者是中斷向量的入口地址,后者是頭文件“ioCC2530.h”中的宏定義。
<2> _ _interrupt關(guān)鍵字表示該函數(shù)是一個中斷服務(wù)函數(shù),<函數(shù)名稱>可以 自定義,函數(shù)體不能帶有參數(shù),也不能有返回值。
復(fù)制代碼
一般在單片機里學(xué)習(xí)外部中斷時,都采用獨立按鍵配置學(xué)習(xí),方便演示效果;
下面就介紹按鍵的外部中斷配置流程,并編寫示例代碼。
第二章 配置按鍵中斷步驟
第三章 按鍵中斷代碼配置示例
#include
//定義LED燈的端口
#define LED1 P1_2
#define LED2 P1_3
//定義KEY按鍵的端口
#define KEY1 P1_0 //定義按鍵為P1_0口控制
#define KEY2 P1_1 //定義按鍵為P1_1口控制
/*
函數(shù)功能:LED燈IO口初始化
硬件連接:LED1-->P1_2 , LED2-->P1_3
*/
void LED_Init(void)
{
P1DIR |=0x3<<2; //配置P1_2、P1_3為輸出模式
LED1 = 1;
LED2 = 1;
}
/*
函數(shù)功能:初始化按鍵為中斷模式
硬件連接:KEY1-->P1_0 KEY2-->P1_1
*/
void KEY_InterruptInit(void)
{
P1DIR&=~(0x3<<0); //配置P1_0、P1_1為輸入模式
P1INP|= 0x3<<0; //上拉
P1IEN|= 0x3<<0; //中斷使能
PICTL|= 0x1<<1; //下降沿觸發(fā)(P1口所有端口都共用一個配置)
IEN2 |= 0x1<<4; //端口P1中斷使能
P1IFG&= ~(0x3<<0);//清除中斷標(biāo)志位
EA = 1; //使能總中斷
}
void delay10ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=193;c>0;c--)
for(b=118;b>0;b--)
for(a=2;a>0;a--);
}
/*
函數(shù)功能:P1端口中斷處理函數(shù)
*/
#pragma vector = P1INT_VECTOR //聲明P1口中斷服務(wù)函數(shù)的位置
__interrupt void P1_Interrupt(void) //中斷服務(wù)函數(shù)的名字的可以隨意命名
{
if(P1IFG&1<<0) //判斷按鍵1中斷
{
delay10ms();
if(!KEY1)
{
LED1 = !LED1;
}
P1IFG&=~(1<<0); //清中斷狀態(tài)
}
if(P1IFG&1<<1) //判斷按鍵2中斷
{
delay10ms();
if(!KEY2)
{
LED2 = !LED2;
}
P1IFG&=~(1<<1); //清中斷狀態(tài)
}
P1IF = 0; //清P1口中斷標(biāo)志
}
/*主函數(shù)*/
void main(void)
{
LED_Init();//初始化LED燈控制IO口
KEY_InterruptInit();//按鍵初始化
while(1)
{
}
}
審核編輯:湯梓紅
-
單片機
+關(guān)注
關(guān)注
6067文章
44976瀏覽量
650173 -
CC2530
+關(guān)注
關(guān)注
19文章
221瀏覽量
59007 -
外部中斷
+關(guān)注
關(guān)注
1文章
133瀏覽量
16193
發(fā)布評論請先 登錄
ZigBee cc2530為什么要進行中斷重映射?
ZigBee通信應(yīng)用CC2530外部中斷應(yīng)用
【技術(shù)精選】嵌入式STM32原創(chuàng)征文活動精選文章
cc2530 adc測外部電壓

如何使用ZigBee TI ZStack CC2530 2.5搭建開發(fā)環(huán)境

【CC2530授課筆記】⑥ 外部中斷及中斷嵌套 (51內(nèi)核單片機)

CC2530學(xué)習(xí)筆記:第二章:CC2530按鍵中斷控制

基于CC2530的ZigBee通信網(wǎng)的應(yīng)用設(shè)計.pdf
CC2530外部中斷控制流水燈
CC2530外部中斷控制LED開關(guān)實驗
CC2530(zigbee)入門開發(fā): 安裝IAR開發(fā)環(huán)境

基于CC2530的ZigBee通信網(wǎng)絡(luò)的應(yīng)用設(shè)計

評論