预备实验:如何检测是否按下了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)软件中断。如在调试程序时设置的断点等。
2)故障源。如电源掉电,校验出错等。
3)软件中断。如在调试程序时设置的断点等。
3、中断的作用