- 面向物聯網的CC2530與傳感器應用開發
- 廖建尚編著
- 5878字
- 2019-07-25 11:50:32
任務5 鍵盤按鍵的設計與實現
本任務重點學習微處理器的中斷,以及CC2530的外部中斷,掌握外部中斷的基本原理、功能和驅動方法,通過驅動CC2530的GPIO來實現對鍵盤按鍵的檢測。
5.1 開發場景:如何檢測鍵盤按鍵
使用計算機時通常需要通過使用鍵盤輸入需要的信息,但鍵盤輸入信息的時間和每次敲擊的按鍵都是不規律的,鍵盤要如何處理這些突發的敲擊事件呢?鍵盤使用了中斷,當按鍵按下時觸發中斷,鍵盤對按鍵進行識別和編碼,并將結果發送到計算機系統,從而完成一次鍵值的輸入。本項目通過鍵盤按鍵來學習和使用微處理器的外部中斷。計算機鍵盤如圖5.1所示。

圖5.1 計算機鍵盤
5.2 開發目標
(1)知識要點:微處理器的中斷功能和原理;CC2530微處理器的外部中斷。
(2)技能要點:掌握中斷的功能和原理;掌握CC2530微處理器外部中斷的使用。
(3)任務目標:使用CC2530微處理器模擬鍵盤按鍵功能,通過編程使用CC2530微處理器的外部中斷,實現對連接在CC2530微處理器引腳上按鍵動作的捕獲,由CC2530微處理器開發板上指示燈的變化表示按鍵動作的反饋。
5.3 原理學習:微處理器中斷
5.3.1 中斷基本概念與定義
1.中斷概念
中斷是指微處理器在執行某段程序的過程中,由于某種原因,暫時中止原程序的執行,轉去執行相應的處理程序,并在中斷服務程序執行完后,再返回來繼續執行被中斷的原程序的過程。
例如,你正在專心看書,突然電話鈴響,去接電話,接完電話后再回來繼續看書。電話鈴響后接聽電話的過程稱為中斷。正在看書相當于計算機執行程序,電話鈴響相當于事件發生(中斷請求及響應),接電話相當于中斷處理,回來繼續看書是中斷返回(繼續執行程序),因此中斷是指微處理器在執行某段程序的過程中,由于某種原因,暫時中止原程序的執行,轉去執行相應的處理程序,中斷服務程序執行完后,再回來繼續執行被中斷的原程序的過程。中斷事件處理原理如圖5.2所示。

圖5.2 中斷事件處理原理
2.中斷的響應過程
中斷事件處理指微處理器在程序運行中處理出現的緊急事件的整個過程。在程序運行過程中,如果系統外部、系統內部或者程序本身出現緊急事件,微處理器立即中止現行程序的運行,自動轉入相應的處理程序(中斷服務程序),待處理完后,再返回原來的程序運行,這個過程稱為程序中斷。
中斷響應過程如圖5.3所示,按照事件發生的順序,中斷響應過程包括:

圖5.3 中斷響應過程
(1)中斷源發出中斷請求。
(2)判斷微處理器是否允許中斷,以及該中斷源是否被屏蔽。
(3)優先權排隊。
(4)微處理器執行完當前指令或當前指令無法執行完,則立即停止當前程序,保護斷點地址和微處理器當前狀態,轉入相應的中斷服務程序。
(5)執行中斷服務程序。
(6)恢復被保護的狀態,執行中斷返回指令回到被中斷的程序或轉入其他程序。
3.中斷的作用
在電子應用領域,很多時候需要實時處理各種事件,微處理器進行控制應用時,要處理的數據不僅僅來自程序本身,也要對外部事件做出響應,如某個按鍵被按下、邏輯電路出現某個脈沖等。為了對外部事件做出快速的響應,微處理器引入了中斷,作用如下。
(1)微處理器與外設并行工作:解決微處理器速度快、外設速度慢的矛盾。
(2)實時處理:控制系統往往有許多數據需要采集或輸出,實時控制中有的數據難以估計何時需要交換。
(3)故障處理:計算機系統的故障往往隨機發生,如電源斷電、運算溢出、存儲器出錯等,采用中斷技術,系統故障一旦出現,就能及時得到處理。
(4)實現人機交互:人和微處理器的交互一般采用鍵盤和按鍵,可以采用中斷的方式實現,采用中斷方式時微處理器的執行效率較高,而且可以保證人機交互的實時性,故中斷方式在人機交互中得到了廣泛的應用。
4.中斷優先級
在微處理器的應用中,大部分情況都需要處理多個來自多個中斷源的中斷申請,需要根據中斷請求的緊急度或者系統確定的中斷請求次序依次做出響應,所以微處理器會在系統中確定不同中斷請求的優先級別,也就是中斷優先級。
微處理器在接收到中斷請求后,在對中斷請求進行響應并執行中斷處理指令時,需要知道被執行的中斷處理指令的具體位置,也就是中斷處理執行的地址,即中斷矢量(也稱為中斷向量)。系統中所有的中斷矢量構成了系統的中斷矢量表,在中斷矢量表中,所有中斷類型依次排序。中斷矢量表中的每一種中斷矢量號代碼都連接著相應的操作命令,這些操作命令都放置在系統內的儲存單元,中斷矢量表所包含的就有這些操作命令的讀取地址。在中斷請求得到響應時,可以通過查詢中斷矢量表從而知道對應的中斷處理指令并執行操作。例如,C51微處理器有5個中斷,分別是外部中斷0中斷(IE0)、計數/定時器0中斷(TF0)、外部中斷1中斷(IE1)、計數/定時器1中斷(TF1)和串行接口中斷(TI/RI),如圖5.4所示。

圖5.4 C51中斷優先級
在某一時刻有幾個中斷源同時發出中斷請求時,微處理器只能響應優先權最高的中斷源。當微處理器正在運行某個中斷服務程序的期間出現了另一個中斷源的請求,如果后者的優先權低于前者,則微處理器不予理睬,反之,微處理器立即響應后者,進入所謂的嵌套中斷。中斷優先權的排序由其性質、重要性以及處理的方便性決定,由硬件的優先權仲裁邏輯或軟件的順序詢問程序來實現。中斷嵌套如圖5.5所示。

圖5.5 中斷嵌套
5.外部中斷
在沒有干預的情況下,微處理器的程序會在封閉狀態下自主運行,如果在某一時刻需要響應一個外部事件(如鍵盤或者鼠標),這時就會用到外部中斷。具體來講,外部中斷是指在微處理器的一個引腳上,由于外部因素導致了一個電平的變化(如由高變低),而通過捕獲這個變化,微處理器內部自主運行的程序就會被暫時中斷,轉而去執行相應的中斷處理程序,執行完后又回到中斷的地方繼續執行原來的程序。這個引腳上的電平變化,就申請了一個外部中斷事件,而這個能申請外部中斷的引腳就是外部中斷的觸發引腳。
外部中斷是微處理器實時處理外部事件的一種內部機制,當某種外部事件發生時,中斷系統將迫使微處理器暫停正在執行的程序,轉而去進行中斷事件的處理;中斷處理完畢后又返回被中斷的程序處,繼續執行下去。
6.外部中斷觸發條件
外部中斷觸發條件是指在程序運行時,觸發外部中斷的方式。外部中斷的觸發方式是由程序定義的,根據微處理器外部電平的變化特性,可將外部中斷觸發方式分為三種,分別是上升沿觸發、下降沿觸發、跳變沿觸發。由于上升沿觸發與下降沿觸發都屬于電平一次變化觸發,因此這兩種觸發可歸結為電平觸發方式。
(1)電平觸發方式。在數字電路中,電平從低電平變為高電平的一瞬間稱為上升沿;相反,從高電平變為低電平的一瞬間稱為下降沿。這種電平變化同樣可以用微處理器來檢測,當配置了外部中斷的引腳接收到相應的電壓變化后會觸發外部中斷,從而執行中斷服務函數。上升沿、下降沿電平變化如圖5.6所示。

圖5.6 上升沿、下降沿電平變化
(2)跳變沿觸發方式。若外部中斷定義為跳變沿觸發方式,外部中斷申請觸發器可以鎖存外部中斷輸入線上的跳變沿,即使微處理器暫時不能響應,中斷申請標志也不會丟失。在這種方式中,如果連續兩次采樣,在一個機器周期采樣到外部中斷輸入為高電平,在下一個機器周期采樣為低電平,則置1中斷申請觸發器,直到微處理器響應此中斷后才清0。這樣不會丟失中斷,但輸入的脈沖寬度應至少保持12個時鐘周期(晶振頻率為12 MHz),才能被微處理器采樣到。外部中斷跳變沿觸發方式適合以脈沖形式輸入的外部中斷請求。
5.3.2 CC2530與外部中斷
中斷是CC2530實時處理內部或外部事件的一種機制,當發生某個內部事件或外部事件時,CC2530的中斷系統將迫使其暫停正在執行的程序,轉而去進行中斷事件的處理,中斷處理完畢后,再返回被中斷的程序位置繼續執行下去。中斷又分為外部中斷和內部中斷。
GPIO引腳設置為輸入模式后,可以用于產生中斷,并設置為外部信號的上升沿或下降沿觸發。CC2530的外部中斷配置寄存器主要有七個,這七個寄存器分別是P0IFG(端口0中斷狀態標志寄存器)、P1IFG(端口1中斷狀態標志寄存器)、P2IFG(端口2中斷狀態標志寄存器)、P1CTL(端口1中斷控制寄存器)、P0IEN(端口0中斷屏蔽寄存器)、P1IEN(端口1中斷屏蔽寄存器)、P2IEN(端口2中斷屏蔽寄存器)。P0、P1和P2都有中斷使能位,對于IEN1~IEN2寄存器內的端口所有的位都是公共的,如下所述。
● IEN1.P0IE:P0中斷使能。
● IEN2.P1IE:P1中斷使能。
● IEN2.P2IE:P2中斷使能。
P0~P2的中斷屏蔽寄存器如表5.1到表5.3所示。
表5.1 P0中斷屏蔽寄存器

表5.2 P1中斷屏蔽寄存器

表5.3 P2中斷屏蔽寄存器

除了公共中斷使能位,每個端口都有位于SFR寄存器P0IEN、P1IEN和P2IEN的單獨中斷使能位,配置外設I/O或GPIO引腳使能都會有中斷產生。
當中斷發生時,不管引腳是否設置了它的中斷使能位,P0~P2中斷狀態標志寄存器P0IFG、P1IFG或P2IFG中相應的中斷狀態標志將被置1;當中斷執行時,中斷狀態標志被清除,該標志清0,且該標志必須在清除微處理器端口中斷標志(PxIF)之前清除,功能如下。
● PICTL:P0、P1、P2的觸發設置。
● P0IFG:P0中斷狀態標志。
● P1IFG:P1中斷狀態標志。
● P2IFG:P2中斷狀態標志。
P1CTL(端口1中斷控制寄存器)如表5.4所示。
表5.4 P1CTL(端口1中斷控制寄存器)

P0IFG(端口0中斷狀態標志寄存器)如表5.5所示。
表5.5 P0IFG(端口0中斷狀態標志寄存器)

P1IFG(端口1中斷狀態標志寄存器)如表5.6所示。
表5.6 P1IFG(端口1中斷狀態標志寄存器)

P2IFG(端口2中斷狀態標志寄存器)如表5.7所示。
表5.7 P2IFG(端口2中斷狀態標志寄存器)

5.4 任務實踐:鍵盤按鍵檢測的軟/硬件設計
5.4.1 開發設計
1.硬件設計
本任務的硬件架構設計如圖5.7所示。

圖5.7 硬件架構設計圖
按鍵接口電路如圖5.8所示,按鍵K1的引腳2接GND,引腳1接電阻和CC2530微處理器的引腳P1_2,電阻的另一端連接3.3 V的電源。

圖5.8 按鍵接口電路圖
按鍵的狀態檢測主要使用CC2530微處理器GPIO的引腳電平讀取功能,相關引腳為高電平時引腳電平的讀取值為1,反之則為0。而按鍵是否被按下、按下前后的電平狀態則需要按照實際的按鍵接口電路來確認,如圖5.8所示。當按鍵沒有按下時,K1的引腳1和引腳2斷開,由于CC2530微處理器引腳在輸入模式時為高阻態,所以引腳P1_2的電平為高電平;當K1按鍵按下時K1的引腳1和引腳2導通,此時引腳P1_2導通接地,所以引腳的電平為低電平。
要實現對鍵盤按鍵的檢測中斷,在于對CC2530微處理器中斷的使用。按鍵沒有按下時引腳電平為高電平,當按鍵按下后電平變為低電平。而針對與外部中斷的電平判斷,則可以理解為低電平觸發外部中斷,可以選擇外部中斷的觸發方式為下降沿觸發。
本任務用到的是CC2530的外部中斷,所涉及的寄存器有P1IEN、POINP、P1INP、PICTL、IEN1和P1IFG,其中,P1IEN用于各個控制口的中斷使能,0為中斷禁止,1為中斷使能,表5.8是P1IEN功能分配表。
表5.8 P1IEN功能分配表

P1INP用于設置各個I/O口的輸入模式,0為上拉/下拉,1為三態模式,如表5.9所示。
表5.9 P1INP功能分配表

在PICTL中,D0~D3設置各個端口的中斷觸發方式,0為上升沿觸發,1為下降沿觸發;D7控制I/O引腳在輸出模式下的驅動能力,選擇輸出驅動能力增強來補償引腳DVDD的低I/O電壓,確保在較低的電壓下的驅動能力和較高電壓下相同,0為最小驅動能力增強,1為最大驅動能力增強,如表5.10所示。
表5.10 PICTL I/O口分配表

IEN1用于中斷使能1,0為中斷禁止,1為中斷使能,表5.11為P1CTL功能分配表。
表5.11 P1CTL功能分配表

P1IFG為中斷狀態標志寄存器,當輸入端口有中斷請求時,相應的標志位將置1,表5.12是P1IFG功能分配表。
表5.12 P1IFG功能分配表

按鍵K1所連接的引腳為P1_2,因此中斷應配置端口1的通道2的外部中斷。按鍵K1的外部中斷配置的步驟如下。
● 通過IEN1初始化引腳端口1的中斷使能;
● 通過P1IEN配置端口P1_2的外部中斷使能;
● 通過PICTL將中斷觸發方式配置為下降沿觸發;
● 開啟總中斷EA。
2.軟件設計
本任務軟件設計思路如下。
(1)初始化系統時鐘、LED引腳和外部中斷并且打開LED2。
(2)初始化完成之后程序進入主循環,在主循環中,LED2處于常亮狀態。
(3)當按鍵K1被按下時觸發外部中斷,主函數進入中斷服務函數,延時10 ms,待電平穩定后如果按鍵依舊處于按下狀態則確定K1按鍵被按下。
(4)檢測到按鍵K1被按下時則執行對LED狀態操作的程序,本任務對LED1和LED2的狀態進行取反。
(5)執行完畢后,中斷標志清0,主函數回到主程序中等待中斷再次觸發。
軟件設計流程圖如圖5.9所示。

圖5.9 軟件設計流程圖
5.4.2 功能實現
1.相關頭文件模塊
/**************************************************************************************** * 文件:led.h ****************************************************************************************/ #define D1 P1_1 //宏定義D1燈(即LED1)控制引腳P1_1 #define D2 P1_0 //宏定義D2燈(即LED2)控制引腳P1_0 #define ON 0 //宏定義打開狀態ON #define OFF 1 //宏定義關閉狀態OFF
2.主函數模塊
主函數完成初始化系統時鐘、LED引腳和外部中斷后,初始化LED2狀態,然后進入主循環等待中斷觸發,主函數代碼如下。
/**************************************************************************************** * 名稱:main() * 功能:主函數 ****************************************************************************************/ void main(void) { xtal_init(); //系統時鐘初始化 led_io_init(); //LED引腳初始化 ext_init(); //外部中斷初始化 LED2=ON; //打開LED2 while(1); //進入主循環 }
3.系統時鐘初始化模塊
本模塊主要啟動CC2530系統時鐘,初始化系統時鐘存在一個等待時鐘穩定的過程,因此需要初始化系統時鐘,待系統時鐘穩定后再執行程序。系統時鐘的初始化函數代碼如下。
/**************************************************************************************** * 名稱:xtal_init() * 功能:CC2530系統時鐘初始化 ****************************************************************************************/ void xtal_init(void) { CLKCONCMD&=~0x40; //選擇32 MHz的外部晶體振蕩器 while(CLKCONSTA&0x40); //晶體振蕩器開啟且穩定 CLKCONCMD&=~0x07; //選擇32 MHz的系統時鐘 }
4.外部中斷初始化模塊
外部中斷初始化為該項目的重要環節,可將外部中斷配置為低電平觸發(下降沿觸發)。外部中斷初始化函數代碼如下。
/**************************************************************************************** * 名稱:ext_init() * 功能:外部中斷初始化 ****************************************************************************************/ void ext_init(void) { IEN2|=0x10; //端口1中斷使能 P1IEN|=0x04; //端口P1_2外部中斷使能 PICTL|=0x02; //端口P1_2低電平觸發 EA=1; //使能總中斷 }
5.中斷服務函數模塊
任務4中的按鍵檢測與本項目中的外部中斷檢測按鍵動作有著本質的區別,通過外部中斷檢測按鍵動作具有更高的實時性,同時執行LED操作函數也有所不同,外部中斷的LED操作函數是在中斷服務函數中完成的。外部中斷服務函數(程序)如下:
/**************************************************************************************** * 名稱:中斷服務程序 * 功能:外部中斷 ****************************************************************************************/ #pragma vector = P1INT_VECTOR __interrupt void P1_ISR(void) { EA=0; //關中斷 if((P1IFG&0x04)>0){ //按鍵中斷 P1IFG&=~0x04; //中斷標志清0 delay_ms(10); //按鍵防抖 if(KEY1==ON){ //判斷按鍵按下 LED2=~LED2; //翻轉LED2狀態 LED1=~LED1; //翻轉LED1狀態 } } EA=1; //開中斷 }
5.5 任務驗證
使用IAR開發環境打開任務設計工程,程序通過編譯后,由SmartRF下載到CC2530微處理器中,執行程序后,開發平臺上LED2點亮,LED1熄滅。按下按鍵K1后LED2熄滅,LED1點亮;再次按下按鍵K1后LED2點亮,LED1熄滅,如此循環往復。
5.6 任務小結
通用對按鍵檢測項目的學習與開發,讀者可學習CC2530微處理器外部中斷的基本原理,并通過按鍵觸發外部中斷的開發過程來學習CC2530微處理器的外部中斷功能,采用CC2530外部中斷響應連接在CC2530處理器上的按鍵動作,從而達到實時響應按鍵的目的。
5.7 思考與拓展
(1)簡述中斷概念、中斷作用、中斷響應過程。
(2)如何配置CC2530的外部中斷?
(3)如何編寫CC2530微處理器的外部中斷服務函數?
(4)按鍵在使用過程中除了按下與彈起兩種狀態,還擁有兩種按下的狀態,這兩種按下的狀態分別是長按和短按。例如,智能手機,短按電源鍵的功能為手機熄屏,長按則為關機或重啟功能。以智能手機電源鍵的功能為例通過查詢方式實現長按和短按的功能,即短按按鍵時開或關一個LED,長按時開或關兩個LED。
- 光網絡評估及案例分析
- 信息通信網絡建設安全管理概要2
- Getting Started with Grunt:The JavaScript Task Runner
- CCNP TSHOOT(642-832)認證考試指南
- jQuery Mobile Web Development Essentials
- 網管工具使用與技巧大全
- 無線傳感器網絡定位技術
- 沖擊:5G如何改變世界
- 一本書讀懂TCP/IP
- Selenium WebDriver 3 Practical Guide
- 移動互聯網新思維
- Laravel Application Development Cookbook
- SRv6網絡部署指南
- 物聯網
- 信息技術安全評估準則:源流、方法與實踐