您的位置:首页 > 其它

ARM9——中断学习

2016-07-24 19:33 302 查看
中断的概念

指 CPU 在正常运行程序时,由于内部或外部事件引起 CPU 暂时中止执行现行程序,转

去执行请求 CPU 为其服务的那个外设或事件的服务程序,待该服务程序执行完后又返

回到被中止的程序这样一个过程。

中断的优先级:

为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。

中断的嵌套:

是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套。

PRESERVE8

先是在启动代码里设置异常向量表
start
b reset
b halt
b halt
b halt
b halt
b halt
b _irq
b halt
reset
(关闭看门狗)

ldr sp,=(0x32000000+0x100000)	;在reset中设置reset异常的栈指针
MOV r0,#0x53		; 设置 ARM9 的工作模式和中断允许
msr CPSR_cxsf,r0

_irq
ldr sp,=(0x31000000+0x100000)
stmdb sp!,{r0-r12,lr}
IMPORT do_irq
bl do_irq
ldmia sp!,{r0-r12,pc}^		;压栈内容出栈
halt
b halt

void do_irq()	//中断服务函数
{
unsigned int i;
for(i=0; i<4; i++)	//四个按键
{
if(SRCPND1 & (1<<i))	//中断触发
{
if(GPFDAT & (1<<i))	//下降沿
{
my_printf("K%d is release\r\n",i+1);
}
Else		//上升沿
{
my_printf("K%d is pressed\r\n",i+1);
}
}
}
SRCPND1 = SRCPND1;	//清零
INTPND1 = INTPND1;
}

void key_init(void)
{
GPFCON = 0xaa;				//初始化GPF0,1,2,3
EXTINT0 = (0x7<<12)|(0x7<<8)|(0x7<<4)|(0x7<<0);	//设置上升下降沿都触发中断
SRCPND1 = SRCPND1;	//硬件置1,手动清0
INTPND1 = INTPND1;
INTMSK1 &= ~(0x0f);		//打开中断允许
}

MMU_Init();	//先初始化MMU
uart_init();	//初始化串口
key_init();	//中断初始化

GPACON = 0x0;
GPBCON = (0x5 << 10);
GPBSEL = 0x0;

while(1)
{
GPADAT = 0x0;	//led灯闪烁
GPBDAT = 0x0;
delay(0x1000000);
GPADAT = 0xffffffff;
GPBDAT = 0xffffffff;
delay(0x1000000);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: