第一章 外部中斷與按鍵硬件原理圖分析
中斷在單片機(jī)里非常常用,專(zhuān)門(mén)來(lái)處理緊急事件。比如: 串口接收中斷可以實(shí)時(shí)知道有數(shù)據(jù)到達(dá),定時(shí)器超時(shí)中斷可以實(shí)時(shí)知道時(shí)間到達(dá),外部中斷可以實(shí)時(shí)知道外部設(shè)備產(chǎn)生了事件需要立即處理。
CC2530一個(gè)有18個(gè)中斷源,每個(gè)中斷源都由各自的一系列特殊功能寄存器來(lái)進(jìn)行控制。可以配置相關(guān)特殊功能寄存器,設(shè)置18個(gè)中斷源的優(yōu)先級(jí)以及使能中斷申請(qǐng)響應(yīng)。
CC2530的P0、P1和P2端口中的每個(gè)引腳都具有外部中斷輸入功能,要使某些引腳具有外部中斷功能,需要對(duì)IENx寄存器、PxIEN寄存器和PICTL寄存器進(jìn)行適當(dāng)?shù)脑O(shè)置。
除了各個(gè)中斷源都有自己的中斷使能開(kāi)關(guān)之外,中斷系統(tǒng)還有一個(gè)總開(kāi)關(guān),可以同"EA = 1;"來(lái)打開(kāi)總中斷。
P0、P1和P2端口分別使用P0IF、P1IF和P2IF作為中斷標(biāo)志位,任何一個(gè)端口組上的引腳產(chǎn)生外部中斷時(shí),都會(huì)將對(duì)應(yīng)端口組的中斷標(biāo)志自動(dòng)置位。注意,外部中斷標(biāo)志必須在中斷服務(wù)函數(shù)中手工清除,否則CPU會(huì)反復(fù)進(jìn)入中斷。 端口狀態(tài)標(biāo)志寄存器P0IFG、P1IGF和P2IFG,分別對(duì)應(yīng)3個(gè)端口中各引腳的中斷觸發(fā)狀態(tài),當(dāng)某引腳發(fā)生外部中斷觸發(fā)時(shí),對(duì)應(yīng)的標(biāo)志位會(huì)自動(dòng)置位,這個(gè)標(biāo)志同樣需要手工清除。
中斷服務(wù)函數(shù)與一般自定義函數(shù)不同,有特定的書(shū)寫(xiě)格式:
<1> 在每一個(gè)中斷服務(wù)函數(shù)之前,都要加上一句起始語(yǔ)句:
#pragma vector = <中斷向量>
<中斷向量>表示接下來(lái)要寫(xiě)的中斷服務(wù)函數(shù)是為那個(gè)中斷源服務(wù)的,該 語(yǔ)句有兩種寫(xiě)法:
#pragma vector = 0x7B 或者 #pragma vector = P1INT_VECTOR
前者是中斷向量的入口地址,后者是頭文件“ioCC2530.h”中的宏定義。
<2> _ _interrupt關(guān)鍵字表示該函數(shù)是一個(gè)中斷服務(wù)函數(shù),<函數(shù)名稱(chēng)>可以 自定義,函數(shù)體不能帶有參數(shù),也不能有返回值。
復(fù)制代碼
一般在單片機(jī)里學(xué)習(xí)外部中斷時(shí),都采用獨(dú)立按鍵配置學(xué)習(xí),方便演示效果;
下面就介紹按鍵的外部中斷配置流程,并編寫(xiě)示例代碼。
第二章 配置按鍵中斷步驟
第三章 按鍵中斷代碼配置示例
#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口所有端口都共用一個(gè)配置)
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)
{
}
}
審核編輯:湯梓紅
-
單片機(jī)
+關(guān)注
關(guān)注
6032文章
44525瀏覽量
633265 -
CC2530
+關(guān)注
關(guān)注
19文章
221瀏覽量
57951 -
外部中斷
+關(guān)注
關(guān)注
1文章
131瀏覽量
15801
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論