s3c2440有60个中断源(其中15个为子中断源)。

31个32位的通用寄存器,6个程序状态寄存器。有6种工作模式(系统/用户模式,快中断模式,管理模式,数据访问中止模式,中断模式,未定指令中止模式)。每种模式都有16个通用寄存器和1(或2)个程序状态寄存器。

R15(pc)是程序计数器,R14(lr)是连接寄存器,在异常时自动保存pc备份,r13(sp)是栈指针寄存器。

CPSR是当状程序状态寄存器。其[7:0]为控制位,[7]为中断禁止位,[6]为快中断禁止位,[5]为CPU状态位,[4:0]为工作模式位。,

程序状态寄存器(PSR)的F位[6]设为1,禁用快速中断(FRQ)。

程序状态寄存器(PSR)的I位[7]设为1,禁用普通中断(IRQ)。

SPSR程序状态保存寄存器,用于在异常时保存CPSR,从异常返回时恢复CPSR。

中断的处理过程:

1,中断控制器汇集中断信号告诉CPU;

2,CPU自动保存当前运行的环境,调用中断服务程序ISR进行处理(lr=pc+4或+8,即当前指令地址的一下条;cpsr复制到spsr;pc值等于异常向量表中的地址,即转去执行异常向量表中的指令);

3,ISR通过读中断控制器相关寄存器,识别哪个中断发生了,进行相应处理;

4,清除中断;

5,恢复被中断的程序的运行环境(pc=lr-4或-8,spsr复制回cpsr),继续执行。

s3c2440中断控制器中有五个控制寄存器:中断源等待寄存器(SRCPND),中断模式寄存器(INTMOD),屏蔽寄存器(INTMSK),优先级寄存器(PRIORITY),中断等待寄存器(INTPND)。

SRCPND寄存器各位对应不同的中断,其中外部中断EINT4-7共用bit4,EINT8-23共用bin5。各位初始值为0,当中断发生时,对应位值改为1。

INTMOD寄存器各位用于标记该位对应的中断是模式,0为IRQ,1为FRQ。只允许有一个中断设为FRQ。初始值都为0。

INIMSK寄存器各位标记该位对应中断是否可用,0表示有效,1表示禁止。初始值都为1,即禁止所有中断。

PRIORITY寄存器用于设置6个中断优先权仲裁模块的工作方式,主要用来设定各中断优先策略。

INTPND寄存器的32位同一时刻最多只允许有一个值为1,这一位是有相就的中断请求发生,且该中断未被屏蔽,而且该中断请求通过了优先仲裁。这个中断请求将被送到CPU,CPU将跳转到中断服务程序执行。中断服务程序可以读取INTPND或INTOFFSET寄存器(当INTPND中某位标记中断请求发生了,INTOFFSET寄存器中的值为0-31,标记INTPND的哪一位被置为1了)的值,以确定哪个中断发生了。

有的几个中断共有一个SRCPND的中断位,比如INT_AC97和INT_WDT共用INT_WDT_AC97中断位。这种子中断共15个。子中断发生时,先在INTSRCPND寄存器相应位置1,如果INTSUBMSK寄存器相应位未屏蔽(即该位为0),则该中断送到SRCPND寄存器。

23个外部中断:

EINTINT0-2三个寄存器用于设置23个外部中断的触发方式和过滤器是否有效。触发方式有低电平、高电平、下降沿、上升沿、电平高低变化。

EINTFLT0-3三个寄存器用于设置外部中断引脚的过滤参数。

EINTMASK寄存器用于设置23个外部中断的屏蔽情况,默认是禁用中断的。

EINTPEND寄存器记录着23个外部中断哪一个发生了。发生中断的对应位置1。初始值为0。但清除中断位标记时要写入1。

进入和退出IRQ、保存和恢复环境代码:


HandleIRQ:
  sub lr, lr, #4 @ 计算返回地址
  stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器
              @ 注意,此时的sp是中断模式的sp
              @ 初始值是上面设置的4096

  ldr lr, =int_return @ 设置调用IRQ_Handle函数后的返回地址
  ldr pc, =IRQ_Handle @ 调用中断分发函数,在interrupt.c中
int_return:
  ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr

中断服务代码示例:


/*interrupt registes*/
#define SRCPND (*(volatile unsigned long *)0x4A000000)
#define INTMOD (*(volatile unsigned long *)0x4A000004)
#define INTMSK (*(volatile unsigned long *)0x4A000008)
#define PRIORITY (*(volatile unsigned long *)0x4A00000c)
#define INTPND (*(volatile unsigned long *)0x4A000010)
#define INTOFFSET (*(volatile unsigned long *)0x4A000014)
#define SUBSRCPND (*(volatile unsigned long *)0x4A000018)
#define INTSUBMSK (*(volatile unsigned long *)0x4A00001c)

/*external interrupt registers*/
#define EINTMASK (*(volatile unsigned long *)0x560000a4)
#define EINTPEND (*(volatile unsigned long *)0x560000a8)

#define BIT_ALLMSK (0xffffffff)

//声明50个中断服务函数指针

void (*isr_handle_array[50])(void);

//虚拟中断服务

void Dummy_isr(void)
{
  while(1);
}

//初始化中断

void init_irq(void)
{
  int i = 0;
  for (i = 0; i < sizeof(isr_handle_array) / sizeof(isr_handle_array[0]); i++)
  {
  isr_handle_array[i] = Dummy_isr;
  }

  INTMOD = 0x0; // 所有中断都设为IRQ模式
  INTMSK = BIT_ALLMSK; // 先屏蔽所有中断

}

//中断处理

void IRQ_Handle(void)
{
  unsigned long oft = INTOFFSET;
  //清中断
  if (oft == 4)
    EINTPEND = 1<<7; //EINT4-7合用IRQ4,注意EINTPEND[3:0]保留未用,向这些位写入1可能导致未知结果
  SRCPND = 1<<oft;
  INTPND = INTPND;

  /* 调用中断服务程序 */
  isr_handle_array[oft]();
}

LCD实验学习笔记(八):中断的更多相关文章

  1. LCD实验学习笔记(二):head.S

    ARM加电后从0地址开始取指执行. 连接为bin文件时时,连接脚本lcd.lds指定将head.o放在开头,所以head.S就是系统起步的地方. head.S开头就是异常向量定义,0地址就是reset ...

  2. LCD实验学习笔记(十):TFT LCD

    硬件组成: REGBANK是LCD控制寄存器组,含17个寄存器及一块256*16的调色板,用来设置参数. LCDCDMA中有两个FIFO,当FIFO空或数据减少到阈值,自动发起DMA传输,从内存获取图 ...

  3. LCD实验学习笔记(九):UART

    s3c2440包含三个通用异步收发器,可工作于中断模式或DMA模式.每个UART包含两个64字节的FIFOs用于接收和发送数据.可编程设置波特率.1或2个停止位,5/6/7/8个数据位和奇偶校验状态. ...

  4. LCD实验学习笔记(一):Makefile

    主Makefile总领全局的就这句—— lcd.bin: $(objs) 要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o seri ...

  5. LCD实验学习笔记(七):NAND FLASH

    s3c2440 CPU内置NAND FLASH控制器.相关寄存大器起始地址为0x4e000000. 通过设置NFCONF寄存器,设置NAND FLASH 时序. 通过设置NFCONT寄存器,使能NAN ...

  6. LCD实验学习笔记(六):存储控制器

    s3c2440可使用地址空间为1GB(0x00000000到0x40000000). 1G空间分为8个BANK,每个BANK为128MB. 设27条地址线,和8个片选引脚(nGCS0-nGCS7). ...

  7. LCD实验学习笔记(五):MMU

    内存管理分别页表机制和内存分配机制两块. 页表机制就是管理设备真实物理地址与虚拟地址的动态或静态的映射,基于cpu内部的mmu(内存管理单元)进行. CP15(协处理器)的C0(缓存)是一级页表,含4 ...

  8. LCD实验学习笔记(四):系统时钟

    一般CPU频率(FCLK)高于内存.网卡等设备频率(HCLK),而串口.USB.I2C等设备频率(PCLK)更低. 系统时钟: 系统时钟源为晶振,初始频率12MHz. 通过设置MPLLCON寄存器的M ...

  9. LCD实验学习笔记(三):WATCH DOG

    看门狗是为了能够防止程序跑飞用的.程序应该定时的去喂狗.如果程序跑飞了,那么就不会去喂狗了.如果超过了喂狗的时间,那么狗就会生成一个信号来reset CPU.一般程序不需要,特殊情况下需要这种机制. ...

随机推荐

  1. Agile.Net 组件式开发平台 - 驱动开发示例

    首先讲一下概念,此驱动非彼驱动.在Agle.Net中我们将组件规划成两种类型,一种是基于业务的窗体组件,一种是提供扩展功能的驱动组件. 打个比方例如一般系统中需要提供身份证读卡功能,然而市面上有很多种 ...

  2. html5 canvas 图像处理

    1.图像放大缩小 <script> var cvs = document.getElementById("canvas"); cvs.width = cvs.heigh ...

  3. Django 2.0 学习(06):Django 视图(进阶)

    概述 Django中的特方法,该方法代表了Django的Web页面,并且视图具有特定的模板.以博客应用为例进行说明,在博客应用中应该包含下面的视图: 博客主页:显示最近的一些记录: 详细页面:单个详细 ...

  4. 【题解】CF#855 G-Harry Vs Voldemort

    个人感觉挺有意思的,然而被颜神D无聊惹(- ̄▽ ̄)- 这题我们可以首先试图去统计以每一个点作为 w 点所能对答案造成的贡献是多少.不难发现,当且仅当 u 和 v 都在 w 所在边双的一侧的时候不能构成 ...

  5. POJ1269:Intersecting Lines——题解

    http://poj.org/problem?id=1269 题目大意:给四个点,求前两个点所构成的直线和后两个点所构成的直线的位置关系(平行,重合,相交),如果是相交,输出交点坐标. ——————— ...

  6. POJ2142:The Balance——题解

    http://poj.org/problem?id=2142 题目大意:有一天平和两种数量无限的砝码(重为a和b),天平左右都可以放砝码,称质量为c的物品,要求:放置的砝码数量尽量少:当砝码数量相同时 ...

  7. 爆款PHP面试题

    $a = 3; $b = 6; if ($a = 4 || $b = 4) { $a++; $b++; } echo $a; //输出 1 echo $b; //输出 7 逛鸟哥博客,看评论区有个新手 ...

  8. JavaScript关键字return的用法

    return 语句从当前函数退出,并从那个函数返回一个值. 语法: 1 return[()[expression][]]; 可选项 expression 参数是要从函数返回的值.如果省略,则该函数不返 ...

  9. 将微服务注册到Eureka Server

    一.微服务程序编写 1.在已写好的微服务程序中添加pom依赖: <dependency> <groupId>org.springframework.cloud</grou ...

  10. G. Trace ACM-ICPC 2018 徐州赛区网络预赛 线段树写法

    There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy  ...