打印

求助5402定时器问题

[复制链接]
1781|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
soiso|  楼主 | 2008-5-7 21:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了个测试定时器中断的程序,但是发现进不了中断,IFR位可以清0但是就是无法写入值,很奇怪 大家能帮我看看吗,谢谢拉

            .title "main.asm"
            .mmregs
            .def  _c_int00 ;程序入口
            .ref _TINT0_ISR ;Timer0中断服务程序

STACK  .usect   "STACK",10H ;分配堆栈空间 

                  ;设定定时器0控制寄存器的内容
K_TCR_SOFT  .set  0B<<11 ;TCR第11位soft=0
K_TCR_FREE  .set  0B<<10 ;TCR第10位free=0

K_IPTR .set 0080h ;指向0080H,默认是FF80 
K_TCR_PSC   .set  0B<<6   ;TCR第9-6位,可设TDDR一样,也可不设自动加载
K_TCR_TRB   .set  1B<<5   ;TCR第5位TRB=1此位置1,PSC会自动加载的
K_TCR_TSS   .set  0B<<4   ;TCR第4位TSS=0
K_TCR_TDDR  .set  1001B<<0 ;TCR第3-0位TDDR=1001B
K_TCR    .set  K_TCR_SOFT|K_TCR_FREE|K_TCR_PSC|K_TCR_TRB|K_TCR_TSS|K_TCR_TDDR
K_TCR_STOP  .set  1B<<4   ;TSS=1时计数器停止
PERIOD .set 9999 ;定义计数周期
        .data

XF_Flag .word 1 ;当前XF的电平标志,如果XF_Flag=1,则XF=1

;================================================
;主程序:
;================================================
            .text
_c_int00:
            STM #STACK+10H,SP ;设堆栈指针SP
            LD #0,DP ;设数据地址DP
            STM #XF_Flag,AR2 ;AR指向XF标志

            ;改变中断向量表位置
            LDM PMST,A
            AND #7FH,A ;保留低7位,清掉高位
            OR #K_IPTR,A 
            STLM A,PMST
*f=50MHz,定时2ms时:
*根据定时器长度计算公式:Tt=T*(1+TDDR)*(1+PRD)
*给定TDDR=9,PRD=9999,CLKOUT主频f=40MHz,T=25ns
*Tt=20ns*(1+9)*(1+9999)=2000us=2ms
*f=100Mhz,定时最大是:10ns*2^4*2^16=10ms,
            
            STM    #0FFFFh,IFR
            NOP
            NOP
            NOP
            
            SSBX   INTM
            STM #0080h,IFR ;清除挂起的中断
            NOP
            NOP
            stm #0008h,IMR ;允许Timer0中断
            NOP
            STM #K_TCR_STOP,TCR ;停止计数器0
            STM #PERIOD,TIM 
                 STM #PERIOD,PRD ;设定计数周期
            STM #K_TCR,TCR ;开始Timer0
            NOP
            NOP
            rsbx intm ;开中断
            
end:        nop
    B end 

相关帖子

沙发
soiso|  楼主 | 2008-5-7 21:32 | 只看该作者

CMD文件

/*init_timer.obj
 INIT54.obj*/
vectors.obj
maintest.obj
isr.obj

-m hpi.map
-o hpi.out

MEMORY
{
   PAGE 0:  VECS:     origin =0080h, length = 0080h  /* Internal Program RAM */
            PRAM:     origin = 1080h, length = 1000h  /* Internal Program RAM */

   PAGE 1: SCRATCH:  origin = 0060h, length = 0020h  
        DATA:   origin = 3000h,length=0080h                          
STACK:    origin = 3100h, length = 0500h           
  EXRAM:    origin = 3600h, length = 0900h  }
SECTIONS
{
   .cinit    > PRAM  PAGE 0
   .text     > PRAM  PAGE 0
   .vectors  > VECS  PAGE 0 
   .stack    > STACK PAGE 1
   .trap     > SCRATCH PAGE 1
   .const    > EXRAM PAGE 1
   .data     > EXRAM PAGE 1
   .bss      > EXRAM PAGE 1
   .cio      > EXRAM PAGE 1
   .switch   > EXRAM PAGE 1
}

使用特权

评论回复
板凳
soiso|  楼主 | 2008-5-7 21:33 | 只看该作者

中断向量表

     .mmregs
    
    .ref  _c_int00  
   ; .global _init_54
    ;.global _HPI_ISR
    .ref  _TINT0_ISR
    ;.global _flag

;result  .set 0062h
;num1    .set 0060h 
;num2    .set 0061h
    .sect ".vectors"
    .align 0x80
    

RESET:  B   _c_int00 
        STM #200,SP
                   NOP
nmi:    RETE
                  NOP
                  NOP

; software interrupts
sint17 .space 4*16
sint18 .space 4*16
sint19 .space 4*16
sint20 .space 4*16
sint21 .space 4*16
sint22 .space 4*16
sint23 .space 4*16
sint24 .space 4*16
sint25 .space 4*16
sint26 .space 4*16
sint27 .space 4*16
sint28 .space 4*16
sint29 .space 4*16
sint30 .space 4*16

int0:   RETE
                NOP
                NOP
int1:   RETE
                NOP
                NOP
int2:   RETE
                NOP
                NOP
tint0: RETE
                NOP                 
                NOP   
brint0: RETE       
                NOP
                NOP
bxint0: RETE
                NOP         
                NOP
DMAC0:  RETE
                NOP
                NOP
TINT1:   B   _TINT0_ISR
                NOP
                NOP
INT3:   RETE
                NOP
                NOP
HPINT:  RETE
                NOP
                NOP 
brint1: RETE          
                NOP         
                NOP
bxint1: RETE
                NOP             
                NOP
DMAC4:  RETE
                NOP
                NOP
DMAC5:  RETE
                NOP
                NOP
                .END
        

使用特权

评论回复
地板
hotpower| | 2008-5-7 21:38 | 只看该作者

不知道是PMST还是CMD文件的问题~~~

使用特权

评论回复
5
soiso|  楼主 | 2008-5-7 21:48 | 只看该作者

谢谢楼上

PMST指向的中断向量表单步调试时看地址是正确的,CMD用的也都是片上的地址啊,而且这个程序就是控制一下XF,也没有什么算法一说,占的空间应该很少啊,要是越界的话就无法load进去了把,我现在是load可以进去,但是运行一直就在主循环的循环中,无法进到中断去

使用特权

评论回复
6
hotpower| | 2008-5-7 21:55 | 只看该作者

实际有个简单的揪错方法~~~---在中断向量表的底部设断点

还有随便搞个外部中断,将引脚接地.
若不外部中断,则肯定程序没跳入中断向量表的范围内.

一般都是PMST的错.

再着看看IMR等

使用特权

评论回复
7
soiso|  楼主 | 2008-5-7 22:05 | 只看该作者

回楼上

谢谢你的方法,我板子做好了,外部没有引脚了,您说的方法我怎么试呢

还有就是我发现的问题是IMR值是对的,但是IFR我清零后明明写入的是0008H,可是就是写不进去,一直是0000,中断无法进入是不是这个原因呢?
可是除了赋值以外还怎么改变IFR啊,请指教

使用特权

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

本版积分规则

18

主题

41

帖子

0

粉丝