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
26voidkey_init()
27
{
28
INTMOD =
0x0
;
29
INTMSK &= ~(
0x1
<<
5); 31GPECON = (GPECON & ~(
0x3
<<
22
)) |
0x1
<<
22
;
32
GPEDAT &= ~(
0x1
<<
11); 34GPGCON = (GPGCON & ~(
0x3
<<
22
)) |
0x2
<<
22; 36EXTINT2 = (EXTINT2 & ~(
0x7
<<
12
)) |
0x2
<<
12; 38EINTMASK &= ~(
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 }