S3C6410裸機中斷終於搞定了,不需要彙編 ,使用VIC

來源:互聯網
上載者:User

經過幾天的努力,期間遇到很多的麻煩,終於搞定了S3C6410裸機中斷,測試使用的是外部中斷0組的PN0,定時器使用的是定時器0.

 

之前一直很鬱悶的是網上的一些S3C6410使用的中斷都是像51單片機那樣的固定中斷向量入口,這種方式不僅需要彙編支援,而且效率相當的低下,既然S3C6410內建有中斷處理副處理器VIC,那麼我還是建議使用VIC來管理中斷.

 

下面這段話摘自網上,不知道是誰寫的,但是要謝謝他,讓我搞清楚了如何使用裸機中斷.

///////////////////////////////////////////////////////////////////////////////

為了向下相容,6410保留了2410的軟體中斷跳轉方式,在三星的文檔裡被稱為SystemBUS模式,預設的,而其特有的VIC Port模式則要手動開啟,啟動代碼:

 

mrc p15,0,r0,c1,c0,0

orrr0,r0,#(1<<24)

mcr p15,0,r0,c1,c0,0

 

將其加到開機檔案的main函數進入點之前即可開始VICPort模式,在這個模式下,中斷的使用簡單了不少,比如說我要用某個按鍵來實現外部中斷,則相應的過程如下:

 

初始化中斷向量控制器:

 

      填充 rVICxINTENCLEAR ,清空VICxINTSELECT和VICxADDR,這步嘛沒什麼可說的,就是一個簡單的重設工作。

 

配置按鍵對應的GPIO腳為中斷模式:

 

     GPxxCON 每一個腳的配置占此寄存器的2位,其中中斷配置為10b,將對應的兩位位設為10b即可使用中斷功能。

 

開啟中斷:

 

  將VICxINTENABLE對應位置一即可開啟對應的中斷,比如要開啟11號中斷,就將此寄存器第11位置一,注意此寄存器是32位的,x=0的時候開啟0-31號中斷,x=1時開啟剩下的中斷。

 

設定外部中斷類型:

 

   操作EINxCONy,中斷分組對應的寄存器可以在三星的手冊裡查到,每兩個中斷佔用寄存器的三位,換句話說,寄存器每三位控制兩個中斷的觸發方式,其中中斷號小的偶數的兩倍對應起始位,中斷號大的奇數的兩倍對應結束位,例如EINT11、10,對應寄存器的[22:20]三位,這三位怎麼配手冊上有詳細描述,不廢話。

 

裝載中斷伺服程式:

 

/////////////////////////////////////////////////////////////////////////

void led_init(void)

{

GPIOM->CON        =0x1111;

GPIOM->DAT        =0;

}

 

void Delay(u32 n)

{

u32i;

while(n--)

{

for(i= 0;i < 2000000;i ++);

}

}

 

void __irqIRQ_Exception(void)

{

EINT0PEND= 1;//寫1清除中斷標誌

GPIOM->DAT^= BIT2;

ClearInterrupt(INT_EINT0);//中斷結束

}

 

void Key_Init(void)

{

//PN0

GPION->CON= 2;//外部中斷模式

EINT0CON0= 0x2;

EINT0PEND= 0xffffffff;

EINT0MASK&= ~(BIT0);//取消中斷屏蔽

Set_IsrAddr(INT_EINT0,(u32)IRQ_Exception);        //設定中斷向量入口

Set_IntEnable(INT_EINT0,Enable);

}

 

 

void __irqIsr_Timer0(void)

{

TINT_CSTAT|= BIT5;//清除中斷標誌

GPIOM->DAT^= 1 << 3;

ClearInterrupt(INT_TIMER0);//中斷結束

}

 

 

voidTIMER0_Init(void)

{

TCFG0=65;        //定時器0預分頻65+1,由PCLK=66提供時鐘,66分頻產生1MHz的定時器時鐘

TCON= BIT3;//定時器0自動更新使能

TCNTB0 = 200000;//重裝值,200ms

TINT_CSTAT|= BIT5;//清除中斷標誌

TINT_CSTAT= 1;//使能定時器0中斷

Set_IsrAddr(INT_TIMER0,(u32)Isr_Timer0);        //設定中斷向量入口

Set_IntEnable(INT_TIMER0,Enable);//使能定時器0全域中斷

//以下操作啟動定時器0

TCON|= BIT1;//手動更新

TCON&= ~BIT1;//結束手動更新

TCON|= BIT0;//啟動定時器0

 

}

 

 

 

//主函數

void main(void)

{

u8i;

 

led_init();

Key_Init();

TIMER0_Init();

while(1)

{

for(i= 0;i < 2;i ++)

{

GPIOM->DAT^= 1 << i;

Delay(10);

}

}

}

//把下面的彙編加入到開機檔案中,主要用來開啟CPU中斷和初始化VIC

;VIC Port模式,開啟後就可以不用彙編使用中斷,使用VIC控制中斷
mrc p15,0,r0,c1,c0,0
orr r0,r0,#(1<<24)
mcr p15,0,r0,c1,c0,0

;允許中斷,開啟CPU總中斷
MRS R0, CPSR         ;將CPSR儲存至R0寄存器中
BIC R0, R0, #0x80    ;R0 = R0 & ~0x80,清除中斷位
MSR CPSR_c, R0       ;將R0寫回CPSR狀態寄存

 

 

以上就是相關的代碼,因為大家的寄存器宏定義不同,因此名字可能不同,因為我寫了注釋的,大家可以對著文檔,設定相應的寄存器就可以了,如果需要可以找我,郵箱:cp1300@139.com

 

由於我也是剛學裸機操作,希望大家多多指導.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.