`
xitong
  • 浏览: 6198527 次
文章分类
社区版块
存档分类
最新评论

S3C2440启动代码 中断分析

 
阅读更多

1.建立中断向量表

b ResetHandler;hereis the first instrument 0x00这是第一条执行的指令

b HandlerUndef ;handler for Undefined mode

b HandlerSWI ;handler for SWI interrupt

b HandlerPabort ;handler for PAbort

b HandlerDabort ;handler for DAbort

b . ;reserved

b HandlerIRQ ;handler for IRQ interrupt

b HandlerFIQ ;handler for FIQ interrupt

2. 设置缺省中断处理函数

;将普通中断判断程序的入口地址给HandleIRQ

ldr r0,=HandleIRQ ;This routine is needed

ldr r1,=IsrIRQ ;ifthere isn't 'subs pc,lr,#4' at 0x18, 0x1c

str r1,[r0]

3.IRQ的中断服务程序

IsrIRQ

sub sp,sp,#4;reserved for PC

stmfd sp!,{r8-r9}

ldr r9,=INTOFFSET ;地址为0x4a000014的空间存着中断的偏移

ldr r9,[r9]

ldr r8,=HandleEINT0

add r8,r8,r9,lsl#2

ldr r8,[r8]

str r8,[sp,#8]

ldmfd sp!,{r8-r9,pc}

;外部中断号判断,通过中断服务程序入口地址存储器的地址偏移确定

;PC=[HandleEINT0+[INTOFFSET]]

4.中断处理

HandlerFIQ HANDLER HandleFIQ

HandlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

5.将$HandleLabel地址空间中的数据给PC

MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;decrementsp(to store jump address) sp=sp-4

stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to originaladdress) r0进栈

ldr r0,=$HandleLabel;load the address ofHandleXXX to r0

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

str r0,[sp,#4] ;store the contents(ISR) of HandleXXX tostack r0进栈,将ro中的数据写入sp+4为地址的存储器中

ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) 恢复r0的值,同时也将$HandleLabel地址空间中的数据给PC

MEND

;将$HandleLabel地址空间中的数据给PC,中断服务程序的入口

6 中断向量表

ALIGN

AREARamData, DATA, READWRITE

^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00

;表定位在 RAM 高端,基地址为 _ISR_STARTADDRESS

;^是MAP的同义词,#是FIELD的同义词

HandleReset # 4

HandleUndef # 4

HandleSWI # 4

HandlePabort # 4

HandleDabort # 4

HandleReserved # 4

HandleIRQ # 4

HandleFIQ # 4

HandleEINT0 #4

HandleEINT1 #4

HandleEINT2 #4

HandleEINT3 #4

HandleEINT4_7 # 4

HandleEINT8_23 # 4

HandleCAM #4 ; Added for 2440.

HandleBATFLT # 4

HandleTICK #4

HandleWDT #4

HandleTIMER0 #4

HandleTIMER1 #4

HandleTIMER2 #4

HandleTIMER3 #4

HandleTIMER4 # 4

HandleUART2 # 4

;@0x33FF_FF60

HandleLCD #4

HandleDMA0 #4

HandleDMA1 #4

HandleDMA2 #4

HandleDMA3 #4

HandleMMC #4

HandleSPI0 #4

HandleUART1 #4

HandleNFCON #4 ; Added for 2440.

HandleUSBD #4

HandleUSBH #4

HandleIIC #4

HandleUART0 #4

HandleSPI1 #4

HandleRTC #4

HandleADC # 4

7映射(定义一个指针的指针)

/ Exception vector

#define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+0x0))

#define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4))

#define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8))

#define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc))

#define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x10))

#define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14))

#define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18))

#define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1c))

// Interrupt vector

#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))

#define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x24))

#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28))

#define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2c))

#define pISR_EINT4_7 (*(unsigned *)(_ISR_STARTADDRESS+0x30))

#define pISR_EINT8_23 (*(unsigned *)(_ISR_STARTADDRESS+0x34))

#define pISR_CAM (*(unsigned *)(_ISR_STARTADDRESS+0x38)) // Added for 2440.

#define pISR_BAT_FLT (*(unsigned *)(_ISR_STARTADDRESS+0x3c))

#define pISR_TICK (*(unsigned *)(_ISR_STARTADDRESS+0x40))

#define pISR_WDT_AC97 (*(unsigned*)(_ISR_STARTADDRESS+0x44)) //Changedto pISR_WDT_AC97 for 2440A

#define pISR_TIMER0 (*(unsigned*)(_ISR_STARTADDRESS+0x48))

#define pISR_TIMER1 (*(unsigned*)(_ISR_STARTADDRESS+0x4c))

#define pISR_TIMER2 (*(unsigned *)(_ISR_STARTADDRESS+0x50))

#define pISR_TIMER3 (*(unsigned *)(_ISR_STARTADDRESS+0x54))

#define pISR_TIMER4 (*(unsigned *)(_ISR_STARTADDRESS+0x58))

#define pISR_UART2 (*(unsigned *)(_ISR_STARTADDRESS+0x5c))

#define pISR_LCD (*(unsigned *)(_ISR_STARTADDRESS+0x60))

#define pISR_DMA0 (*(unsigned *)(_ISR_STARTADDRESS+0x64))

#define pISR_DMA1 (*(unsigned *)(_ISR_STARTADDRESS+0x68))

#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))

#define pISR_UART1 (*(unsigned *)(_ISR_STARTADDRESS+0x7c))

#define pISR_NFCON (*(unsigned *)(_ISR_STARTADDRESS+0x80)) // Added for 2440.

#define pISR_USBD (*(unsigned *)(_ISR_STARTADDRESS+0x84))

#define pISR_USBH (*(unsigned *)(_ISR_STARTADDRESS+0x88))

#define pISR_IIC (*(unsigned *)(_ISR_STARTADDRESS+0x8c))

#define pISR_UART0 (*(unsigned *)(_ISR_STARTADDRESS+0x90))

#define pISR_SPI1 (*(unsigned *)(_ISR_STARTADDRESS+0x94))

#define pISR_RTC (*(unsigned *)(_ISR_STARTADDRESS+0x98))

#define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x9c))

8.一个中断实例

Main()

{

KeyScan_Test;

}

void KeyScan_Test(void)

{

pISR_EINT0 =pISR_EINT2 = pISR_EINT8_23 = (U32)Key_ISR;

}

static void __irq Key_ISR(void)

{

}

分享到:
评论

相关推荐

    s3c2440移植ADS启动文件到keil

    将ADS1.2下的S3C2440的启动.s文件移植到keil工程下,方便用户在keil环境下进行裸机开发

    s3c2440arm9的启动代码分析

    分析s3c2440arm9的启动代码,包括中断、看门狗、MMU管理等

    uCOS II在S3C2440移植+SPI中断(mdk4.2)

    代码实现了ucos II在S3C2440的移植,启动代码部分也注释详细;任务实现了SPI中断,是很好的中断例程(SPI0的收发口短接即可)。

    MINI2440启动代码编写教程

    MINI2440的启动代码编写教程,深入讲解了S3C2440的启动过程,中断处理过程,中断硬件机制,及编写启动代码的方法、有详细的讲解过程,很好东西。

    TQ2440-S3C2440-裸机UART测试程序

    用ADS编译测试通过,UART查询和中断方式测试程序,可以通过uboot下载至NAND里运行,直接下载到SDRAM无法运行(因为没有开启MMU)。 ...这里是我对代码及TIMER0中断的简单分析。

    S3C6410裸机中断源代码

    S3C6410裸机中断程序,使用中断的方法,按下key1~key4,分别点亮LED1~LED4。这里采用VIC_Port中断处理方法。

    TQ2440_Keil5.25_裸机工程及含中断配置启动文件

    此工程只能j-link调试,不...后来想研究ARM的中断,就尝试在Keil自带S3C2440.s中加入中断配置。另附有原始文件,各位可自行比较差异。这个nor flash烧入搞不定啊,米娜桑如果有谁烧入成功了,能在这里留言分享一下吗?

    s3c6410按键中断控制led驱动程序

    按键中断方式控制led linux驱动程序,里面还有一个扫描方式的按键驱动。

    嵌入式ARM9-2440实战手册

    PART2 OF TWO PARTS 针对s3c2440a,通过实例精讲,介绍了arm9嵌入式常用模块的原理和驱动程序实现方法,广嵌教育出品 ...附录一 S3C2440A 启动代码314 附录二 GEC2440 核心板电路图327 附录三 GEC2440 主板电路图335

    嵌入式ARM9-2440实战手册.pdf

    实验1 ARM 汇编指令编程实验1 实验2 C 和ARM 汇编混合编程实验8 实验3 C 语言实现LED 控制实验15 ...附录一 S3C2440A 启动代码314 附录二 GEC2440 核心板电路图327 附录三 GEC2440 主板电路图335

    mini2440按键中断测试程序(烧录到NORFlash,运行在SDRAM)

    该程序适用于mini2440板子。将.bin程序用J-LINK烧录到NORFlash中,从NORFlash启动以后,程序会搬移到SDRAM中运行...文件包括:head1.S head2.S init.c interrupt.c main.c s3c24xx.h int.lds Makefile 等一些生成文件。

    郭天祥ARM9视频教程(第13和20讲均可观看).docx

    5. S3C2440的中断体系结构 第十讲 S3C2440主存储器配置 1. S3C2440存储控制器特性 2. SDRAM原理分析 3. NandFlash原理分析 第十一讲 ADS工具的使用,建立硬件调试环境 1. 建立ADS工程 2. 系统代码和NandFlash代码...

    arm11 (S3C6410)裸机程序代码

    6410裸机学习程序,Arm为三星公司出的S3C6410(ARM11),适用于OK6410 飞凌6410 Tiny6410 的裸机程序开发。 编译环境:XP SP3,RVDS2.2编译器 功能模块: 串口 、LED、beep(蜂鸣器)、key(查询和中断模式)、PWM、...

    嵌入式程序,简单按键中断,完整的工程——初学者系列

    在TQ2440上成功运行的按键中断程序,提供完整的工程文件。适合初学者,共同提高。

    嵌入式系统/ARM技术中的地址重映射在S3C4510B系统中的实现

    详细介绍Remap(重映射)的实现过程及部分关键代码,给出启动代码中异常中断向量的处理。 关键词:Remap 地址重映射 S3C4510B 异常中断近年来,随着32位芯片制造技术的不断完善,制造成本不断降低,国内的32位MCU...

    S3C44B0+Uboot1.1.6+uClinux2.6.9

    2.2 创建vendors s3c44b0 2.3 根文件系统 2.4 建立根文件系统时遇到的问题 2.5 中断向量地址 2.6 解压缩内核 2.7 增加串口驱动 2.7.1 增加串口文件 2.7.2 修改配置文件 2.7.3 Console调用过程 3 Uboot启动...

    s3c2410中文开发手册

    s3c24102410实验手册含有lcd 中断 ,时钟 ,I2c,ADC等实验代码,启动代码实验,硬件说明

    学ARM和学单片机一样简单12

    三、S3C444B0X I/O口与中断的分析(第三讲) 1、S3C444B0X I/O口(37分钟) (1)、I/O口寄存器配置 (2)、I/O口控制LED代码分析 (3)、UART寄存器配置及代码简要分析 2、 中断(46分钟) (1)、中断模式...

    学ARM和学单片机一样简单15

    三、S3C444B0X I/O口与中断的分析(第三讲) 1、S3C444B0X I/O口(37分钟) (1)、I/O口寄存器配置 (2)、I/O口控制LED代码分析 (3)、UART寄存器配置及代码简要分析 2、 中断(46分钟) (1)、中断模式...

Global site tag (gtag.js) - Google Analytics