ARM进阶 003 中断

本文深入探讨了ARM中断处理机制,从内核如何响应IRQ异常到软件如何初始化和配置中断控制器。内容包括CPSR的I位检测、异常处理流程、GPIO中断配置以及中断向量表和中断处理函数的设定。通过一个实际的按键检测实验,展示了如何利用中断实现特定功能,如LED灯控制。
摘要由CSDN通过智能技术生成

预备实验:如何检测是否按下了K1按键?

/*预备实验:如何检测是否按下了K1按键?*/
/*按下k1即点亮LED1*/

/*配置LED灯*/
#define rGPBCON  (*(unsigned int *)0x56000010)
#define rGPBDAT	 (*(unsigned int *)0x56000014)

/*配置K1*/
#define rGPGCON  (*(unsigned int *)0x56000060)
#define rGPGDAT  (*(unsigned int *)0x56000064)


// led初始化
void ledInit(void)
{
	// LED IO设置为输出
	rGPBCON |= (1<<10) ;
	// 灭灯
	rGPBDAT |= (1<<5);
	
}

// 点亮led
void ledon(void)
{
	rGPBDAT &= (~(1<<5));
}


// 熄灭led
void ledoff(void)
{
	rGPBDAT |= (1<<5);
}

// 按键初始化
void keyInit(void)
{
	// io设置为输入
	rGPGCON &= ~(3<<0);
}


void KeyScanMain(void)
{
	// 初始化led
	ledInit();
	
	while(1)
	{
		// 循环检测按键是否按下---- 效率低
		if ((rGPGDAT & (1<<0)) == 0)
		{
			ledon();
		}
	}
}	area Init , code , readonly
	code32
	entry
start
	b resetHandler  ;中断向量表
	nop
	nop
	nop
	nop
	nop
	nop
	
resetHandler
	    ; 初始化堆栈(FD)
		ldr sp, =0x34000000
		
		;混合编程--汇编调用C(impoort和b)
		import KeyScanMain
		b   KeyScanMain

stop
	b stop
	end


此种方法的弊端:陷入“检测是否按下K1”的死循环,无法做其他事。
如何让程序既能判断是否按下K1,又能执行其他功能呢?



预备知识一:中断
1、中断基本概念
中断的定义:在程序运行中,出现了某种紧急事件,CPU必须中止现行程序,转去处理此紧急事件(执行中断服务程序),并在处理完毕后再返回运行程序的过程。


2、中断源
   引起CPU中断的事件——中断源。 中断源包括:
1)来自处理器外部的中断。如I/O设备请求、实时时钟等。
2)故障源。如电源掉电,校验出错等。
3)软件中断。如在调试程序时设置的断点等。


3、中断的作用 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值