DM6437 中断向量表配置

四、DM6437  中断向量表配置
1. 编写中断服务例程
在.c源文件中编写ISR函数c_intXX,用于中断处理,如:
interrupt void c_intXX (void)
{
            …;
}
注:对于硬件中断而言,XX = 00~15。
2.初始化中断向量表,并在内存段中的中断向量表中配置好对应的中断向量
            首先是把中断向量表定位到某一内存段中,我们可以在cmd文件中配置中断向量表的内存映射,如:
MEMORY
{
    VECS:        o = 0x10800000    l = 0x00000400
    MEMTEST:    o = 0x10800400    l = 0x00000200
    IRAM:        o = 0x10800600    l = 0x0001FA00
    DDR2:        o = 0x80000000    l = 0x10000000
}
SECTIONS
{
    .bss              IRAM
    .cinit          IRAM
    .cio              IRAM
    .const          IRAM
    .data          IRAM
    .far              IRAM
    .stack          IRAM
    .switch          IRAM
    .sysmem          IRAM
    .text          IRAM
    .vecs          VECS
    .ddr2          DDR2
}
       
                然后建立一个.asm文件,用以配置中断向量表中的中断向量,我们需要声明一些全局变量,以便其他源文件可以引用这些变量或者引用其他源文件的变量,如:
    *-----------------------------------------------------------------* Global symbols defined here and exported out of this file
*--------------------------------------------------------------------    .global _vectors
    .global _c_int00
    .global _vector1                       
    .global _vector2        ;RSVD保留
    .global _vector3        ;RSVD保留
    .global _vector4
    .global _vector5
    .global _vector6
    .global _vector7
    .global _vector8
    .global _vector9       
    .global _vector10
    .global _vector11   
    .global _vector12   
    .global _vector13   
    .global _c_int14_vencint    ; Hookup the c_int14 ISR in main()
     .global _vector15
                        
     因为引用了rts的_c_int00中断,即RESET中断,因此需要引入这个符号:
    .ref        _c_int00
       
为了把中断服务例程的地址,即中断向量插入到中断向量表中,可以定义一个宏:
VEC_ENTRY .macro addr
        STW        B0,*--B15
        MVKL        addr,B0
        MVKH        addr,B0
                  B0
        LDW        *B15++,B0
        NOP        2
        NOP   
        NOP   
.endm           
               
        为了初始化中断向量表中的中断向量,可以定义一个虚拟的中断向量:
_vec_dummy:
              B3
        NOP        5
               
        接下来就可以配置中断向量表了:
.sect “.vecs”
.align 1024
_vectors:
_vector0:        VEC_ENTRY _c_int00            ;RESET中断
_vector1:        VEC_ENTRY _vec_dummy ;NMI不可屏蔽中断
_vector2:        VEC_ENTRY _vec_dummy ;保留中断1
_vector3:        VEC_ENTRY _vec_dummy ;保留中断2
_vector4:        VEC_ENTRY _vec_dummy ;外部中断INT4
_vector5:        VEC_ENTRY _vec_dummy ;外部中断INT5
_vector6:        VEC_ENTRY _vec_dummy ;外部中断INT6
_vector7:        VEC_ENTRY _vec_dummy ;外部中断INT7
_vector8:        VEC_ENTRY _c_int08 ; EDMA控制器中断EDMAINT,对应于c_int08 ISR
_vector9:        VEC_ENTRY _vec_dummy;JTAGRTDX中断
_vector10:        VEC_ENTRY _vec_dummy;EMIF_SDRAM_Timer中断
_vector11:        VEC_ENTRY _vec_dummy;McBSP_0_Receive中断
_vector12:        VEC_ENTRY _vec_dummy;McBSP_1_Transmit中断
_vector13:        VEC_ENTRY _vec_dummy;Host_Port_Host_to_DSP中断
_vector14:        VEC_ENTRY _vec_dummy;Timer0中断
_vector15:        VEC_ENTRY _vec_dummy;Timer1中断
3. 在C程序中指定定义的中断向量表,并且启用CPU中断功能
在C程序中,用CSL的IRQ模块来设置中断比较方便,在设置之前,需要外部链接上面的asm程序的中断向量表符号:
extern far void vectors();//之所以为vectors,因为C编译器编译后自动改名其为_vectors
引用了中断向量表之后,就可以设置中断了:
        IRQ_setVecs(vectors); //指向asm中定义的中断向量表
        IRQ_nmiEnable();
        IRQ_globalEnable();
        IRQ_map(IRQ_EVT_EDMAINT, 8);        //映射事件到指定的物理中断号
        IRQ_reset(IRQ_EVT_EDMAINT);
4.启动中断源,如venc中断
至此,中断服务例程c_int14_vencint    就可以为venc中断服务了,其它硬件中断向量的配置同理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值