外部中断(按键1)

原创 2013年12月05日 23:58:15

外部中断学习:

*******************************************************************

------------------------

cpsr第七位

------------------------

状态   VICxIRQSTATUS  VICxIRQSTATUS  /***内部中断控制管理器***/

选择 VICxINTSELECT

使能 VICxINTENABLE

记录 VICxRAWINTR

------------------------

中断源

------------------------

   Register    Address /*外部中断 028

EINT0CON0    0x7F008900

EINT0CON1    0x7F008904 配置

EINT0MASK    0x7F008920 开关

EINT0PEND 记录

------------------------

 

通过按键来触发外部中断的过程:

step1:set cpsr

step2:set:vic0

step3:eint0

step4:gpio

step5:interrupt source

 

注:内部中断在,中断源处清中断;外部中断在,外部中断管理器里清中断

****************************************************************************************

test.c:按一下按键,打印一句话。


#include ".h"

void hander_irq();
int (*printf)(char *,...) = (void *)0x57e11d4c;
int tmp=0;
int count=0;
void led_on();
int main()
{
*(volatile unsigned long *)0x56000000 = hander_irq;//将这个函数的地址放在0x56000000这个内存中。
//cpsr开中断
__asm__ __volatile__(
"mrs r0,cpsr\n"
"bic r0,r0,#0x80\n"
"msr cpsr,r0\n"
:
:
:"r0","memory"
);
//enable
VIC0INTENABLE |=(1<<0);
//select

VIC0INTSELECT &=~(1<<0);


//key 配成中断
GPNCON = 2; 
//ext_interrupt下降沿
EINT0CON0 |= (1<<1);
EINT0MASK &= ~(1<<0);
//EINT0PEND |= (1<<0);
}
void hander_irq()
{
EINT0PEND |= (1<<0);
printf("this key interrupt\n");

}

***************************************************************************

key.h:

//interrupt
#define VIC0INTENABLE (*(volatile unsigned long *)0x71200010)
#define VIC0INTSELECT (*(volatile unsigned long *)0x7120000C)
//模拟
#define VIC0SOFTINT (*(volatile unsigned long *)0x71200018)
#define VIC0SOFTINTCLAR (*(volatile unsigned long *)0x7120001C)
//watdog
#define WTCON    (*(volatile unsigned long *)0x7E004000) 
#define WTDAT    (*(volatile unsigned long *)0x7E004004) 
#define WTCNT    (*(volatile unsigned long *)0x7E004008) 
#define WTCLRINT (*(volatile unsigned long *)0x7E00400C)
//led
#define GPMCON (*(volatile unsigned long *)0x7F008820)
#define GPMDAT (*(volatile unsigned long *)0x7F008824)
//key
#define GPNCON (*(volatile unsigned long *)0x7F008830)
#define GPNDAT (*(volatile unsigned long *)0x7F008834)
//ex_interrupt
#define EINT0CON0    (*(volatile unsigned long *)0x7F008900)
#define EINT0CON1    (*(volatile unsigned long *)0x7F008904)
#define EINT0MASK     (*(volatile unsigned long *)0x7F008920)
#define EINT0PEND    (*(volatile unsigned long *)0x7F008924)

*****************************************************************************

vector.s文件:
b reset
b und
b swi
b pre_abt
b data_abt
.word 0x0
b irq
b firq
reset:
und:
mov sp,#0x56000000
mov ip,sp
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4

ldr r0,=string_und
ldr r1,printf
blx r1

mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
swi:
mov sp,#0x56000000
mov ip,sp
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4

ldr r0,=string_swi
ldr r1,printf
blx r1

mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
pre_abt:
data_abt:
mov sp,#0x56000000
mov ip,sp
sub lr,lr,#4
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4

ldr r0,=string_pre_abt
ldr r1,printf
blx r1

mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
irq:
mov sp,#0x56000000
mov ip,sp
sub lr,lr,#4
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4

mov r0,#0x56000000
ldr r1,[r0]
blx r1

mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
firq:
printf:
.word 0x57e11d4c
string_und:
.asciz "hello undefine \n"
.align 2
string_swi:
.asciz "hello swi\n"
.align 2
string_pre_abt:
.asciz "hell data_abt\n"
.align 2
string_irq:
.asciz "hello irq ,wang wang wang  \n"
.align 2
********************************************************************

makefiel文件:

all:
arm-none-linux-gnueabi-gcc -c vector.s -o vector.o
arm-none-linux-gnueabi-ld -Ttext=0 vector.o -o vector
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -O binary vector vector.bin
cp vector.bin /tftpboot/
arm-none-linux-gnueabi-gcc -c test.c -o test.o
arm-none-linux-gnueabi-ld -Ttext=0x50000000 test.o -o test
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -O binary test test.bin
cp test.bin /tftpboot/
clean:
rm -rf *.o *.bin   /tftpboot/*.bin


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用龙芯1c库在RT-Thread下实现外部中断(GPIO中断、按键中断)

以按键所在GPIO产生中断为例,在智龙v2.0和v2.1上有三个独立按键,在RT-Thread下用龙芯1c库实现按键中断。当按键按下时,一个led闪烁一下,并在串口打印一个提示。

ARM开发(6) 基于STM32的矩阵键盘按键触发外部中断引起蜂鸣器鸣叫

基于STM32的矩阵键盘按键触发外部中断引起蜂鸣器鸣叫 一 矩阵键盘按键触发外部中断引起蜂鸣器鸣叫原理:1.1 本实验实现矩阵键盘某一列按键触发外部中断实现蜂鸣器鸣叫。1.2 实验思路:根据电路图原理...

裸奔程序之外部中断检测按键

开发环境:ADS1.2       实验实验功能:在TQ2440开发板上,利用外部中断模式检测按键是否按下,            &#...

s3c2440基于linux的按键和外部中断驱动实践及驱动机制分析含代码

今天实践了一个比较复杂的驱动,完成了按键出发外部中断EINT2,测试函数统计按键按下的次数打印出来,同时包含了防抖动功能。       编程主要思想是,按键产生外部中断2,中断服务函数里面启动定时器...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)