原创 如何在ADS调试中使用中断

2010-3-13 23:54 2871 4 4 分类: MCU/ 嵌入式

转贴:原文地址 http://blog.csdn.net/Veabol/archive/2009/12/18/5029524.aspx

大家都知道ARM9产生中断的时候PC会自动跳转到0x18地址处执行中断处理代码,但是当FLASH等启动介质中没有预烧录代码会怎么样呢?ARM复位时从启动介质获取的代码为全F或者全0,而如果ADS调试将代码下载到外部RAM里边就会导致0x18地址没有中断处理代码,发生中断当然也就没有办法执行了,其实有几种处理方法:


1、使用ADS的分散加载机制。在下载映像时将带中断处理的代码下载到0地址开始的地方,使0x18地址有中断处理代码,而其它代码加载到外部RAM。

2、预烧录中断处理代码。就是将有中断处理的代码预先烧录到启动介质,当ARM复位的时候自动将代码读取到0地址,这样在调试过程也能很好的处理中断。

3、加载的镜像代码去改变0x18地址的数据。
代码如下:

_ISR_STARTADDRESS EQU 0x33ffff00

AREA StartupCode, CODE
ResetCode
b . ;ResetHandler
b . ;handler for Undefined mode
b . ;HandlerSWI
b . ;HandlerPabort
b . ;HandlerDabort
b .
b IsrIRQ ;HandlerIRQ
b . ;HandlerFIQ
b .;IsrIRQ;EnterPWDN

IsrIRQ
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}

ldr r9,=INTOFFSET1
cmp r9,#0
ldrne r8,=HandleEINT0
bne %f0 ;如果中断来自于INTOFFSET1跳转

ldr r9,=INTOFFSET2
ldr r8,=Handle2D

0 ldr r9,[r9]
add r8,r8,r9,lsl #2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}

LTORG

CopyStartupCode
adr r0, ResetCode
mov r2, #0
adr r3, CopyStartupCode
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r0, r3
bcc %B0

mov pc,lr


;===============================================================================
ALIGN

AREA HandleAddr, DATA, READWRITE

^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
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_15 # 4
HandleReserved0 # 4
HandlenBATT_FLT # 4
HandleTICK # 4
HandleWDT_AC97 # 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2 # 4
;@0x33FF_FF60
HandleLCD # 4
HandleDMA # 4
HandleUART3 # 4
HandleReserved2 # 4
HandleSDI1 # 4
HandleSDI0 # 4
HandleSPI0 # 4
HandleUART1 # 4
HandleNAND # 4
HandleUSBD # 4
HandleUSBH # 4
HandleIIC0 # 4
HandleUART0 # 4
HandleReserved3 # 4
HandleRTC # 4
HandleADC # 4
;@0x33FF_FFA0
Handle2D # 4
HandleReserve3 # 4
HandleReserve4 # 4
HandleReserve5 # 4
HandlePCM0 # 4
HandleReserve6 # 4
HandleI2S0 # 4

在C文件中调用CopyStartupCode改变0地址开始的一段数据使0x18处能够处理中断。
中断函数初始化代码使用:
#define pISR_USBD (*(unsigned *)(_ISR_STARTADDRESS+0x84))
pISR_USBD = (unsigned)ISR_USBD;


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条