一、概述
處理器的外部中斷主要用于捕抓外部輸入的高低電平。本篇文章將介紹DSP28335的外部中斷的使用。
二、DSP28335外部中斷介紹
DSP28335處理器共支持7個外部中斷XINT1XINT7,其中XINT1XINT2只能對GPIO0GPIO31配置;XINT3XINT7只對GPIO32~GPIO63配置。每一個外部中斷可以被選擇為正邊沿或負邊沿觸發。DSP28335的中斷系統框圖為:
圖1 DSP中斷系統
DSP28335中斷分為三級,分別為:外設級、PIE級、CPU級。如下圖所示:
圖2 DSP28335的三級中斷機制
DSP28335的三級中斷機制可以這樣理解(以外部中斷為例):外設級為像外部引腳輸入高低電平時,同時外設級的中斷使能了,這時候外設級會產生一個中斷標志位,PIE級檢測到該中斷標志位,同時PIE自己的中斷使能了,這時候PIE會產生一個中斷標志位,PIE的中斷標志位給CPU,當CPU的中斷使能位打開了,就會響應這個中斷。總的概況:一個外部中斷要得到CPU響應,要越過外設級中斷使能、PIE中斷使能、CPU中斷使能。
圖3 DSP28335中斷過程
從圖3可以看出,只有一道一道開關閉合,才能把中斷送到CPU,讓CPU去響應中斷。
三、外部中斷涉及相關寄存器
1. 外部中斷控制寄存器---XINTnCR【外設級】
圖4 外部中斷控制寄存器---XINTnCR
外部中斷控制寄存器用于控制上升沿觸發還是下降沿觸發,中斷使能。
2. PIE這一級的寄存器【PIE級】
(1)PIE中斷使能寄存器----PIEIERx[x=1~12]
圖5 PIE中斷使能寄存器
(2)PIE中斷標志寄存器----PIEIFRx[x=1~12]
圖6 PIE中斷標志寄存器
(3)PIE中斷應答寄存器----PIACK
圖6 PIE中斷應答寄存器
3.CPU這一級寄存器【CPU級】
(1)CPU中斷標志寄存器---IFR
圖7 CPU中斷標志寄存器
(2)CPU中斷使能寄存器---IER
圖8 CPU中斷使能寄存器
四、DSP28335外部中斷實現
DSP28335外部中斷實現主要有以下步驟:
(1)失能CPU級中斷,并初始化PIE控制器和PIE中斷向量表;
(2)使能IO口時鐘,配置IO口為輸入;
(3)設置IO口與中斷線的映射關系;
圖9 中斷映射表
本次使用的是GPIO17,映射到XINT1,即INT1.4
(4)指定中斷向量表中斷服務函數地址;
(5)使能外設對應的PIE中斷**[PIE級使能];**
(6)設置外部中斷觸發方式并使能中斷**[外設級使能];**
(7)使能CPU級中斷及全局中斷**[CPU級使能];**
(8)編寫外部中斷服務函數。
編程實現:
//外部中斷配置步驟
//1。失能CPU級中斷,并初始化PIE控制器寄存器和PIE中斷向量表
//2.使能IO時鐘,配置IO口為輸入
//3.設置IO口與中斷線的映射關系
//4.指定中斷向量表中斷服務函數地址
//5.使能外設對應的PIE中斷
//6.設置外部中斷觸發中斷觸發方式并使能中斷
//7.使能CPU級中斷及全局中斷
void EXTI_Init(void)
{
// 步驟 1. 失能CPU級中斷,并初始化PIE控制器寄存器和PIE中斷向量表
DINT; // 禁止CPU全局中斷
InitPieCtrl();
IER = 0x0000; // 禁止CPU中斷和清除所有CPU中斷標志
IFR = 0x0000;
InitPieVectTable(); //初始化PIE中斷向量表,并使其指向中斷服務子程序(ISR)
//步驟 2.使能IO時鐘,配置IO口為輸入
EALLOW;//關閉寫保護
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; //開啟GPIO時鐘
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; //配置為通用IO口
GpioCtrlRegs.GPADIR.bit.GPIO17 = 0; //配置為輸入
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; //配置為上拉
EDIS;//打開寫保護
//步驟3:設置IO口與中斷線的映射關系
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 17;//XINT1 對應 GPIO17腳(GPIO0-31配置XINT1、2;GPIO32-63配置XINT3~7)
EDIS;
//步驟 4. 指定中斷向量表中斷服務函數地址
EALLOW;
PieVectTable.XINT1 = &EXTI_IRQ;
EDIS;
//步驟 5.使能外設對應的PIE中斷
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//使能PIE 1 組 4通道 (這里需要查詢PIE的中斷矢量表 來確定使能的位)
//6.設置外部中斷觸發中斷觸發方式并使能中斷
XIntruptRegs.XINT1CR.bit.POLARITY = 0;//下降沿觸發有效
XIntruptRegs.XINT1CR.bit.ENABLE = 1;//使能外部中斷
//步驟 7. 使能CPU級中斷及全局中斷
IER |= M_INT1;//使能INT1中斷通道 (對應的變量值在 DSP2833x_Device.h中已進行宏定義。要用|或符號賦值,防止改變其他位)
EINT;//打開全局中斷
ERTM;//當使用仿真器調試時 開啟DEBUG中斷
}
int CNT=0;
//步驟 8. 編寫中斷函數,在中斷函數結束前寫1清零PIEACK對應位
interrupt void EXTI_IRQ(void)
{
GpioDataRegs.GPCTOGGLE.bit.GPIO75 = 1;
CNT = CNT+1;
// DELAY_US(5000);//延時
PieCtrlRegs.PIEACK.bit.ACK1 = 1;//寫1清零PIEACK對應位
}
主函數為:
void main(void)
{
InitSysCtrl();
GIOP_Init();
EXTI_Init();
while(1)
{
// GpioDataRegs.GPCSET.bit.GPIO75 = 1;
}
}
通過上面的程序就能使用按鍵使得一個LED燈翻轉。
*五、總結
本篇文章介紹了DSP28335的外部中斷的使用,使用一個按鍵作為外部輸入,觸發LED燈進行翻轉。
-
處理器
+關注
關注
68文章
19407瀏覽量
231183 -
led燈
+關注
關注
22文章
1592瀏覽量
108410 -
GPIO
+關注
關注
16文章
1216瀏覽量
52377 -
外部中斷
+關注
關注
1文章
132瀏覽量
15886 -
DSP28335
+關注
關注
22文章
59瀏覽量
40769
發布評論請先 登錄
相關推薦
評論