📄 cap.asm
字号:
st0_temp .usect ".b20",1 ;
st1_temp .usect ".b20",1 ;
context .usect ".b20",7 ;62-68
CAP4TEMP .usect ".data0",1 ;CAP4 临时寄存器
.include "F2407REGS.H" ;引用头部文件
.def _c_int0
;(1)建立中断向量表
.sect ".vectors" ;定义主向量段
RSVECT B _c_int0 ;PM 0 复位向量 1
INT1 B PHANTOM ;PM 2 中断优先级 1 4
INT2 B PHANTOM ;PM 4 中断优先级2 5
INT3 B PHANTOM ;PM 6 中断优先级 3 6
INT4 B GISR4 ;PM 8 中断优先级4 7
INT5 B PHANTOM ;PM A 中断优先级 5 8
INT6 B PHANTOM ;PM C 中断优先级 6 9
RESERVED B PHANTOM ;PM E (保留位) 10
SW_INT8 B PHANTOM ;PM 10 用户定义软件中断 -
SW_INT31 B PHANTOM ;PM 3E 用户定义软件中断 -
;中断子向量入口定义pvecs
.sect ".pvecs" ;定义子向量段
PVECTORS B PHANTOM ;保留向量地址偏移量-00H
B PHANTOM ;保留向量地址偏移量-01H
B PHANTOM ;保留向量地址偏移量-35H
B CAP4_ISR ;保留向量地址偏移量-36H CAP4中断
B PHANTOM ;保留向量地址偏移量-37H
B PHANTOM ;保留向量地址偏移量-41H
;(2)主程序
.text
_c_int0
LDP #5
SPLK #00H,CAP4TEMP
CALL SYSINIT
CALL CAP_INIT ;调CAP4初始化程序
LOOP
NOP
B LOOP
;(3)系统初始化程序
SYSINIT:
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF ;B0区被配置为数据空间
LDP #0E0H ;指向7000h-7080h区
SPLK #81FEH,SCSR1 ;时钟4倍频,CLKIN=6M,CLKOUT=24M
SPLK #0E8H,WDCR ;不使能WDT
LDP #0
SPLK #0008H,IMR ;使能中断第4级INT4
SPLK #0FFFFH,IFR ;清全部中断标志
RET
;(4)捕获单元初始化程序
CAP_INIT:
LDP #DP_PF2 ;指向7090H-7100H
LACL MCRC
OR #0380H ;IOPE7, IOPF0, IOPF1 被配置为特殊功
SACL MCRC ;能方式:CAP[4-6]
SETC INTM
LDP #DP_EVB
SPLK #049H,GPTCONB;TCOMPOE=1,T4PIN=10,T3PIN=01
SPLK #0,T3CNT
SPLK #01742H,T3CON ;TMODE=10 连续向上计数模式,TPS=111 预分频为128
;TENABLE=1 定时器计数使能, TCLKS=00 内部时钟
;TCLD=00, TECMPR=1 定时器3比较使能, SELT3PR=0
SPLK #0FFFFH,T3PR ;定时器周期比较寄存器设为最大
SPLK #00H,EVBIMRA
SPLK #00H,EVBIMRB
SPLK #22C0H,CAPCONB;CAP4 捕获允许,捕获上升沿
SPLK #01H,EVBIMRC;CAP4 中断使能
SPLK #0FFFFh,EVBIFRA ;清 EVB 全部中断标志
SPLK #0FFFFh,EVBIFRB
SPLK #0FFFFh,EVBIFRC
CLRC INTM ;开总中断
RET
;(5)中断程序程序
GISR4: ;优先级INT4中断人口
;保护现场
LDP #0 ;保存机器上下文
SST #0,st0_temp ;使用自动寻址,DP-0
SST #1,st1_temp ;保存状态寄存器到B2 DARAM.
LDP #0
SACL context ;保存ACC的低16位
SACH context+1 ;保存ACC的高16位
SAR AR1,context+2
SAR AR2,context+3
SAR AR3,context+4
SAR AR4,context+5
SAR AR5,context+6
LDP #0E0H
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位
ADD #PVECTORS ;加上外设中断人口地址
BACC ;跳到相应的中断服务子程序
CAP4_ISR: ;捕获单元4中断程序入口
LDP #DP_EVB
LACL CAP4FIFO
LDP #5
SACL CAP4TEMP ;读出捕获的值
LDP #DP_EVB
SPLK #0,T3CNT ;清 T3 计数值,使其重新计数
GISR2_RET: ;中断返回
;恢复现场
LDP #DP_EVA
SPLK #0FFFFH,EVAIFRA
LDP #0
LAR AR5,context+6
LAR AR4,context+5
LAR AR3,context+4
LAR AR2,context+3
LAR AR1,context+2
LACC context+1,16
ADDS context
LST #1, st1_temp
LST #0, st0_temp
CLRC INTM ;开总中断,因为一进中断就自动关闭总中断
RET
;(6)假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -