外部中断(按键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闪烁一下,并在串口打印一个提示。...
  • caogos
  • caogos
  • 2017年07月21日 16:08
  • 279

基于UC/COSII系统的STM32F103系列单片机外部中断按键的一种使用方法

基于UC/COSII系统的STM32F103系列单片机外部中断按键的一种使用方法记录学习过程遇到的问题及解决方法,与大家一起分享:外部中断按键大家都不陌生,在裸奔时只需配置几个寄存器就可以完成操作,初...

MSP430G2553外部中断(按键)测试

  • 2016年09月06日 17:30
  • 602B
  • 下载

nrf51822 --- 外部中断 (按键)

1.目的    nrf51822外部中断 2.分析     在实际应用中经常要用到外部中断,比如按键唤醒。 3.平台: 协议栈版本:SDK10.0.0 编译软件:keil 5.12 硬件平...

MDK中的mini2440外部中断按键实验

  • 2013年05月26日 21:09
  • 119KB
  • 下载

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

基于STM32的矩阵键盘按键触发外部中断引起蜂鸣器鸣叫 一 矩阵键盘按键触发外部中断引起蜂鸣器鸣叫原理:1.1 本实验实现矩阵键盘某一列按键触发外部中断实现蜂鸣器鸣叫。1.2 实验思路:根据电路图原理...
  • wzpcsdn
  • wzpcsdn
  • 2017年07月28日 15:00
  • 207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:外部中断(按键1)
举报原因:
原因补充:

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