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 }
上一篇:S3c2410裸板程序入门---流水灯
下一篇:linux内核移植s3c2410,准备工作
推荐阅读最新更新时间:2024-10-31 10:28
设计资源 培训 开发板 精华推荐
- 具有 I2C/SMBus/PMBus 串行接口的 LTM4677IY 36A、1.2V 输出 DC/DC 模块稳压器的典型应用电路
- pdd屏幕驱动板
- 用于电信稳压器的 LT8705MPFE 同步降压-升压型 DC/DC 控制器的典型应用电路
- 航模遥控器用单通道实现用按键控制选择飞控的8种模式电路
- LTC2471 演示板、可选 250sps/1ksps、16 位 I2C Delta Sigma ADC,具有 10ppm/C 最大精度基准
- 【航顺训练营】hk32开发板
- 【训练营_进阶班】EMW3060+STC8G导轨式多路开关
- DC2225A,基于 LTC3875EUJ 160A、4 相、单输出同步降压转换器和极低 DCR 电感器的演示板
- 使用 Analog Devices 的 ADP3330 的参考设计
- LTC1403 的典型应用 - 具有关断功能的串行 12 位、2.8Msps 采样 ADC