如何在ADS调试中使用中断

  

    大家都知道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;       



其实三种方法中第一种和第三种都很简单,当初我竟然只用了第二种,为此还专门先写了段烧录ADS烧录NAND的代码,谁那个SJF用不起来,不过因为反正也要通过ADS烧录block0img和eboot也就无所谓了;第三种方法是后来根据EBOOT中USB中断初始化代码想到的;当初没有分散加载文件的方法还有一个原因是有一个重要的C函数,只要一使用分散加载调用就出错,查看Dissamemble发现使用分散加载时ADS Make出来的这个函数最后竟然没有mov pc,lr,搞不清楚它们之间有什么联系,改优化等级都没有用,彻底无奈,只好放弃使用分散加载。

 

转自:http://www.armce.com/bbs/thread-996-1-1.html 

作者:Veabol

转载于:https://www.cnblogs.com/xfdarm/archive/2009/12/18/1626907.html

<think>嗯,用户想了解英飞凌ADS中断使用方法,包括教程或示例代码。首先,我需要回忆一下英飞凌的ADS开发环境相关资料。根据引用[1],英飞凌官网提供了开发资源和代码示例,这可能包括中断相关的部分。用户可能需要先配置中断控制器,比如TC3xx系列的IfxSrc模块。然后,编写中断服务函数,注意ADS通常使用#pragma语句声明中断处理程序,比如__interrupt(priority)。还要考虑寄存器操作,比如清除中断标志,避免重复触发。另外,初始化外设比如定时器或GPIO的中断配置也很重要。可能需要参考AURIX™ TC3xx用户手册,特别是中断章节。此外,引用[2]提到了环境配置,比如64-bit launcher和PATH设置,这可能影响开发环境的稳定性,但中断代码主要在代码层面。用户可能需要官网的示例代码,比如在AURIX Development Studio里找中断例程,或者参考iLLD库中的中断处理部分。需要提醒用户查阅芯片手册确保寄存器配置正确,以及如何调试中断问题,比如断点或日志。生成的问题可能涉及中断配置步骤、优先级处理、常见错误等。</think>[系统级回答] 根据英飞凌官方技术文档和开发实践,ADS中断配置主要包含以下关键步骤: 1. **中断控制器初始化** 需要配置系统中断路由寄存器(SRC)和中断服务节点(Service Node),TC3xx系列芯片采用模块化中断架构: $$SRC_ABC.B.SRPN = 0x0F; // 设置中断优先级$$ $$SRC_ABC.B.TOS = CPU0_IRQ_TOS; // 指定目标CPU核$$[^1] 2. **中断服务函数声明** 在ADS开发环境中使用特殊编译指令声明中断处理程序: ```c #pragma section code ".text.IntHandler" __interrupt(priority=15) void ISR_Handler(void) { IfxPort_setPinState(LED1, IfxPort_State_toggled); // 必须清除中断标志 MODULE_REGISTER->IR.U = 0x1; } #pragma section code restore ``` 3. **外设中断配置** 以定时器中断为例的典型配置流程: ```c // 配置定时器模块 IfxGpt12_T5Config timerConfig; IfxGpt12_T5_initConfig(&timerConfig, &MODULE_GPT120); timerConfig.trigger.enabled = TRUE; timerConfig.trigger.triggerPoint = 10000; // 10ms间隔 // 启用中断 timerConfig.interrupt.type = IfxGpt12_T5Interrupt_trigger; IfxGpt12_T5_init(&g_driver.timer, &timerConfig); ``` : 英飞凌AURIX™ TC3xx用户手册第12章中断系统架构 [^2]: ADS开发环境帮助文档中断配置章节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值