s3c2440中断总结+按键中断

发布者:ikfnpo最新更新时间:2022-10-08 来源: csdn关键字:s3c2440  中断总结  按键中断 手机看文章 扫描二维码
随时随地手机看文章

一、启动代码之IRQ中断分析。


举例:timer4中断调用过程


1、当timer4发生中断,INTOFFSET寄存器的值变为中断源INT_TIMER4对应的值,即 14。


同时,程序将跳转到irq中断向量地址(0x18)处去执行,该处的指令为   b  HandlerIRQ


2、在启动代码中有如下一段宏定义


$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

ldr     r0,=$HandleLabel ;load the address of HandleXXX to r0

ldr     r0,[r0] ;load the contents(service routine start address) of HandleXXX

str     r0,[sp,#4]  ;store the contents(ISR) of HandleXXX to stack

ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)

MEND


所以启动代码中以下的语句将展开为对应得代码段。其作用是将pc指针指向HandleIRQ。


//HandlerFIQ      HANDLER HandleFIQ


HandlerIRQ      HANDLER HandleIRQ

 替换为-----》


HandlerIRQ

sub sp,sp,#4

stmfd sp!,{r0}

ldr     r0,=HandleIRQ

ldr     r0,[r0]

str     r0,[sp,#4]       

ldmfd   sp!,{r0,pc}     

//HandlerUndef    HANDLER HandleUndef

 //HandlerSWI      HANDLER HandleSWI

 //HandlerDabort   HANDLER HandleDabort

 //HandlerPabort   HANDLER HandlePabort


3、在执行启动代码时,如下一段代码已经将 IsrIRQ   标签加载到 HandleIRQ       的地址中,所以上一步pc指针指向HandleIRQ,即是跳转到 IsrIRQ  标签处执行。


ldr r0,=HandleIRQ       ;

ldr r1,=IsrIRQ ;

str r1,[r0]


4、


IsrIRQ

sub sp,sp,#4       ;reserved for PC

stmfd sp!,{r8-r9}

ldr r9,=INTOFFSET

ldr r9,[r9] ;若为timer4中断,该值为14

ldr r8,=HandleEINT0 ;外部中断的起始地址

add r8,r8,r9,lsl #2 ;(起始地址 + 偏移量*4) 即拓展向量保存对应中断处理函数的地址

ldr r8,[r8]

str r8,[sp,#8]

ldmfd sp!,{r8-r9,pc} ;将pc指向中断处理函数

5、我们在初始化中断的函数中,


  pISR_TIMER4 = (unsigned)timer4_handle;


pISR_TIMER4 在内存中的地址与上面所说的(起始地址 +偏移量*4)是一致的。


  这样,每一个中断源就和我们设置的中断处理函数一一对应了。


二、中断申请

60中断源,其中独立的中断和含有子中断的中断共32个。它们是位或共存。


1、 配置中断控制寄存器  SUB子  SRC源  PND--PENDING 挂起


  1)SRCPND---申请中断   每一位对应一个总(独立)的中断源


      手动写1---自动清0---有中断产生的那位就自动置1  -----在中断函数中,又要重新手动写1


  2)MASK  ----相当于一个开关


  3)MODE  ---IRQ FIQ   FIQ最多只能有一个,只有非常紧急的中断 才需要配置成FIQ


  4)  INTPND---中断挂起寄存器


        手动写1---自动清0—经过仲裁-响应中断的那位就自动置1  -----在中断函数中又要重新手动写1,而且是在清SRCPND之后才清。


  5)priority 设置中断优先级


Note:使用中断时应先开启cpsr的中断控制位 



/***********************************************

Function  name  :   irq_cpsr_enable

Description     :   开启cpsr寄存器的外部中断使能位

Input parameter :   none

Return          :   none

Others     :                                          

*************************************************/

void irq_cpsr_enable(void)

{

//开启总中断

__asm{ 

    MRS R0,CPSR 

      BIC R0, R0, #(1 << 7) 

      MSR CPSR_c, R0             

  }

}


三、按键中断程序


/***********************************************

Function  name  :   key_irq

Description     :   key 中断处理函数

Input parameter :   none

Return          :   none

Others     :                                        

*************************************************/

static void __irq key_irq(void)

{

//led_contrl(LED4,LEDON);

unsigned temp;

temp = rEINTPEND;

//key1

if(temp & (1 << 8))

{

led_turn(LED1);

uart_printf("key1 intteruptn");

}

//key2

else if(temp & (1 << 11))

{

led_turn(LED2);

uart_printf("key2 intteruptn");

}

//key3

else if(temp & (1 << 13))

{

led_turn(LED3);

uart_printf("key3 intteruptn");

}

//key4

else if(temp & (1 << 14))

{

led_turn(LED4);

uart_printf("key4 intteruptn");

}

//key5

else if(temp & (1 << 15))

{

led_contrl(LED3,LEDOFF);

uart_printf("key5 intteruptn");

}

//key6

else if(temp & (1 << 19))

{

led_contrl(LED4,LEDOFF);

uart_printf("key6 intteruptn");

quit = 1;

}

//清中断

rSRCPND |= 0x1<<5;

rINTPND |= 0x1<<5;

rEINTPEND |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);

}

 

/***********************************************

Function  name  :   key_irq_init

Description     :   按键中断初始化

Input parameter :   none

Return          :   none

Others     :   中断方式                                      

*************************************************/

void key_irq_init(void)

{

//设置中断模式为IRQ模式

rINTMOD = 0x0;

//配置GPG0,3,5,6,7,11为中断模式

rGPGCON &= ~((0x3<<22)|(0x3<<14)|(0x3<<12)|(0x3<<10)|(0x3<<6)|(0x3<<0));

rGPGCON |= (0x2<<22)|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<6)|(0x2<<0);

//设置中断触发方式为下降沿触发

rEXTINT1 &= ~((0xf<<28)|(0xf<<24)|(0xf<<20)|(0xf<<12)|(0xf<<0));

rEXTINT1 |= ((0xa<<28)|(0xa<<24)|(0xa<<20)|(0xa<<12)|(0xa<<0));

rEXTINT2 &= ~(0xf<<12);

rEXTINT2 |= (0xa<<12);

//清中断标志位

rEINTPEND |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);

//取消中断屏蔽 外部中断8~23

rINTMSK &= ~(0x1 << 5);

rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19));

//设置中断处理函数

pISR_EINT8_23 = (unsigned)key_irq;

}


关键字:s3c2440  中断总结  按键中断 引用地址:s3c2440中断总结+按键中断

上一篇:2440的中断体系结构
下一篇:s3c2440 iic eeprom

推荐阅读最新更新时间:2024-11-11 11:36

S3C2440裸机------触摸屏_使用定时器支持长按
我们前面写的代码中,长按或者滑动时不能读取坐标,接下来我们使用定时器对代码进行改进,可以在长按或者滑动时把坐标值读出来。 #include ../s3c2440_soc.h #define ADC_INT_BIT (10) #define TC_INT_BIT (9) #define INT_ADC_TC (31) /* ADCTSC's bits */ #define WAIT_PEN_DOWN (0 8) #define WAIT_PEN_UP (1 8) #define YM_ENABLE (1 7) #define YM_DISABLE (0 7) #define YP
[单片机]
s3c2440裸机-电阻触摸屏编程(4.isr设计_4.2支持长按和滑动)
1.改进定时器 五. irq之定时器中断这记一节中,是在handle_irq_c()中去区分中断源,执行不同的isr。那现在通过register_timer注册对应的定时器中断服务程序,timer_irq进行执行不同的定时器中断服务程序。 #define TIMER_NUM 32 #define NULL ((void *)0) typedef void(*timer_func)(void); typedef struct timer_desc {   char *name;   timer_func fp; }timer_desc, *p_timer_desc; timer_desc timer_array ; in
[单片机]
uboot-2011.12移植到S3C2440(三)——硬件初始化:看门狗、中断、时钟
/* * turn off dog, see C18P3 */ ldr r0, =pWTCON mov r1, #0x0 str r1, /* * C14 * mask all IRQs by setting all bits in the INTMR - default */ mov r1, #0xffffffff ldr r0, =INTMSK str r1, ldr r1, =0x7fff ldr r0, =INTSUBMSK str r1, /* * FCLK:HCLK:P
[单片机]
S3C2440时钟分析
S3C2440时钟控制逻辑可以产生FCLK、HCLK、PCLK和UCLK。FCLK为CPU时钟。HCLK为AHB总线外设时钟,包括存储控制器、中断控制器、LCD控制器、DMA控制器等。PCLK为APB总线外设时钟,包括看门狗、IIS、IIC、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI等等。UCLK专用于USB主机或设备接口时钟。 时钟源的选择: 时钟源的选择是通过OM3和OM2管脚控制的,时钟源可以是外部晶振,也可以是外部时钟。 S3C2440有两个锁相环(PLL),一个用于FCLK、HCLK和PCLK的MPLL,另一个专用于UCLK的UPLL。 MPLLCON和UPLLCON寄存器用于设置FC
[单片机]
<font color='red'>S3C2440</font>时钟分析
内核移植(2)arch/arm/mach-s3c2440/mach-smdk2440.c
对于s3c2410、s3c2440开发板,它们的CPU Id都是0x41129200,在arch/arm/mm/proc -arm920.S中的_ _arm920_proc_info结构中。 定义开发板参数在arch/arm/mach-s3c2440/mach-smdk2440.c中,如机器类型ID、起始I/O物理地址、Bootloader传入的参数的地址、中断初始化函数等。 arch/arm/kernel/head.S是内核执行的第一个文件。 S3c2440开发板上启动uImage时串口输出乱码的原因,开发板晶振的频率设置有问题。 1、在arch/arm/mach-s3c2440/mac
[单片机]
STM32学习笔记---基于UCOSII的EXTI外部按键中断实验
继做了基于UCOSII的IWDG独立看门狗实验后,继续进行第25个实验-基于UCOSII的EXTI外部按键中断实验,此实验在基于UCOSII的IWDG实验基础上添加EXTI而来,三个按键,分别按下串口输出按键信息!在多任务下添加了IWDG独立看门狗。 //EXTI按键任务---------------------------------------- static void Task_EXTI(void* p_arg) { (void) p_arg; while(1) { //看门狗更新设置喂狗操作 IWDGSET(); TESTKEY(); OSTimeDlyHMSM(0, 0, 0, 10); }
[单片机]
STM32学习笔记---基于UCOSII的EXTI外部<font color='red'>按键</font><font color='red'>中断</font>实验
【PIC32MZ】按键中断
新建工程参考前面两篇帖子。 这里有两种方法使用中断,第一种较为通用,几乎每个引脚都可以做中断,但是精确到一组,在里面要做判断;第二种跟普通mcu中断相似,精确到每个引脚,并且可选择上升沿或下降沿。 第一种方式,仅需三步:一是将需要使用的GPIO设为Input;二是勾选ChangeNotify(如果想要设置默认状态,还可以设置上拉或者下拉);三是在system_interrupt中调用中断函数。 以下为示例,按键为RB12,这里是按下按键接地,低电平,包含长按以及短按处理: void GPIO_B_Interrupt(void) { //press is low bool sw3State = SYS_POR
[单片机]
/sys/class/gpio 文件接口操作IO端口(s3c2440)
在嵌入式设备中对GPIO的操作是最基本的操作。一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的。其实Linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/gpio” 方式。 首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入 Device Drivers — GPIO Support — /sys/class/gpio/… (sysfs interface)。 /sys/class/gpio 的使用说明: 01 gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射 class/gpio c
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved