TMS320LF2407无法进入周期中断 求解~

2019-08-08 17:36发布

仿真时,EVAIFRA显示有下溢中断和周期中断,IFR显示有INT2中断,但无法执行中断程序 void interrupt c_int2()。求高人指点~
主程序:
#include "GLOBAL.C"
void         SystemInit();
void         KickDog();
unsigned int num=0;
main()
{  
        SystemInit();                  /*系统初始化*/
    MCRA=MCRA & 0xFDFF;
    MCRC=MCRC & 0xFDFF;
        PFDATDIR=0x0200;//驱动芯片使能
        PBDATDIR=0x0200;//输出IOPB1控制led闪烁
        asm(" CLRC        INTM ");
        EVAIMRA=0x0080;//使能周期中断
        EVAIFRA=0xFFFF;//清楚中断标志
        GPTCONA=0x0000;
        T1PR=1000;
        T1CNT=0;
        T1CON=0xd446;

        while(1)
        {
                if(num>1000)
                        PBDATDIR=0x0202;//输出高电平led亮
                if(num>2000)
                {
                        num=0;
                        PBDATDIR=0x0200;//输出低电平led灭
                }
        }
}

void SystemInit()
{  

        asm(" SETC        INTM ");        /* 关闭总中断 */
        asm(" CLRC  SXM  ");        /* 禁止符号位扩展 */
        asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
        asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
        SCSR1=0x02FC;                 /* 系统时钟CLKOUT=20*2=40M */
                                                        /* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
        WDCR=0x006F;                        /* 禁止看门狗,看门狗时钟64分频 */
        KickDog();                            /* 初始化看门狗 */  
    IFR=0xFFFF;                                /* 清除中断标志 */
    IMR=0x0002;                                /* 打开中断2*/      
}  

void interrupt c_int2()
{
        T1CNT=0;
        num++;
        EVAIFRA=0x0080;
        asm(" CLRC        INTM ");
}

void KickDog()                                /*踢除看门狗 */
{
        WDKEY=0x5555;
        WDKEY=0xAAAA;
}

CMD文件:(由于使用的开发板无外扩RAM,程序和数据均放在片内SARAM上,不知是否对中断有影响)
MEMORY
{
       PAGE 0: VECS: origin = 0x8000,  length 0x040
       PAGE 0: PROG: origin = 0x8060,  length 0x700
       PAGE 1: B0  : origin = 0x200,   length 0x100
       PAGE 1: B1  : origin = 0x300,   length 0x100
       PAGE 1: B2  : origin = 0x060,   length 0x020
       PAGE 1: DATA: origin = 0x0F60,  length 0x0A0
}

SECTIONS
{
       .vectors  : {}  >VECS PAGE 0                 /* 中断向量表 */
       .text     : {}  >PROG PAGE 0         /* 可执行代码和字符串 */
       .cinit    : {}  >PROG PAGE 0
       .data     : {}  >DATA PAGE 1        /* 初始化变量和常数表 */
       .bss      : {}  >DATA PAGE 1                        /* 保留全局变量和静态变量空间 */
       .const    : {}  >PROG PAGE 0                        /* 字符串和switch表 */   
           .switch   : {}  >PROG PAGE 0         /* 包含.switch语句建立的表格 */
       .stack         : {}  >DATA PAGE 1         /* 为系统堆栈分配存储器 */
       .system   : {}  >DATA PAGE 1                        /* 为动态存储器函数分配存储器空间 */

}

ASM文件:
;define.asm

            .include  "lf2407a.h"  
            .include  "F2407REGS.H"

                        .global _c_int0,_c_int1,_c_int2   
                        .global        _IMR,_IFR
                        .global        _SCSR1,_SCSR2,_XINT1CR,_XINT2CR
                        .global _WDCNTR,_WDKEY,_WDCR
                        .global _MCRA,_MCRB,_MCRC,_PADATDIR,_PBDATDIR,_PCDATDIR,_PEDATDIR,_PFDATDIR
                        .global _ADCTRL1,_ADCTRL2,_MAXCONV,_CHSELSEQ1,_CHSELSEQ2,_CHSELSEQ3,_CHSELSEQ4
                        .global _AUTO_SEQ_SR,_RESULT0,_RESULT1,_RESULT2,_RESULT8,_RESULT9
                        .global _CANMDER,_CANTCR,_CANRCR,_CANMCR,_CANBCR2,_CANBCR1,_CANESR,_CANGSR
                        .global _CANCEC,_CANIFR,_CANIMR,_CANLAM0H,_CANLAM0L
                        .global _CANID0L,_CANID0H,_CANCTRL0,_CANBX0A,_CANBX0B,_CANBX0C,_CANBX0D
                        .global _CANID1L,_CANID1H,_CANCTRL1,_CANBX1A,_CANBX1B,_CANBX1C,_CANBX1D
                        .global _CANID2L,_CANID2H,_CANCTRL2,_CANBX2A,_CANBX2B,_CANBX2C,_CANBX2D
                        .global _CANID3L,_CANID3H,_CANCTRL3,_CANBX3A,_CANBX3B,_CANBX3C,_CANBX3D
                        .global _CANID4L,_CANID4H,_CANCTRL4,_CANBX4A,_CANBX4B,_CANBX4C,_CANBX4D
                        .global _CANID5L,_CANID5H,_CANCTRL5,_CANBX5A,_CANBX5B,_CANBX5C,_CANBX5D
                        .global _SCICCR,_SCICTL1,_SCIHBAUD,_SCILBAUD,_SCICTL2,_SCIRXST,_SCIRXEMU,_SCIRXBUF,_SCITXBUF,_SCIPRI;
                        .global _GPTCONA,_T1CNT,_T1PR,_T1CON,_T2CNT,_T2PR,_T2CON
                        .global        _EVAIMRA,_EVAIMRB,_EVAIFRA,_EVAIFRB,_PIVR
                        .global _GPTCONB,_T3CNT,_T3CMPR,_T3PR,_T3CON,_COMCONA,_ACTRA,_DBTCONA,_CMPR1,_EVBIMRA,_EVBIFRA
            .global _WSGR            


;建立中断向量表           
            .sect     ".vectors"            
RSVECT      B            _c_int0
INT1             B                PHANTOM
INT2             B       _c_int2
INT3        B       PHANTOM
INT4                B                PHANTOM
INT5        B                PHANTOM
INT6                B       PHANTOM
;中断子向量入口定义  

            .text                 

PHANTOM:
                    KICK_DOG
                        RET       
                                                       
                        .end



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
Sunndy
1楼-- · 2019-08-08 21:07
 精彩回答 2  元偷偷看……
zhangmangui
2楼-- · 2019-08-09 03:06
Sunndy 发表于 2013-10-10 09:58
ok 自己先顶一下。经过查阅资料,DSP复位或中断时会从0x0000~0x003F开始执行程序,但我使用的是内部RAM进行 ...

你把中断函数地址指定到相应的中断寄存器上再看看
Sunndy
3楼-- · 2019-08-09 03:41
zhangmangui 发表于 2013-10-11 09:16
你把中断函数地址指定到相应的中断寄存器上再看看

不知道怎样操作啊
Sunndy
4楼-- · 2019-08-09 06:49
由于未找到int.out文件,在线调试时遇到中断无法转移到相应的c_int2()处执行,造成了假中断向量,程序会跳转到main()执行,所以无法得到想要的结果,如果不追求在线调试结果,仅仅是学习中断的话,建议直接固化程序到flash,然后通过led看中断效果。
wowo1
5楼-- · 2019-08-09 07:54
这个倒是一个不错的
zhangmangui
6楼-- · 2019-08-09 08:39
 精彩回答 2  元偷偷看……

一周热门 更多>