打印

DM642的中断问题

[复制链接]
1378|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
msjjf|  楼主 | 2014-3-7 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhangmangui| | 2014-3-8 00:15 | 只看该作者
用的是CSL库吧   
在非DSP/BIOS中使用CSL API进行设置如下(参考内容2中提到,在DSP/BIOS设置更简洁):
1. 编写中断服务例程
在.c源文件中编写ISR函数c_intXX,用于中断处理,如:
interrupt void c_intXX (void)
{
           …;
}
注:对于硬件中断而言,XX = 00~15。

2.初始化中断向量表,并在内存段中的中断向量表中配置好对应的中断向量
           首先是把中断向量表定位到某一内存段中,我们可以在cmd文件中配置中断向量表的内存映射,如:
MEMORY
{
           VECTORS:         org = 00000000h,       len = 00000400h
           L2SRAM:            org = 00000400h,       len = 00100000h
           SDRAM:             org = 80000000h,       len = 10000000h
}

SECTIONS
{
           .vecs                  :>            VECTORS
           .data                  :>            L2SRAM
           .text                   :>            L2SRAM
           .switch               :>            L2SRAM
           .stack                 :>            L2SRAM
           .bss                    :>            L2SRAM
           .cinit                   :>            L2SRAM
           .far                     :>            L2SRAM
           .cio                     :>            L2SRAM
           .const                 :>            L2SRAM
           .sysmem             :>            SDRAM
           .tables                :>            L2SRAM
}
      
            然后建立一个.asm文件,用以配置中断向量表中的中断向量,我们需要声明一些全局变量,以便其他源文件可以引用这些变量或者引用其他源文件的变量,如:
    .global _vectors     
       .global _c_int00     
       .global _vector1  
       .global _vector2
       .global _vector3
       .global _vector4
       .global _vector5
       .global _vector6
       .global _vector7
       .global _c_int08      ; 对应main()函数的c_int08中断服务例程(假设处理的是EDMA中断)
       .global _vector9         
       .global _vector10
       .global _vector11   
       .global _vector12  
       .global _vector13   
       .global _vector14   
       .global _vector15   
              
         因为引用了rts的_c_int00中断,即RESET中断,因此需要引入这个符号:
   .ref      _c_int00
      
为了把中断服务例程的地址,即中断向量插入到中断向量表中,可以定义一个宏:
VEC_ENTRY .macro addr
        STW       B0,*--B15
        MVKL      addr,B0
        MVKH      addr,B0
        B         B0
        LDW       *B15++,B0
        NOP       2
        NOP   
        NOP   
.endm         
           
       为了初始化中断向量表中的中断向量,可以定义一个虚拟的中断向量:
_vec_dummy:
      B        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.启动中断源,如EDMA控制器的中断
至此,中断服务例程c_int8就可以为EDMAINT中断服务了,其它硬件中断向量的配置同理。

5 .实际上述流程定义描述DM642中断的向量表文件,是使用TI公司提供的一个中断向量表文件模板:ves_dm642.asm。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
msjjf + 1 很给力!
板凳
zhangmangui| | 2014-5-27 23:33 | 只看该作者
楼主有时间给大家多多分享和讲解一下DM642方面资料

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

19

帖子

1

粉丝