微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM9 S3C2440—中断和定时器的初始化配置

ARM9 S3C2440—中断和定时器的初始化配置

时间:11-28 来源:互联网 点击:

6、rINTMOD(P386)的设置,可选

一般可以不设置,因为默认为IRQ模式中断,除非要设置成FIQ模式,INT相应位为1,中断源为FIQ模式,0表示IRQ模式,FIQ通常用于处理特别紧急的中断。

7、rPRIORITY(P390)设置,可选

优先级寄存器设置,设置中断的优先级,一般不设置,使用默认的优先级即可。

8、设置中断程序入口,如pISR_TIMER0=(U32)IRQ_Timer0_Handle;

外部中断pISR_EINT8_23=(U32)Key_ISR;

Key_ISR为中断程序程序函数名,也就是中断服务函数的入口地址,这里强制转换为无符号32位整型。

pISR_EINT8_23在2440addr.h中的宏定义是

#definepISR_EINT8_23(*(unsigned*)(_ISR_STARTADDRESS+0x34))

pISR_EINT8_23就是向量表中的一个地址,当发生外部中断8-23时,程序转入中断向量表相应地址处,而向量表中存放着中断服务函数的入口地址,程序转而执行中断服务程序。

9、允许中断,如EnableIrq(BIT_TIMER0);

允许外部中断EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);

这个宏定义在2440addr.h中,原型为

#defineEnableIrq(bit)rINTMSK&=~(bit)

#defineEnableSubIrq(bit)rINTSUBMSK&=~(bit)

到这里,所有的中断和定时器初始化工作就算完成了!

10、编写中断服务程序

staticvoid__irqKey_ISR(void){}

_irq是C关键字,它告诉编译器,这段程序是中断程序,以便做特殊的处理。在中断程序里,要做的事情主要有:

(1)、清中断源挂起寄存器,如ClearPending(BIT_EINT8_23);

(2)、对于外部中断,还要给EINTPEND寄存器相关位清零,如

rEINTPEND|=111;这两步的目的是为了防止反复进入中断,有多个中断源时,要判断是哪个中断源,给相应的位清零。

(3)、完成中断特点的功能。如按键中断服务程序

staticvoid__irqKey_ISR(void)

{

U8key;

if(rINTPND==BIT_EINT8_23)

{

ClearPending(BIT_EINT8_23);

if(rEINTPEND&(1<11))

{

rEINTPEND|=111;

}

if(rEINTPEND&(1<19))

{

rEINTPEND|=119;

}

}

if(rINTPND==BIT_EINT0)

{

ClearPending(BIT_EINT0);

}

if(rINTPND==BIT_EINT2)

{

ClearPending(BIT_EINT2);

}//以上都是对相关寄存器的相应位清零,使用多个中断时,要条件判断清哪个位

此处写特定功能的中断程序

}

定时器初始化

voidTimer0_init(void)

{

//Timer0init

rTCFG0=49;//pclk/(49+1)

rTCFG1=0x03;//16分频=62500HZ

rTCNTB0=62500/2;//TCNTB0[15:0]=计数值

rTCMPB0=0;

rTCON=0x09;//启动定时器,允许将计数值重载入TCNTB0、TCMPB0

ClearPending(BIT_TIMER0);

pISR_TIMER0=(U32)IRQ_Timer0_Handle;

EnableIrq(BIT_TIMER0);

}

定时器中断处理函数

staticvoid__irqIRQ_Timer0_Handle(void)

{

ClearPending(BIT_TIMER0);

此处写特定功能的中断程序

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top