S3C2440部中断操作.pdfVIP

  • 3
  • 0
  • 约8.16千字
  • 约 7页
  • 2018-06-01 发布于江苏
  • 举报
S3C2440部中断操作

20100831 编写:小龍 S3C2440 外部中断操作 这两天在调试2440 外部中断的时候,通过jlink 来调试,老是进不了中断。 因为借鉴了网上很多程序,感觉不应该是程序的问题。后来通过USB 口,利用 supervivi 的downloadrun 功能,把编译产生的bin 文件下载到内存中。超级终 端就提示:Dummy_isr error, interrupt number: 5, INTMSK = 0xffff16ff 已是网上查 了这个错误。才知道是什么原因。因为SDRAM 的起始地址为0把 程序烧写进SDRAM,起始地址不为0 而不程序中断后,PC 默认指向0x00-0x1C, 内部SRAM 的地址0 处都不存在你要调试的程序的中断向量表,所以不能正确 将中断引导到你编写的中断服务程序中来,一旦中断发生,程序必然会跑飞。 同时ARM 内核会通过串口打印Dummy_isr error信息。 解决办法: (1) 直接烧写到nand 第0 块(如果代码大于4K,启动代码中必须要有拷 贝到SDRAM 功能) (2) 改写自己的程序,在初始化中断之前将中断向量表拷贝到内部 S8/31/2010RAM. (3) 利用MMU 的重定向功能 首先,这里先来了解下S3C2440 中断相关的寄存器。 1.中断分两大类:内部中断和外部中断。 2.外部中断。24 个外部中断占用GPF0-GPF7 (EINT0-EINT7),GPG0-GPG15 (EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要 上拉。具体参考datesheet 数据手册。 寄存器:EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23 的触发方式。 EINTFLT0-EINTFLT3 :控制滤波时钟和滤波宽度。 EINTPEND :这个是中断挂起寄存器,清除时要写1,后面还有几个是 写1 清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。 为什么没有EINT0-EINT3,呵呵,看看SRCPND 就知道了,里面没有 EINT4-EINT23 的位子,所以有了EINTPEND。 EINTMASK :这个简单,是屏蔽中断用的,也就是说位为1 时,此次 中断无效。 3. 内部中断。内部中断有8 个寄存器,下面逐一来看。 寄存器:SUBSRCPND:当一个中断发生后,那么相应的位会被置1,表示一个 中断发生了。 INTSUBMSK :与上一个是一伙的,中断屏蔽寄存器,具体屏蔽什么, 自己看手册去吧。 INTMOD :中断的方式。一个中断可以是普通中断,也可以是快中断, 在这里设置,但只能有一个快中断。 PRIORITY :优先级寄存器,不说了。 SRCPND :当一个中断发生后,那么相应的位会被置1,表示一个或 一类中断发生了。 INTMSK :中断屏蔽寄存器。 INTPND :中断发生后,SRCPND 中会有位置1,可能好几个(因为 同时可能发生几个中断),这些中断会由优先级仲裁器选出一个最紧迫的,然后 1 编写:小龍 吧把INTPND 中相应位置1,所以同一时间只有一位是1。也就是说前面的寄存 器置1 是表示发生了,只有INTPND 置1,CPU 才会处理。 INTOFFSET :用来表示INTPND 中哪一位置1 了,好让你查询,普 通中断跳转时查询用。清除INTPND、SRCPND 时自动清除。 4.各寄存器关系: 下面看图说明: 5.中断过程。 a 如果是不带子中断的内部中断:发生后SRCPND 相应位置1,如果没有被 INTMSK 屏蔽,那么等待进一步处理。 b 如果是带子中断的内部中断:发生后SUBSRCPND 相应位置1,如果没有被 INTSUBMSK 屏蔽,那么SRCPND 相应位置1,等待进一步处理,几个 SUBSRCPND 可能对应同一

文档评论(0)

1亿VIP精品文档

相关文档