天天看點

《tiny6410裸機程式》第七章:S3C6410外部中斷簡介

====================================================================================================================================

  本章内容是為下面要進行的按鍵裸機驅動做準備,主要講解tiny6410的外部中斷:涉及GPIO複用引腳設定為特殊功能作為中斷源、子(外部)中斷源設定寄存器EINT以及VIC總中斷控制器等。

  說明:VIC是ARM的總中斷控制器,EINT是外部子中斷源控制器,GPIO複用作為中斷産生源。EINT外部子中斷源控制器和VIC總中斷控制器相關寄存器的設定,決定了ARM核是否響應外部GPIO中斷源信号以及響應的優先級。

按鍵的硬體連接配接如下:

KEY1 KEY3 KEY5
GPIO GPN0/xEINT0 GPN2/xEINT2 GPN4/xEINT4

以下講解都将以按鍵為例:

一、GPIO作為中斷源

1.介紹

在以前常見的GPIO作為中斷源使用的時候,需要首先設定GPIO複用功能為特殊功能、即EINT(外部中斷引腳);同時該引腳可以捕捉什麼類型的輸入信号。

2.相應GPIO寄存器

rGPIONCON = 0x7F00 8830   //GPN設定,此時設定為EINT(外部中斷)模式

rGPIONPUD = 0x7F00 8838   //上拉/下拉使能

//注意該種模式下,我們就不需要設定rGPIODAT寄存器了。

二、對應的EINT即外部(子)中斷源設定寄存器(注意差別“三“中的總中斷控制寄存器)

rEINT0CON0 = 0x7F00 8900  //上述GPIO設定為EINT模式後,需要設定外部(子)中斷類型、GPIO的上升沿或下降沿等。

rEINT0MASK = 0x7F00 8920  //上述GPIO設定為EINT模式後,需要設定外部(子)中斷源屏蔽寄存器、取消屏蔽。

rEINT0PEND = 0x7F00 8924  //上述GPIO設定為EINT模式後,當有某個外部中斷産生時、相應位自動變0;我們在中斷服務程式中可以通過判斷位為0來看是共用總中斷号中的那個外部子中斷發生,進而做細化處理。當然,處理完後、這位必須由程式員軟體置1。

三、S3C6410的中斷控制器(也叫中斷總控制器,注意區分上述"二"中講解的子(外部)中斷源控制寄存器)

1.介紹

  S3C6410中斷控制器由兩個VIC(Vectored Interrupt Controller, ARM PrimeCell)組成和兩個TZIC’s(TrustZone Interrupt Controller SP890),兩個TZIC’s和VIC’s很好的接合起來支援64個中斷源。

  S3C6410的向量中斷控制器的特性如下:每個VIC控制器包含32向量中斷,固定的硬體中斷優先級别,可程式設計的中斷優先級,支援硬體的中斷優先級屏蔽,可程式設計的硬體的中斷優先級屏蔽,可産生一般中斷和快速中斷,可産生軟體中斷,原生的中斷狀态,中斷請求狀态,支援特權模式來限制通路。

2.VIC(全部中斷;包括内部中斷和外部總段)中斷控制器常用寄存器

向量中斷處理程式位址寄存器VIC0的位址是:

rVIC0INTENABLE = 0x7120 0010

//中斷使能寄存器;使能對應的中斷信号,使能中斷信号隻能通過該寄存器,如果禁用中斷使用VICxINTENCLEAR寄存器,在系統重置後,所有中斷都預設被禁用。

//我們要設定該寄存器,讓它響應外部EINT中斷

rVIC0VECTADDR = 0x7120 0100 ~ 0x7120 017C

//向量中斷處理程式位址寄存器:每個寄存器對應一個中斷源的ISR處理程式位址。

rVIC0ADDR = 0x7120 0F00

//向量位址寄存器:該寄存器裡存放的是目前正在處理的ISR中斷服務例程的位址。目前正在進行中斷時,隻能從該寄存器裡讀取其值,在處理完中斷時向該寄存器裡寫入任何值都可以清除其值。

向量中斷處理程式位址寄存器VIC1的位址是:

rVIC1INTENABLE = 0x7130 0010

//中斷使能寄存器;使能對應的中斷信号,使能中斷信号隻能通過該寄存器,如果禁用中斷使用VICxINTENCLEAR寄存器,在系統重置後,所有中斷都預設被禁用。

rVIC1VECTADDR = 0x7130 0100 ~ 0x7130 017C

//向量中斷處理程式位址寄存器:每個寄存器對應一個中斷源的ISR處理程式位址。

rVIC1ADDR = 0x7130 0F00

//向量位址寄存器:該寄存器裡存放的是目前正在處理的ISR中斷服務例程的位址。目前正在進行中斷時,隻能從該寄存器裡讀取其值,在處理完中斷時向該寄存器裡寫入任何值都可以清除其值。

四、總結

步驟:

1.設定rGPIONCON寄存器,讓GPN複用口為xEINT即外部中斷模式;

2.設定rGPIONPUD寄存器,讓GPN口使能上升和下降沿信号捕捉;

3.設定子(外部)中斷源控制器寄存器rEINT0CON0,設定中斷類型是GPN複用口xEINT的上升或下降沿;

4.設定子(外部)中斷源屏蔽寄存器rEINT0MASK,不要屏蔽我們使用的GPN口;

5.設定總中斷控制器VIC的rVIC0INTENABLE寄存器,已使能對該外部子中斷EINT對應總中斷的支援;

6.設定總中斷控制器VIC的rVICTADDR寄存器,即是中斷服務程式的入口位址。

繼續閱讀