ARMアーキテクチャを深く理解する(S 3 C 6410)---外部割込み制御例
2106 ワード
本文はmuge 0913によって編纂されます.転載は出典を明記してください.http://blog.csdn.net/muge0913/article/details/7415075
作者:张同浩、メールアドレス:[email protected]
S 3 C 6410の中断問題について、ネット上で多くの達人が分析しました.ここでは主にS 3 C 6410の実現過程を分析し、自分で作成した簡単なプログラムです.
私はミニ6410のk 1キーを使って外部の中断を実現します.
キー初期化:
キー中断プログラム:
作者:张同浩、メールアドレス:[email protected]
S 3 C 6410の中断問題について、ネット上で多くの達人が分析しました.ここでは主にS 3 C 6410の実現過程を分析し、自分で作成した簡単なプログラムです.
私はミニ6410のk 1キーを使って外部の中断を実現します.
キー初期化:
void Key_Init()
{
rGPNCON|=(1<<1); // GPN0
rGPNPUD&=~(1<<0);//
rEINT0CON0|=(3<<0); //
rEINT0MASK&=~(1<<0); //
rEINT0FLTCON0|=(1<<7); //
}
注意:私はこれでピンを初期化しました.つまりGPNCON 0です.キー中断プログラム:
void Key_ISR() __irq //
{
i++;
if(i%2==0)Led_Display(0x0);//
else Led_Display(0xf);
rEINT0PEND|=(1<<0);// 1
INTC_ClearVectAddr();//
}
/*
,
*/
void INTC_ClearVectAddr(void)
{
rVIC0ADDR = 0x0;
rVIC1ADDR = 0x0;
}
割込み初期化関数:void INTC_Init(void)
{
//
rVIC0INTENCLEAR = 0xffffffff;
rVIC1INTENCLEAR = 0xffffffff;
// IRQ
rVIC0INTSELECT = 0x0;
rVIC1INTSELECT = 0x0;
INTC_ClearVectAddr();
}
イネーブル中断関数://
int INTC_Enable(unsigned int intNum)
{
if(intNum > INT_LIMIT)//
{
return -1;
}
if(intNum<32)// vic0
{
rVIC0INTENABLE |= (1<<intNum);
}
else// vic1
{
rVIC1INTENABLE |= (1<<(intNum -32));
}
return 0;
}
割込みプログラム関数を指定します.void INTC_SetIntISR(unsigned int intNum, void (*isr)(void) __irq)
{
if(intNum > INT_LIMIT)//
{
return ;
}
if(intNum < 32)// vic0
{
VIC0VECTADDR[intNum] = (unsigned )isr;
}
else// vic1
{
VIC1VECTADDR[intNum-32] = (unsigned )isr;
}
}
作成メール関数: Led_Init();//led
Led_Display(0x0);// led
Key_Init();//
INTC_Init();//
INTC_Enable(INT_EINT0);//
INTC_SetIntISR(INT_EINT0,Key_ISR);//
while(1);//