定时器中断产生方波源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
①fangbo.asm。利用定时器Timer0在XF脚产生周期1s的的方波
.title "fangbo.asm"
.mmregs
.def CodeStart ;程序入口
.def 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_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时计数器停止
.data
DATA_DP:
XF_Flag: .word 1 ;当前XF的输出电平标志,如果XF_Flag=1,则XF=1 ;================================================
;主程序:
;================================================
.text
CodeStart:
STM #STACK+10H,SP ;设堆栈指针SP
LD #DATA_DP,DP ;设数据地址DP
STM #XF_Flag,AR2 ;AR指向XF标志
;改变中断向量表位置
K_IPTR .set 0080h ;指向0080H,默认是FF80
LDM PMST,A
AND #7FH,A ;保留低7位,清掉高位
OR #K_IPTR,A ;
STLM A,PMST
;初始化定时器0
;f=100Mhz,定时最大是:10ns*2^4*2^16=10ms,
;要输出1s的方波,可定时5ms,再在中断程序中加个100计数器
;Tt=10ns*(1+9)*(1+49999)=5ms
;f=50M, Tt=20ns*(1+9)*(1+49999)=10ms
;再加50计数器
CounterSet .set 49 ;定义计数次数
PERIOD .set 49999 ;定义计数周期
.asg AR1,Counter ;AR1做计数指针,重新命名以便识别
STM #CounterSet,Counter ;设计数器初值
STM K_TCR_STOP,TCR ;停止计数器0
; STM #PERIOD,TIM ;可设成跟PRD一样,也可不设自动加载STM #PERIOD,PRD ;设定计数周期
STM #K_TCR,TCR ;开始Timer0
stm #0008h,IMR ;允许Timer0中断
STM #0008h,IFR ;清除挂起的中断
RSBX INTM ;开中断
end: nop
B end
;================================================
;Timer0中断服务程序:TIN0_ISR
;================================================
TINT0_ISR:
PSHM ST0 ;本中断程序影响TC,位于ST0中
BANZ Next,*Counter- ;判断不等于0时跳转,然后计数器减1
STM #CounterSet,Counter ;恢复初值
;判断当前XF状态并作电平变化
BITF *AR2,#1 ;IF XF_Flag=1 then TC=1 else TC=0
BC ResetXF,TC ;IF TC=1 then XF=0 else XF=1 setXF:
SSBX XF ;置XF为高电平
ST #1,*AR2 ;相应修改标志
B Next
ResetXF:
RSBX XF ;;置XF为高电平
ST #0,*AR2 ;相应修改标志
Next:
POPM ST0
RETE
.end
②fangbo.cmd
-e CodeStart /* This is the entry point reset vector */
-m map.map
-o fangbo.out
MEMORY {
PAGE 0:
VECT: org=080h len=80h
PARAM: org=100h len=0F00h
PAGE 1:
DARAM: org=1000h len=1000h
}
SECTIONS {
.text :> PARAM PAGE 0
.vectors :>VECT PAGE 0
STACK :> DARAM PAGE1
.data :> DARAM PAGE 1
}
③vectors.asm。省略部分基本上同实验三。
.sect ".vectors" ;开始命名段.vecotrs
.global CodeStart ;引用程序入口的全局符号定义
.global TINT0_ISR
┇
TINT: B TINT0_ISR ;Timer0中断
NOP
NOP
BRINT0: RETE ;McBSP #0 receive interrupt
┇