S3C2440启动代码 中断分析

发布者:数字冲浪最新更新时间:2016-03-01 来源: eefocus关键字: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  启动代码  中断分析 引用地址: S3C2440启动代码 中断分析

上一篇: 对ARM加载域和运行域的理解
下一篇: ARM程序设计基础

推荐阅读最新更新时间:2024-03-16 14:45

u-boot-2011.06在基于s3c2440开发板的移植之支持YAFFS2
YAFFS和YAFFS2是由AlephOne公司开发的NAND Flash文件系统。YAFFS和YAFFS2主要差异在于PAGE读写size的大小,YAFFS2可支持到2Kper page,远高于YAFFS的512 Bytes,因此YAFFS2对于大容量NANDflash来说更具优势。 就u-boot来说,主要是能够使它支持下载YAFFS文件,以供操作系统使用,因此只要能够实现YAFFS的写入功能即可,无需实现读取功能。 u-boot-2011.06是支持写入YAFFS文件的,但默认情况下,该功能没有开启。要想开启该功能,就必须在include/configs/zhaocj2440.h文件内定义CONFIG_CMD_N
[单片机]
S3C2440移植linux3.4.2内核之内核框架介绍及简单修改
uboot启动内核分析 进入cmd_bootm.c,找到对应的bootm命令对应的do_bootm(): int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv ) { boot_os_fn *boot_fn; //boot_fn是个数组函数 ... .. boot_fn(0, argc, argv, &images); //调用数组函数 ... ... } boot_os_fn是个typedef型,如下图所示: 由于定义了宏CONFIG_BOOTM_LINUX,最终会跳转到do_bootm - do_bootm_linu
[单片机]
S3c2440如何利用JLINK烧写U-boot到NAND Flash中
很多同学使用笔记本作为自己的ARM开发和学习的平台,绝大多数笔记本都没有并口,也就是无法使用JTag调试和烧写程序到Nand Flash中,幸好我们还有JLINK,用JLINK烧写U-boot到Nor Flash中很简单,大部分NOR Flash都已经被JLink的软件SEGGER所支持,而新手在学习的时候经常会实验各种各样的命令,最悲剧的莫过于将NAND Flash中原有的bootloader给删除了,这时候开发板上电后由于没有bootloader,硬件没有被初始化,在NAND Flash中的操作系统也就无法被加载,开发板成“砖”了,这时候笔记本又无法利用JTag烧写程序进Nand Flash。起始这些可以利用JLink通过两种
[单片机]
关于S3C2440的地址分配的分析
在研究2440开发板的时候,通过对2440芯片的和各种存储芯片的理解,略有感悟。本贴主要是关于s3c2440硬件平台设计,从事嵌入式软件的朋友可以当做参考,同时欢迎各路硬件牛人多提建议。S3C2440A是三星推出的16/32bit的RISC MPU(RISC微处理器。RISC:educed instruction set computer,精简指令集计算机,是一种执行较少类型计算机指令的微处理器);2440具有1G byte的寻址空间(8banks,128M/bank)。2440芯片所有引脚中分配了27根地址线(A0~A26),换言之,也就128的地址空间。同时,在2440芯片中提供了nGCS0~nGCS7 8路片选信号线,
[单片机]
s3c2440裸机开发调试环境(MDK4.6,Jlink v8,mini2440)
用于arm裸机程序开发的IDE基本有 以下3个:MDK,IAR,还有ADS。具体它们的具体情况在这里我就不多说了,百度一下就明白了。由于之前开发c51,stm32时候都使用了MDK开发环境,而且MDK的界面确实看起来舒服多了,所以我选择了MDK作为我的s3c2440裸机开发的IDE。以下主要介绍一下如何使用MDK配合J-link来调试基于s3c2440的开发板。 首先,我们需要下载的有以下2样: MDK J-link 驱动 我的开发环境:windows 7 64位,J-linkv8,mini2440开发板一块。最后选择了:MDK4.6版本,J-ink v8的当前最新版本J-linkARM v4.56。 MDK的大部
[单片机]
<font color='red'>s3c2440</font>裸机开发调试环境(MDK4.6,Jlink v8,mini2440)
S3c2440裸机-spi编程-3.gpio模拟spi驱动OLED
操作OLED,通过三条线(SCK、DO、CS)与OLED相连,这里没有DI是因为2440只会向OLED传数据而不用接收数据。 gpio_spi.c来实现gpio模拟spi,负责spi通讯。对于OLED,有专门的指令和数据格式,要传输的数据内容,在oled.c这一层来实现,负责组织数据。 因此,我们需要实现以上两个文件。 1.SPI初始化 新建一个gpio_spi.c文件,实现SPI初始化SPIInt() 1.1 GPIO init(pinmux管脚等配置) 上图J3为板子pin2pin到OLED的底座。 GPF1作为OLED片选引脚,设置为输出; GPG4作为OLED的数据(Data)/命令(Command)选择引脚,设置
[单片机]
<font color='red'>S3c2440</font>裸机-spi编程-3.gpio模拟spi驱动OLED
S3C2440开发板裸机程序系列02--按键和蜂鸣器
1. TQ2440按键接口电路 K1 -- EINT1 -- GPF1 K2 -- EINT4 -- GPF4 K3 -- EINT2 -- GPF2 K4 -- EINT0 -- GPF0 2. 按键参考代码 按键,则对应的led灯亮,松开则灭。 在流水灯程序基础上,修改Main.c,增加key.c , key.h key.c #include 2440addr.h #include key.h void Key_Init(void) { rGPFCON &= ~((3 2)|(3 8)|(3 4)|(3 0)); rGPFCON |= KEY1|KEY2|KEY3|KEY4; /
[单片机]
<font color='red'>S3C2440</font>开发板裸机程序系列02--按键和蜂鸣器
基于S3C2440的车载GPS/GPRS跟踪监控系统研究与实现
0 引言 随着交通系统的不断发展和完善,定位导航系统的应用范围和领域也越来越广泛,基于GPS,GPRS/GSM,GIS等的车辆跟踪与监控系统正在受到人们越来越多的青睐,显示出强大的发展潜力。GPS(Global Position System,全球定位系统)是美国从20世纪70年代开始的研制。19 93年正式投入运行,它能够全球、全天候、连续实时地为用户提供高精度的三维坐标、三维速度和时间信息。GPS的出现从根本上改变了人们获取空间信息的方式,特别是在交通工具导航、监控、跟踪等领域具有很大的应用价值和发展潜力。 本文在ARM9的硬件平台基础上,利用嵌入式Linux操作系统强大的管理平台的内核与外设的功能,开发了具有导航跟踪与
[单片机]
基于<font color='red'>S3C2440</font>的车载GPS/GPRS跟踪监控系统研究与实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved