S3C2440的Keil启动文件S3C2440.s添加中断配置

发布者:EnchantingEyes最新更新时间:2020-06-09 来源: eefocus关键字:S3C2440  Keil  启动文件  中断配置 手机看文章 扫描二维码
随时随地手机看文章

前言

本文主要描述如何在Keil自带的S3C2440.s文件中添加中断配置及中断地址映射,从而可以在中断产生时跳转到用户代码中的中断服务函数。目前在TQ2440开发板是实测可用。


工程源代码下载


本文所有代码都是截取代码,“…”代表其还有上下文。可根据代码中上下文的残缺部分找到该代码添加的位置。


一,添加中断相关寄存器地址符号映射

因为原始S3C2440.s文件中不含中断相关寄存器的地址,所以需要在开头添加:


...


; *  RAM_INTVEC: when set the startup code copies exception vectors 

; *  from execution address to on-chip RAM.

; */



;=================

; INTERRUPT

;=================

SRCPND      EQU  0x4a000000    ;Interrupt request status

INTMOD      EQU  0x4a000004    ;Interrupt mode control

INTMSK      EQU  0x4a000008    ;Interrupt mask control

PRIORITY    EQU  0x4a00000c    ;IRQ priority control           <-- May 06, 2002 SOP

INTPND      EQU  0x4a000010    ;Interrupt request status

INTOFFSET   EQU  0x4a000014    ;Interruot request source offset

SUSSRCPND   EQU  0x4a000018    ;Sub source pending

INTSUBMSK   EQU  0x4a00001c    ;Interrupt sub mask

_ISR_STARTADDRESS   EQU 0x33ffff00


; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs


Mode_USR        EQU     0x10

Mode_FIQ        EQU     0x11

Mode_IRQ        EQU     0x12


...123456789101112131415161718192021222324252627


二,添加中断向量偏移表

在文件末尾添加中断向量表,对应2440addr.h文件中相应的中断向量地址,起始地址参见_ISR_STARTADDRESS。


...


                LDR     R2, = (Heap_Mem +      Heap_Size)

                LDR     R3, = Stack_Mem

                BX      LR

                ENDIF


ALIGN


    AREA RamData, DATA, READWRITE


    ^   _ISR_STARTADDRESS       ; _ISR_STARTADDRESS=0x33FF_FF00

HandleReset     #   4

HandleUndef     #   4

HandleSWI       #   4

HandlePabort    #   4

HandleDabort    #   4

HandleReserved  #   4

HandleIRQ       #   4

HandleFIQ       #   4


;Do not use the label 'IntVectorTable',

;The value of IntVectorTable is different with the address you think it may be.

;IntVectorTable

;@0x33FF_FF20

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

;@0x33FF_FFA0

    END


三,添加程序__ENTRY入口点

定义程序入口点的位置,在ram调试状态下,就是0x30000000对应的Reset Handler的跳转代码。


...



;  Mapped to Address 0.

;  Absolute addressing mode must be used.

;  Dummy Handlers are implemented as infinite loops which can be modified.


                EXPORT __ENTRY

__ENTRY


Vectors         LDR     PC, Reset_Addr         

                LDR     PC, Undef_Addr

                LDR     PC, SWI_Addr

                LDR     PC, PAbt_Addr


...


四,修改添加中断现场保护及跳转代码

除了IRQ中断以外的所有中断的现场保护及跳转代码,因为这些中断在向量表都只有一种状态,所以不需要偏移。这里是宏定义的实际代码,宏定义的调用见五,修改添加IRQ中断现场保护及跳转代码中的代码。


...


GPJCON_Val      EQU     0x00000000

GPJUP_Val       EQU     0x00000000


;// I/O Setup‘


        MACRO

$HandlerLabel HANDLER $HandleLabel


$HandlerLabel

    sub sp,sp,#4    ;decrement sp(to store jump address)

    stmfd   sp!,{r0}    ;PUSH the work register to stack(lr does not push because it return to original address)

    ldr     r0,=$HandleLabel;load the address of HandleXXX to r0

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

    str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack

    ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)

    MEND


;----------------------- CODE --------------------------------------------------


                PRESERVE8



; Area Definition and Entry Point

;  Startup Code must be linked first at Address at which it expects to run.


..


五,修改添加IRQ中断现场保护及跳转代码

IRQ中断的现场保护及跳转代码。IRQ中断有很多可能,比如按键的外部中断,串口中断,IIC中断。。。等,需要根据实际中断标志指示跳转到对应的服务函数,所以需要一套独立的中断处理代码。此处代码来自《mini2440—–keil for ARM之中断一》。


...


                ELSE

IRQ_Addr        DCD     IRQ_Handler

                ENDIF

FIQ_Addr        DCD     FIQ_Handler


;Undef_Handler   B       Undef_Handler

                ;IF      :DEF:__RTX

                ;ELSE

;SWI_Handler     B       SWI_Handler

                ;ENDIF

;PAbt_Handler    B       PAbt_Handler

;DAbt_Handler    B       DAbt_Handler

;IRQ_Handler     PROC

                ;EXPORT  IRQ_Handler               [WEAK]

                ;B       .

                ;ENDP

;FIQ_Handler     B       FIQ_Handler


FIQ_Handler     HANDLER HandleFIQ

HandlerIRQ      HANDLER HandleIRQ

Undef_Handler   HANDLER HandleUndef

SWI_Handler     HANDLER HandleSWI

DAbt_Handler    HANDLER HandleDabort

PAbt_Handler    HANDLER HandlePabort


;呵呵,来了来了.好戏来了,这一段程序就是用来进行第二次查表的过程了.

;如果说第一次查表是由硬件来完成的,那这一次查表就是由软件来实现的了.

;为什么要查两次表??

;没有办法,ARM把所有的中断都归纳成一个IRQ中断异常和一个FIRQ中断异常

;第一次查表主要是查出是什么异常,可我们总要知道是这个中断异常中的什么中断呀!

;没办法了,再查一次表呗!

;===================================================================================

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

;PC=[HandleEINT0+[INTOFFSET]]              

;IsrIRQ

IRQ_Handler

    sub sp,sp,#4      ;给PC寄存器保留 reserved for PC

    stmfd sp!,{r8-r9} ;把r8-r9压入栈

    ldr r9,=INTOFFSET ;把INTOFFSET的地址装入r9  INTOFFSET是一个内部的寄存器,存着中断的偏移

    ldr r9,[r9]       ;I_ISR

    ldr r8,=HandleEINT0 ;这就是我们第二个中断向量表的入口的,先装入r8

;===================================================================================

;哈哈,这查表方法够好了吧,r8(入口)+index*4(别望了一条指令是4 bytes的喔),

;这不就是我们要找的那一项了吗.找到了表项,下一步做什么?肯定先装入了!

;==================================================================================

    add r8,r8,r9,lsl #2  ;地址对齐,因为每个中断向量占4个字节,即isr = IvectTable + Offeset * 4

    ldr r8,[r8]          ;装入中断服务程序的入口

    str r8,[sp,#8]       ;把入口也入栈,准备用旧招

    ldmfd sp!,{r8-r9,pc} ;施招,弹出栈,哈哈,顺便把r8弹出到PC了,跳转成功!



; Reset Handler


                EXPORT  Reset_Handler



...


六,屏蔽USER模式,开启SVC模式,打开IRQ中断

因为在ram调试时,code地址是从0x30000000开始,而IRQ中断跳转会直接调到0x00000018,然而我们期望跳到0x30000018(这个才是真正的IRQ入口),所以需要用mmu做一个0x00000018到0x30000018的映射(这个在TQ2440工程中的mmu初始化代码中完成)。但是mmu调用cp15协处理器的汇编代码在USER模式下会出问题?!目前只能先用SVC模式。此外,Keil自带的S3C2440.s文件默认是关闭SVC模式的IRQ中断,需要修改代码开启。


...


             SUB     R0, R0, #FIQ_Stack_Size


;  Enter IRQ Mode and set its Stack Pointer

                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit

                MOV     SP, R0

                SUB     R0, R0, #IRQ_Stack_Size


;  Enter Supervisor Mode and set its Stack Pointer

                ;MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit

                MSR     CPSR_c, #Mode_SVC:OR:F_Bit

[1] [2]
关键字:S3C2440  Keil  启动文件  中断配置 引用地址:S3C2440的Keil启动文件S3C2440.s添加中断配置

上一篇:学习笔记 --- S3C2440 DMA操作原理
下一篇:mini2440---keil for ARM下的调试与下载环境的搭建

推荐阅读最新更新时间:2024-11-13 07:20

三星Galaxy S6外观曝光:超薄一体式机身
三星Galaxy S6保护套   新浪手机讯 2月11日下午消息,今天,一家手机配件厂商公布了为三星Galaxy S6设计的手机保护套,并且展示了相关图片,让我们可以在发布之前了解S6的外观设计。   此次公布的三星Galaxy S6保护套为透明式设计,从而进一步泄露了S6的外观。从展示的图片中可以看到,S6采用了超薄一体式机身设计,并且边框更加圆润,依然是椭圆形的Home键,可能会内置按压式指纹识别传感器。   不过,在三星未正式发布Galaxy S6之前,这些消息的真实性无法确认。之前有传闻称,S6将会采用一体式金属边框和前后双玻璃面板。预计三星将在3月初的MWC2015上正式发布Galaxy
[手机便携]
基于S3C2440和DM9000移植LWIP
终于开始我的第一篇笔记了。这回要做的事情,是以太网的移植。 使用mini2440已经有一段时间了。诸如裸机的LED,键盘开关等等等等也都试验过了,uCOS,WinCE也是浅尝了一下。如今想到了以太网。 由于mini2440的板上集成了一个DM9000的网卡,并且在CE系统里面成功的使用以太网与PC连接了。于是自然而然的想,能不能在uCOS下也实现以太网接口呢? 一上来什么都不懂,于是找一些资料,在这里要谢谢焦海波老师所著的嵌入式网络系统设计一书,移植过程中很多资料都来源于这本书。其次是mikenoodle的单片机驱动DM9000网卡一文,里面详细地讲述如何在2440裸机下驱动DM9000网卡。 首先明确我们需要做的事情是什么?为了
[单片机]
S3C2410 按键控制LED(中断
一、开发环境 1、硬件平台:UP-TECH2410DVK1.1 2、主机:PC+eclipse 二、相关原理图 LED1-- GPC5 LED2-- GPC6 LED3-- GPC7 KEY1-- EINIT3 KEY2-- EINIT5 KEY3-- EINIT9 三、基本原理 通过按键的按下而触发中断,从而进行中断处理,进而实现相应功能(如闪烁LED),然后退出中断。 如何判断按键被按下: 以KEY1为例,未按下时,因为EINT3连接的是VDD,所以为高电平,当按键发生,EINT3连接的是GND,接地,此时为低电平。 通过芯片手册可查到EINT3 、5、9连接的为复
[单片机]
<font color='red'>S</font>3C2410 按键控制LED(<font color='red'>中断</font>)
化身二合一 Galaxy Tab S3官方渲染图曝光
距离世界移动通信大会(MWC 2017)还有大约一周时间,每次大型展会前夕关于各路新品的曝光也是纷至沓来。日前爆料大神@evleaks表示,三星Galaxy Tab S3平板电脑除了已经确定的S Pen之外,还将会有一款专用的磁吸键盘,不过它并不会作为标配。 三星Galaxy Tab S3平板电脑渲染图   另外,从最近曝光的渲染图中我们还清晰地看到了一枚实体Home按键和两个电容触控按键,而Home键也集成了指纹识别模块。屏幕上显示的日期是4月4日,这难道是三星在暗示Galaxy Tab S3平板电脑的上市时间么?   三星Galaxy Tab S3平板电脑整体延续了此前三星平板电脑的一贯风格,S Pen和键盘的加入使得其具
[手机便携]
基于嵌入式ARM9 S3C2440A 的USB设计与实现
引 言 USB(Universal Serial Bus)是通用串行总线的缩写,因其具有方便易用,动态分配带宽,容错性优越和高性价比等特点,现已成为计算机的主流接口。 随着嵌入式系统的广泛应用,各种小型终端需要开发出与外界联系的USB接口。目前,常用的技术有两种。基于单片机的USB接口,特点是需要外置芯片,电路复杂,留下的 CPU资源不多;基于ARM的USB接口,特点是资源丰富,但ARM系列产品较多,如果选型不当,还需要搭接较多的外围电路,且不能很好地发挥CPU性能。 该设计采用三星公司ARM9核的S3C2440A芯片作为CPU,因为该芯片内部集成了控制USB的所有部件,外围电路简单,易于实现。 1 S3C2440
[单片机]
基于嵌入式ARM9 <font color='red'>S</font>3C2440A 的USB设计与实现
MicroSys扩展基于NXP S32G的miriac® SOM系列可扩展性
7月7日,德国MicroSys Electronics正式宣布支持新的NXP® Semiconductors S32G3车载网络处理器,从而扩展了基于NXP S32G的miriac® 模块化系统(System-on-Modules,或SOM)系列的可扩展性,可为混合关键安全应用提供更高的实时数据处理能力。 图片来源:MicroSys Electronics 得益于全新的NXP S32G3处理器,新型miriac® MPX-S32G399A SOM是对之前基于NXP S32G2的产品的进一步提升,应用处理性能提高了2.5倍,并采用8个Arm® Cortex®-A53内核(而非4个),以及4个Arm Cortex-M7双
[汽车电子]
MicroSys扩展基于NXP <font color='red'>S</font>32G的miriac® SOM系列可扩展性
三星Galaxy S21欧洲版或不提供充电适配器
据外媒报道,早前曾有不少报道指出,多个地区已经确认三星Galaxy S21将不会提供充电器。德国网站Winfuture的Roland Quandt表示,这包括巴西,现在面临这一处境的还包括欧洲消费。今年早些时候,三星还在嘲笑苹果推出没有充电适配器的iPhone 12的决定,但现在三星似乎是在直接模仿他们的行动。   据报道,三星已经删除了他们在Facebook上嘲笑苹果早前决定的帖子。   三星Galaxy S21预计将支持25W快充,这意味着老式标准充电器可能无法提供最佳体验。
[手机便携]
三星Galaxy <font color='red'>S</font>21欧洲版或不提供充电适配器
linux内核移植s3c2410,准备工作
1.首先是获得linux内核源码,好像是废话,下载地址如下:ftp://ftp.kernel.org/pub/linux/kernel/v2.6/下载: linux-2.6.16.22.tar.bz2 patch-2.6.22.6.bz2 上面一步需要说明的是一般而言,linux内核的各个补丁文件是根据某个linux内核的版本号来作的patch。 将上面的两个压缩文件解压: tar jxvf linux-2.6.22.tar.bz2 tar jxvf patch-2.6.22.6.bz2 cd linux-2.6.22 patch -p1 ../patch-2.6.22.6 2.linux内核源码结构和Makefile分析 li
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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