S3C 2410开发板上的中断编程 -ARM9开发板学习心得
文章整理: 深圳龙人嵌入式研发中心 (arm9arm7)
一、 在S3C 2410 开发板上 实现中断编程的 目的
中断服务程序在 嵌入式 操作系统中无疑占有非常重要的地位,编写中断程序不仅要会运用底层的汇编语言,还要了解AR M 的体系架构。那这一节我们就通过 中断编程 来响应 S3C 2410开发板 上的16个按键,实现依次按下16个键时,D9~D12 四个 Led 从 0~15 进行计数,并通过上个实验实现的 uart_printf 向串口发送数据 Kn is pressed!。
二、 S3C 2410 开发板上的中断编程 的 代码
我们直接分析代码,代码中只有简略的注释,必要时我会在整个代码文件的后面对相应的细节进行解释。先来分析 head.s:
@文件 head.s
.text
.global _start
_start:
@ Set vector table for interrupt
.............(这里部分代码省略,要看代码请进龙人计算机关于 嵌入式系统和嵌入式开发 的网站)
我们来看一下它的执行流程:
(1) 设置中断向量表。你也许在这里有疑问,为什么一开始就有 8 个分支跳转指令?我们
先来研究一下 ARM 如何响应异常/中断,看下表:
-------------------------------------------------------------
Exception Mode Address
-------------------------------------------------------------
Reset Supervisor 0x00000000
Undefined Undefined 0x00000004
Software Interupt Supervistor 0x00000008
Prefetch Abort Abort 0x0000000C
Data Abort Abort 0x00000010
IRQ (interupt) IRQ 0x00000018
FIQ (fast interupt) FIQ 0x0000001C
-------------------------------------------------------------
ARM9 ARM9开发板 S3C 241 0 开发板 嵌入式开发 中断编程
可以看出 ARM 支持 7 种异常/中断,每种异常/中断都有固定的地址,这个地址叫中断向量,一般我们会在这个地址放一条分支跳转指令,当异常/中断发生时,ARM 就到这个地址执行这个跳转指令,从而调用相应的中断服务程序。
(2) 关闭看门狗
(3) 暂时屏蔽所有中断。
1.地址 0x4A000008 是中断屏寄存器 INTMSK 的端口地址,复位 INTMSK 会导致所有的中断源被屏掉。
2.地址 0x4A00001C 是子中断屏寄存器 INTSUBMSK 的端口地址,它的低 11 位对应外部11个中断源,高 21 位保留不用。复位它的低 11 位会导致相应的外部中断被屏。
(4) 初始化内存 SDRAM 设置
(5) Self-copying: 从 Nand Flash 将自身复制到 SDRAM
(6) 进入 IRQ 模式,设置 IRQ 模式下的堆栈寄存器
(7) 进入系统模式,并设置系统模式下的堆栈寄存器
(8) 系统模式下调用 init_irq,这个函数用于初始化一些用于响应按键的中断寄存器
(9) 再次进入系统模式,并打开当前程序状态寄存器 cpsr 的 IRQ 中断位,这样 ARM 就能 响应 IRQ 中断了
(10)执行主函数 main 后返回,然后进入死循环,等待中断发生
(11)中断发生时,ARM 响应中断并于 0x00000018 处执行 b HandleIRQ 跳转指令调用中断服务程序,处理完毕后返回循环处再等待下次中断的发生,如此往复...
这就是中断处理的基本流程了 :-), 以下文件的代码在前面随笔均有详细说明,这里就仅附
简略注释了
注意:程序代码省略,详细代码请进龙人计算机网站下载
深圳龙人嵌入式产品事业部是国内最强最精最专业的开发板集散地包括ARM开发板、ARM9开发板、 Xscale开发板 、2410开发板 (ARM9) 、 2440开发板 (ARM9) 、44B0X开发板 (ARM7) 、DSP开发板、单片机开发板、FPGA开发板、CPLD开发板等各类精品开发板! 网址: http://www.armodm.com
三、编译、烧写、测试
Make 一下就会生成我们要的文件 main, 将其通过 JTAG 烧入 Nand Flash。用超级终
连接到开发板,注意波特率设为 57600,数据位 8,无奇偶校正,停止位1,无数据流控制。现
在 Reset 一下的 开发板 ,然后静静的等待吧,生成的二进制文件 main 有 39K 大呢,要等它
完全复制到 SDRAM 至少要两三分钟...哈哈,你会发现 D9~D12 四个led 灯被点亮了,并且
当你按下某个按键时,这四个灯会指示你按下的是第几个键,你还会发超级终端上有文字显示,
例如当你按下按键 2 时:
K2 is pressed!