3c2410裸板程序入门单按键(二)

key.c 

1#include"key.h"
2#include"uart.h"
3#include"s3c2410.h"
17
__irq
void
key_handler()
18
{
19
sendstring(
"key1 down!!!\n"
);
20
21
EINTPEND |=
0x1
<<
19
;
22
SRCPND |=
0x1
<<
5
;
23
INTPND = INTPND;
24
}
25
26void
key_init()
27
{
28
INTMOD =
0x0
;
29
INTMSK &= ~(
0x1
<<
5);
31
GPECON = (GPECON & ~(
0x3
<<
22
)) |
0x1
<<
22
;
32
GPEDAT &= ~(
0x1
<<
11);
34
GPGCON = (GPGCON & ~(
0x3
<<
22
)) |
0x2
<<
22;
36
EXTINT2 = (EXTINT2 & ~(
0x7
<<
12
)) |
0x2
<<
12;
38
EINTMASK &= ~(
0x1
<<
19);
40
*(
unsigned
int
*)(
0x33ffff20
+
5
*
4
) = (
unsigned
int
)key_handler;
41
}

注意__irq 修士的key_handler 就是二级中断处理函数,这里没有查二级中断号,也没有做消除抖动处理,所以不完善,只是为了演示中断过程,用串口向pc发送了一个字符串。注意处理完成后要清除中断,否则会一直中断。还要注意中断的返回,__irq是armcc的关键字,gcc是不能用的,使用它以后,调试时看对应的汇编代码:

 STMDB     R13!,{R0-R3,R12,R14} ...

 LDMIA     R13!,{R0-R3,R12,R14}

SUBS      PC,R14,#0x00000004 可知自动做了pc指针的调整,适应流水线机构。

key_init函数中的这一句

 *(unsigned int *)(0x33ffff20+5*4) = (unsigned int)key_handler;

正是把二级中断处理函数的地址安装到中断向量表中。中断控制的寄存器包括pnd, mask等,专门讲中断的文章中有讲到,芯片资料说明也很详细。

main.c

 1 #include "key.h"
 2 #include "led.h"
 3 #include "uart.h"
 4 #include "s3c2410.h"
 5 
 6 
 7 
 8 int main(void)
 9 {
10     key_init();
11     uart_init();
12     sendstring("hello world!\n");
13     myblink();
14     return 0;
15 }
原文地址:https://www.cnblogs.com/liujiahi/p/2196352.html