S3C2440中断体系结构_第1页
S3C2440中断体系结构_第2页
S3C2440中断体系结构_第3页
S3C2440中断体系结构_第4页
S3C2440中断体系结构_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#define pISR_DMA2 (*(unsigned *(_ISR_STARTADDRESS+0x6c#define pISR_DMA3 (*(unsigned *(_ISR_STARTADDRESS+0x70#define pISR_SDI (*(unsigned *(_ISR_STARTADDRESS+0x74位置#define pISR_SPI0 (*(unsigned *(_ISR_STARTADDRESS+0x78, (*(unsigned *(_ISR_STARTADDRESS+0x7c#define pISR_NFCON (*(unsigned *(_ISR_STARTAD

2、DRESS+0x80 / Added for 2440.ARB_MODE (*(unsigned *(_ISR_STARTADDRESS+0x84(*(unsigned *(_ISR_STARTADDRESS+0x88#define pISR_IICARB_SEL (*(unsigned *(_ISR_STARTADDRESS+0x8c REQ1 #define pISR_UART0 ARB_SEL01b,把 (*(unsigned *(_ISR_STARTADDRESS+0x98#define pISR_ADC (*(unsigned *(_ISR_STARTADDRESS+0x9c8一个中

3、断实例Main(如果KeyScan_Test;或REQ5 被服务,void KeyScan_Test(voidREQ1 被服务,ARB_SEL 01b。 如果被服务, ARB_SEL 位变为 static void _irq Key_ISR(void 。 如果 REQ3 ARB_SEL 位变为 11b。被服务,ARB_SEL 位变为 00b 。 7)INTPND寄存器        经过中断优先级选出优先级最高的中断后,这个中断在INTPND寄存器中的相应位被置1,随后CPU进入中断模式处理它      

4、  同一时间,此寄存器只有一位被置1,在ISR中,可以根据这个位确定是哪个中断,清除中断时,往此位写入18)INTOFFSET寄存器        用来表示INTPND寄存器中哪位被置1了,即INTPND寄存器中位x为1时,INTOFFSET寄存器的值为x(x为0-31)        清除SRCPND、INTPND寄存器时,INTOFFSET寄存器被自动清除p   四、中断控制器操作实例:外部中断开发板上,K1-K4四个按键所接的CPU引脚可以设为外部中断,本程序的功能是,

5、当按下某个按键时,CPU调用中断服务程序点亮对应的LED* File:head.S 功能:初始化,设置中断模式、系统模式的栈,设置好中断处理函数*          .extern     main.text .global _start _start:*        中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用*           b 

6、60; Reset 0x04: 未定义指令中止模式的向量地址HandleUndef:    b   HandleUndef   0x08: 管理模式的向量地址,通过SWI指令进入此模式HandleSWI:    b   HandleSWI 0x0c: 指令预取终止导致的异常的向量地址HandlePrefetchAbort:    b   HandlePrefetchAbort 0x10: 数据访问终止导致的异常的向量地址HandleDataAbort:&#

7、160;   b   HandleDataAbort 0x14: 保留HandleNotUsed:    b   HandleNotUsed 0x18: 中断模式的向量地址    b   HandleIRQ 0x1c: 快中断模式的向量地址HandleFIQ:    b   HandleFIQReset:                   

8、60;  ldr sp, =4096           设置栈指针,以下都是C函数,调用前需要设好栈    bl  disable_watch_dog   关闭WATCHDOG,否则CPU会不断重启        msr cpsr_c, #0xd2       进入中断模式,cpsr_c表示cpsr7:0,0xd2=0b1101 0010    ldr sp, =3

9、072           设置中断模式栈指针    msr cpsr_c, #0xdf       进入系统模式    ldr sp, =4096           设置系统模式栈指针,                             其实复位之后

10、,CPU就处于系统模式,                             前面的“ldr sp, =4096”完成同样的功能,此句可省略    bl  init_led             初始化LED的GPIO管脚    bl  init_irq       

11、60;     调用中断初始化函数,在init.c中    msr cpsr_c, #0x5f       设置I-bit=0,开IRQ中断        ldr lr, =halt_loop       设置返回地址    ldr pc, =main           调用main函数halt_loop:    b

12、   halt_loopHandleIRQ:    sub lr, lr, #4                   计算返回地址    stmdb   sp!,     r0-r12,lr   保存使用到的寄存器                         

13、60;           注意,此时的sp是中断模式的sp                                     初始值是上面设置的3072        ldr lr, =int_return            

14、设置调用ISR即EINT_Handle函数后的返回地址      ldr pc, =EINT_Handle             调用中断服务函数,在interrupt.c中int_return:    ldmia   sp!,     r0-r12,pc   中断返回, 表示将spsr的值复制到cpsr /* * init.c: 进行一些初始化 */  #include &

15、quot;s3c24xx.h"/* * LED1-4对应GPB5、GPB6、GPB7、GPB8 */#define GPB5_out        (1<<(5*2      / LED1#define GPB6_out        (1<<(6*2      / LED2#define GPB7_out        (1<<(7*2  

16、    / LED3#define GPB8_out        (1<<(8*2      / LED4/* * K1-K4对应GPG0,GPG3,GPG5,GPG6 */#define GPG0_eint      (2<<(0*2     / K1,EINT8#define GPG3_eint       (2<<(3*2      

17、/ K2,EINT11#define GPF5_eint       (2<<(5*2      / K3,EINT13#define GPF6_eint       (2<<(6*2      / K4,EINT14 /* * 关闭WATCHDOG,否则CPU会不断重启 */void disable_watch_dog(void    WTCON = 0;  / 关闭WATCHDO

18、G很简单,往这个寄存器写0即可void init_led(void    GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;/* * 初始化GPIO引脚为外部中断 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD */ void init_irq(     GPGCON  = GPG0_eint | GPG3_eint | GPG5_eint | GPG6_eint; 

19、       / 对于EINT8、11、13、14,需要在EINTMASK寄存器中使能它们    EINTMASK &= (1<<8 & (1<<11 & (1<<13 & (1<<14;            /*     * 设定优先级:     * ARB_SEL0 = 00b, ARB_MO

20、DE0 = 0: REQ1 > REQ3,即EINT0 > EINT2     * 仲裁器1、6无需设置     * 最终:     * EINT0 > EINT2 > EINT11,EINT19,即K4 > K3 > K1,K2     * EINT11和EINT19的优先级相同     */    PRIORITY = (PRIORITY & (0x01 | (0x3&

21、lt;<7 | (0x0 << 7 ;    /开启EINT8_23    INTMSK   &= (1<<5; interrupt.c #include "s3c24xx.h" void EINT_Handle(    unsigned long oft = INTOFFSET;        switch( oft    &#

22、160;/INTOFFSET为5时,代表INTPND的位5为1,则EINT8-23中断发生        case 5:           GPBDAT |= (0x0f<<5; /LED全灭            if (EINTPEND & (1<<8 /EINT8发生(EINT8对应K1          

23、     GPBDAT &= (1<<5;                  if (EINTPEND & (1<<11 /EINT11发生(EINT8对应K2                GPBDAT &= (1<<6;            

24、     if (EINTPEND & (1<<13 /EINT13发生(EINT8对应K3                GPBDAT &= (1<<7;                  if (EINTPEND & (1<<14 /EINT14发生(EINT8对应K4                GPBDAT &= (1<<8; 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论