一、概述
處理器的外部中斷主要用于捕抓外部輸入的高低電平。本篇文章將介紹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燈進行翻轉。
關鍵詞:
版權與免責聲明:
1 本網注明“來源:×××”(非商業周刊網)的作品,均轉載自其它媒體,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責,本網不承擔此類稿件侵權行為的連帶責任。
2 在本網的新聞頁面或BBS上進行跟帖或發表言論者,文責自負。
3 相關信息并未經過本網站證實,不對您構成任何投資建議,據此操作,風險自擔。
4 如涉及作品內容、版權等其它問題,請在30日內同本網聯系。