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

2023-05-10  

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 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。