打印

st7定时器使用

[复制链接]
2774|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
BLUERGREEN|  楼主 | 2008-9-6 08:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用的是ST7FLITE05YOM6的芯片,在使用LITE定时器的过程中,出现问题。源程序代码如下,主要实现的功能是一秒钟延时。请问一下各位这个源代码为什么不能够运行,谢谢!
st7/
    ;------------------------------------------------------
    ; SEGMENT MAPPING FILE AUTOMATICALLY GENERATED BY STVD7
    ; SHOULD NOT BE MANUALLY MODIFIED.
    ; CHANGES WILL BE LOST WHEN FILE IS REGENERATED.
    ;------------------------------------------------------
    TITLE "KF85.ASM"
    MOTOROLA
    #INCLUDE "st7flite05.inc"
    
    BYTES            ; The following addresses are 8 bits long
    segment byte at 80-FF 'ram0'
MMSH   DS.B $1
MMSL   DS.B $1
    
    WORDS            ; The following addresses are 16 bits long
    segment byte at FA00-FFDF 'rom'
MAIN:
    LD A,#0
    LD PBDDR,A
    LD PBOR,A
    LD A,#$0F
    LD PADDR,A
    LD PAOR,A
    CLR PBDR
    CLR PADR
    BSET PADR,#3
  BSET PADR,#2
    LD A,#0
    LD MMSH,A
    LD MMSL,A
    LD A,2
LOOP:
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    DEC A
    JRNE LOOP
    BRES PADR,#3
    NOP
    NOP
    NOP
    NOP
    BRES PADR,#2
    ;JP MAIN
  LD A,#$10
  LD LTCSR,A
    RIM
LOOP1  HALT
    
TBINT:
         LD A,LTCSR
    LD A,#3
    CP A,MMSH
    JRNE L2
L1:
         LD A,MMSL
    CP A,#$0E7
    JRUGE L5
L2:
         INC MMSL
    JRNE L4
    INC MMSH
    JRA L4
L5:
         BRES PADR,#3
    BRES PADR,#2
L4:
  IRET
    
    
NonHandledInterrupt
  iret
    
    WORDS            ; The following addresses are 16 bits long
    segment byte at FFE0-FFFF 'vectit'
                DC.W    NonHandledInterrupt ;FFE0-FFE1h location
                DC.W    NonHandledInterrupt ;FFE2-FFE3h location
                DC.W    TBINT ;FFE4-FFE5h location
                DC.W    NonHandledInterrupt ;FFE6-FFE7h location
                DC.W    NonHandledInterrupt ;FFE8-FFE9h location  
                DC.W    NonHandledInterrupt ;FFEA-FFEBh location  
                DC.W    NonHandledInterrupt ;FFEC-FFEDh location 
                DC.W    NonHandledInterrupt ;FFEE-FFEFh location
                DC.W    NonHandledInterrupt ;FFF0-FFF1h location 
                DC.W    NonHandledInterrupt ;FFF2-FFF3h location  
                DC.W    NonHandledInterrupt ;FFF4-FFF5h location  
                DC.W    NonHandledInterrupt ;FFF6-FFF7h location  
                DC.W    NonHandledInterrupt ;FFF8-FFF9h location 
                DC.W    NonHandledInterrupt ;FFFA-FFFBh location 
                DC.W    NonHandledInterrupt ;FFFC-FFFDh location 
                                DC.W    MAIN                ;reset
        END
沙发
BLUERGREEN|  楼主 | 2008-9-6 08:35 | 只看该作者

中断向量表中地址映射

还有一个问题是,定时器定时,应该使用的是定时中断才对,但是为什么中断向量表中,其地址是FFE4-FFE5(LITE定时器输入捕获中断)呢,我查了一下书籍应该是FFE2-FFE3,因为它是LITE定时器RTC中断。

使用特权

评论回复
板凳
grant_jx| | 2008-9-8 02:40 | 只看该作者

没仔细看你的工程

  LD LTCSR,A

这里你初始化的是LT TB定时器,你将Timebase打开。中断向量FFE4h-FFE5h对应的中断是LITE TIMER RTC Interrupt中断,没有错。地址FFE2h-FFE3h对应的是SPI。ST7LITE0x datasheet Rev5 Oct 2006。


使用特权

评论回复
地板
bluergreen| | 2008-9-8 09:55 | 只看该作者

Timebase怎么打开

中断向量FFE4h-FFE5h对应的中断是LITE TIMER RTC Interrupt中断,这个我证实了是正确的。但是我想问一下grant_jx怎么去打开Timebase呢?谢谢!

使用特权

评论回复
5
grant_jx| | 2008-9-9 01:18 | 只看该作者

你的代码是可以打开TB的

正常情况下:
1、通过OSC,计算你需要配置的TB时间周期,也就是LTCSR.TB ,第5位;
2、打开LTCSR.TBIE,第四位,中断允许位;
3、开全局中断;

在中断服务程序中,记得退出中断前一定要读一次LTCSR,以便清除LTCSR.TBF,TB中断标准位。否则你的中断将无法正确退出。



需要提醒的是,你的代码中使用了HALT指令,这条指令没问题,只是需要注意什么中断源才能将MCU唤醒。


我将你的代码copy到STVD下做了一个工程,使用indart的IDB-ST7FLITE0开发板,测试MCU使用ST7FLite09Y0B6,确认TB中断是可以重复进入的。至于定时时间没关心,时间太晚了,明天还要出差。

看下图,A读取的值。










使用特权

评论回复
6
BLUERGREEN|  楼主 | 2008-9-9 14:21 | 只看该作者

我调试过了,可以运行中断,但是实现不了功能。

st7/
    ;------------------------------------------------------
    ; SEGMENT MAPPING FILE AUTOMATICALLY GENERATED BY STVD7
    ; SHOULD NOT BE MANUALLY MODIFIED.
    ; CHANGES WILL BE LOST WHEN FILE IS REGENERATED.
    ;------------------------------------------------------
    TITLE "KF85.ASM"
    MOTOROLA
    #INCLUDE "st7flite05.inc"
    
    BYTES            ; The following addresses are 8 bits long
    segment byte at 80-FF 'ram0'
MMSH   DS.B $1
MMSL   DS.B $1
    
    WORDS            ; The following addresses are 16 bits long
    segment byte at FA00-FFDF 'rom'
MAIN:
    LD A,#0
    LD PBDDR,A
    LD PBOR,A
    LD A,#$0F
    LD PADDR,A
    LD PAOR,A
    CLR PADR
    CLR PBDR    
    BSET PADR,#2
  ;BRES PADR,#2
    LD A,#0
    LD MMSH,A
    LD MMSL,A
    LD A,#$10
  LD LTCSR,A
    LD Y,#255
    ;BRES PADR,#3
    RIM
  JRA *
TBINT:
  
  LD A,LTCSR
    LD A,#3
    CP A,MMSH      ;MMSHMMSL=1000*1ms=1秒=11E7,即MMSH=11,MMSL=E7
    JRULE L2
L1:
  LD A,MMSL
    CP A,#$0E7
    JRUGE L5      ;这里怎么调试都无法跳转到L5,我感觉到很奇怪
L2:
  INC MMSL
    CP Y,MMSL
    JRUGT L6
    JRA L4
L6:
  INC MMSH
  CLR MMSL
    JRA L4
L5:
  LD A,#0
    LD MMSL,A
    LD MMSH,A
    BSET PADR,#3   ;PA3接指示灯,用来调试程序有无运行,但是怎么调试PA3的灯都不亮
  L4:    
  IRET
NonHandledInterrupt
  iret
    
    WORDS            ; The following addresses are 16 bits long
    segment byte at FFE0-FFFF 'vectit'
                DC.W    NonHandledInterrupt ;FFE0-FFE1h location
                DC.W    NonHandledInterrupt ;FFE2-FFE3h location
                DC.W    TBINT ;FFE4-FFE5h location
                DC.W    NonHandledInterrupt ;FFE6-FFE7h location
                DC.W    NonHandledInterrupt ;FFE8-FFE9h location  
                DC.W    NonHandledInterrupt ;FFEA-FFEBh location  
                DC.W    NonHandledInterrupt ;FFEC-FFEDh location 
                DC.W    NonHandledInterrupt ;FFEE-FFEFh location
                DC.W    NonHandledInterrupt ;FFF0-FFF1h location 
                DC.W    NonHandledInterrupt ;FFF2-FFF3h location  
                DC.W    NonHandledInterrupt ;FFF4-FFF5h location  
                DC.W    NonHandledInterrupt ;FFF6-FFF7h location  
                DC.W    NonHandledInterrupt ;FFF8-FFF9h location 
                DC.W    NonHandledInterrupt ;FFFA-FFFBh location 
                DC.W    NonHandledInterrupt ;FFFC-FFFDh location 
                                DC.W    MAIN                ;reset
        END
还有一个我对JRNE老是搞不懂,我觉得很奇怪,请解释一下其中的用法,谢谢

使用特权

评论回复
7
grant_jx| | 2008-9-9 23:16 | 只看该作者

上面你只说中断不能进,我没看你的代码逻辑

只是测过你的中断是否执行。
中断是可以正进入的,你应该查查你的定时时间计算的流程逻辑。这么简单的几句,跟着单步一遍很快能找到问题。我很愿意引导我的客户自己学会解决问题,而不愿纯粹只是做个保姆。

建议:
问题既然出在 JRUGE L5 
你就看看什么条件会执行L1,当MMSL满足什么条件要去执行清零动作?当等于的时候去跳转,JRUGE会影响到什么标准?JRUGE尽是C=0,JRUGT 是C+Z=0
 
    LD A,LTCSR
    LD A,#3
    CP A,MMSH      ;MMSHMMSL=1000*1ms=1秒=11E7,即MMSH=11,MMSL=E7
    JRULE L2
L1:
  LD A,MMSL
    CP A,#$0E7
    JRUGE L5      ;这里怎么调试都无法跳转到L5,我感觉到很奇怪



JP的几条指令:
JREC   等于
JRNE   不等于
JRULT  [小于] 或者 [大于或等于]  
JRUGT  [大于] 或者 [小于或等于]


对于ST7汇编指令集请参考:ST7 Family Programming Manual

在http://www.stmcu.com可以下载

使用特权

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

本版积分规则

22

主题

56

帖子

0

粉丝