首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]TI2407电机控制例程进不了中断!

[求助]TI2407电机控制例程进不了中断!

2407中断求助!实在没办法了!

求助!TI例程进不了中断!


大家好!
我是DSP初学者,想用TI例程在线调试控制电机,结果程序始终在主循环里跑,进不了定时器下溢中断,不知道是现场保护还是CMD原因(据说在线调试时要把中断向量烧到flash中,不知如何操作?),望各位老师和高手不吝指导!万分感谢!
下面是部分程序
    .INCLUDE "f2407.H"
         .global _c_int0
         .global _C_INT2
;-----------------------以下定义变量和常数-------------------------------------------------------------
               .DATA  
       .
       .                 
;------------------------------------CONTEXT段,定义保护现场数据区;-----------            
ST0_SAVE  .USECT ".CONTEXT",1   ;状态寄存器ST0保存单元
ST1_SAVE  .USECT ".CONTEXT",1   ;状态寄存器ST1保存单元
ACCH      .USECT ".EXTCONT",1     ;ACC高字保存单元
ACCL      .USECT ".EXTCONT",1     ;ACC低字保存单元
AR0_SAVE  .USECT ".EXTCONT",1  ;AR0保存单元
P_HI      .USECT ".EXTCONT",1       寄存器高字保存单元
P_LO      .USECT ".EXTCONT",1      寄存器低字保存单元
T_SAVE    .USECT ".EXTCONT",1    ;T保存单元      

;-------------------------------------- 定义主向量段--------------------------------------------------
        .SECT  ".VECTORS"              ;定义主向量段
        ;.def  _c_int0
RESET  B  _c_int0        ;地址0000H,复位,优先级1
INT1   B  HANTOM        ;地址0002H,INT1,优先级4
INT2   B  _C_INT2       ;地址0004H,INT2,优先级5
INT6   B  HANTOM        ;地址000CH,INT6,优先级9

..
RESERVED  B  HANTOM                ;地址000EH,测试,优先级10
SW_INT8   B  HANTOM                ;地址0010H,自定义软中断
..
SW_INT15  B  HANTOM                ;地址001EH,自定义软中断
SW_INT16  B  HANTOM                ;地址0020H,自定义软中断
TRAP          B  HANTOM                ;地址0022H,TRAP矢量
NMI                    B  HANTOM                ;地址0024H,NMI,优先级3
EMU_TRAP  B  PHANTOM                ;地址0026H,仿真Trap,优先级2
SW_INT20  B  PHANTOM                ;地址0028H,自定义软中断

SW_INT31  B  PHANTOM                ;地址003EH,自定义软中断
;-------------------------------------- 定义子向量段------------------------------------------------------
        .SECT  ".PVECS"             ;定义子向量段
PVECTORS        B        PHANTOM                        ;偏移地址0000H
                        B        PHANTOM                  ;偏移地址0001H
                        B        PHANTOM                        ;偏移地址0002H
                           .
                             .
                        B        PHANTOM                        ;偏移地址0027H
                        B        PHANTOM                        ;偏移地址0028H
                        B        T1UF_ISR                        ;偏移地址0029H
                        B        PHANTOM                        ;偏移地址002AH
                .
                .
         .TEXT
_c_int0:
;-----------------------系统初始化程序-----------------------------------------------------------------------------
         SETC       INTM              ; 禁止中断
         CLRC       CNF               ; B0
         SETC       OVM
         SPM        0
         SETC       SXM               ;扩展符号
         LAR        AR0,#DEC_MS       ;传送逆阵数据
         LAR        AR1,#(24-1)       ; 24个
         LACC       #ANGLES_          ; 指向源
         LARP       AR0
INIT_TBL  
         TBLR       *+,AR1                 ;下一个
         ADD        #1                   ;下一个地址
         BANZ       INIT_TBL,AR0          ;AR1=0结束
         LAR        AR4,#079H            ;用于堆栈保存现场,B2(60H-80H)
         LDP        #0E0H
         SPLK       #068H, WDCR         ;不用看门狗
         SPLK       #02FCH,SCSR1       ;CLKIN 15 MHZ,CLKOUT 30MHZ
         SPLK       #003BH,SCSR2       ;添加的语句,用于烧写程序
         LDP        #0E1H
         SPLK       #0E00H,ADCTRL1     ;ADC预分频10,1MHZ
         SPLK       #0001H,MAXCONV     ;两个通道
         SPLK       #07000H,CHSELSEQ2   ;选择ADCIN7和ADCIN14通道
         SPLK       #0E00H,CHSELSEQ4
         LACC       MCRA
         OR         #0FD8H             ;设置PWM1-6,QEP1-2
         SACL       MCRA


紧接上帖:

;-----------------------中断初始化--------------------------------------------------------------------
         LDP       #0E8H
         SPLK      #0FFFH,EVAIFRA     ;清事件管理器A所有中断标志
         SPLK      #000FH,EVAIFRB
         SPLK      #000FH,EVAIFRC
         SPLK      #0200H,EVAIMRA     ;开T1下溢中断
      SPLK      #0000H,EVAIMRB     ;屏蔽定时器2所有中断
      SPLK      #0000H,EVAIMRC     ;屏蔽捕获寄存器1、2、3中断
      LDP       #0H
         LACC      #0FFH
         SACL      IFR                  ;清所有系统中断标志
      LACC      #0000010B
         SACL      IMR                 ;开INT2中断
      CLRC      INTM                ;开总中断
               
;-----------------------I/O初始化------------------------------------------------------
         LACL        BDATDIR
                 .
;-----------------------事件管理器A初始化-------------------------------------------------------------------
        LDP       #0E8H
         SPLK      #0666H,ACTRA       ;引脚PWM1,3,5高有效,2,4,6低有效
         SPLK      #300,CMPR2
         SPLK      #300,CMPR1         
        

    SPLK      #300,CMPR3
         SPLK      #08F4H,DBTCONA     ;死区时间1.07*4=4.28us
         SPLK      #8200H,COMCONA    ;定时器下溢比较器重载,允许比较
         SPLK      #PWMPRD,T1PR     ;周期寄存器值1500(PWM周期为100us)
         SPLK      #0,T1CNT
         SPLK      #08840H,T1CON;连续增减,预分频为1,使能T1          

   SPLK      #0000H,T2CNT        ;编码脉冲计数器
         SPLK      #0FFFFH,T2PR
         SPLK      #9870H,T2CON        ;定向增减,允许编码接口 

;----------------------初始化结束-------------------------------------------------------------------

MAIN
                      NOP
            
             B     MAIN  ; 主循环,定时器1下溢时跳出主循环进入T1下溢中断子程序
;--------------------------------------假中断处理----------------------------------------------------------
PHANTOM   
         CLRC     INTM                        ;开中断
         RET

;-----------------------T1下溢中断处理子程序-----------------------------------------------------
_C_INT2:
;-----------------------保存现场--------------------------------------------------------------------

      
        SST          #0,ST0_SAVE
        SST          #1,ST1_SAVE
        LDP   #5
        SACH  ACCH                                   ; 保存ACC高位
        SACL  ACCL                 
        SPH   _HI
        SPL   _LO                    ; 保存 P
        MPY   #1                      ; P<=T
        SPL   T_SAVE                 ; 保存 T
        SAR   AR0, AR0_SAVE          ; 保存AR0
        LDP   #0E0H  
        LACC  IVR                  ;读偏移地址  IVR为外设中断寄存器
        SUB   #029H                  ; T1 下溢中断?
        CC  T1UF_ISR, EQ           ;是下溢中断跳T1UF_ISR
                                                                                                   ;EQ为ACC=0,当EQ=0时条件满足跳到T1UF_ISR
REST      
                LDP   #5                     ;否则恢复现场
        LAR   AR0, AR0_SAVE          ; 恢复AR0
        LT    P_LO                     ;恢复P
        MPY   #1  
        LPH   _HI  
        LT    T_SAVE                  ;恢复T
        LACC  ACCH,16
        ADDS  ACCL                  ;恢复ACC
        LDP   #0                      ;指向B2
        LST   #ST1, ST1_SAVE           ; 恢复ST1
        LST   #ST0, ST0_SAVE           ; 恢复ST0
        CLRC  INTM                   ; 开中断
        RET                          ; 返回
T1UF_ISR
   LDP        #0E8H
        SPLK       #0200H,EVAIFRA
  ..

CMD文件:
-stack 40

MEMORY
{
PAGE 0:                                        /*程序空间*/                          
        VECS:        ORIGIN=00000H,LENGTH=00040H          /*中断向量存贮空间*/
        VECS:        ORIGIN=00044H,LENGTH=00100H        /*外围中断向量*/
        /*PM: ORIGIN=0150H,LENGTH=070ffH        /*片内FLASH存储空间*/  
        M: ORIGIN=08000H,LENGTH=07ffH        /*片内SDRAM存储空间*/

PAGE 1:                                                /*数据空间*/
REGS:        ORIGIN=0H,LENGTH=60H        /*存储器映射的寄存器和保留地址*/
BLK_B2:   ORIGIN=60H,LENGTH=20H                /*块B2*/
BLK_B0:         ORIGIN=200H,LENGTH=100H        /*块B0,如果CNF=0,则分配为片内ARAM*/
BLK_B1:          ORIGIN=300H,LENGTH=100H        /*块B1*/
SARAM_D: ORIGIN=800H,LENGTH=800H        /*如果正确培植SCSR2寄存器,则此为数据空间中的2K SARAM*/
PERIPH:  ORIGIN=7000H,LENGTH=1000H        /*外围寄存器空间*/
EX2_DM:  ORIGIN=8000H,LENGTH=8000H        /*外围数据RAM*/
PAGE 2:                                                /*I/O存储空间*/
IO_EX:  ORIGIN=0000H,LENGTH=0FFF0H        /*外部的I/O映射空间*/
IO_IN:   ORIGIN=0FFF0H,LENGTH=0FH        /*片内的I/O映射空间*/
}

SECTIONS
{
        .reset:                { }>VECS        AGE 0        /*中断向量表*/
        .vectors:        { }>VECS        AGE 0
        .pvecs:                { }>PVECS        PAGE 0
        .text:                { }>PM                PAGE 0
/*        .bss:                { }>BLK_B2        PAGE 1        */
        .data0:                { }>BLK_B1        PAGE 1
}

我在在线调试过程中通过更改PC值单步运行来找问题,发现:
1).在应用当前这种现场保护程序时,在假中断RET语句(PC地址0x8087)再往下执行一步应该进入_c_int0(PC地址0x8088),可是却进入了地址0x1E7,跑到flash中去了.
2).在中断返回时执行到语句RET(地址80A5H),再往下执行1步就进入了地址0x1541中.而没有正确返回!
   我晕了,是不是现场保护有问题??怎么改呢?
[em06]
返回列表