📄 timer.c
字号:
.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 GISR2 ;PM 4 中断优先级2 5
INT3 B PHANTOM ;PM 6 中断优先级3 6
INT4 B PHANTOM ;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 ;保留向量地址偏移量-0000h
B PHANTOM ;保留向量地址偏移量-0001h
…
B PHANTOM ;保留向量地址偏移量-0026h
B T1PINT_ISR ;保留向量地址偏移量-0027h T1PINT中断
B PHANTOM ;保留向量地址偏移量-0028h
…
B PHANTOM ;保留向量地址偏移量-0041h
(2)主程序
.text
_c_int0
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF ;B0区被配置为数据空间
LDP #0E0H ;指向7000h~7080h区
SPLK #81FEH,SCSR1 ;时钟4倍频,CLKIN=6 M,CLKOUT=24 M
SPLK #0E8H,WDCR ;不使能WDT
LDP #0
SPLK #02H,IMR ;使能中断优先级INT2
SPLK #0FFFFh,IFR ;清中断标志
LDP #DP_EVA ;指向7400h~7480h区
SPLK #80H,EVAIMRA ;使能T1PINT 中断
SPLK #0FFFFh,EVAIFRA ;清EVA中断标志
SPLK #0,GPTCONA
SPLK #177H,T1PR ;使定时器每1ms产生一次中断
SPLK #0,T1CNT
SPLK #0164CH,T1CON ;TMODE=10 连续增计数模式,TPS=110 预分频为64
;TENABLE=1 定时器计数使能, TCLKS=00
;内部时钟
;TECMPR=1 定时器1比较使能, SELT1PR=0
CLRC INTM ;开总中断
WAIT: NOP
B WAIT
(3)中断程序
GISR2: ;优先级INT2中断入口
保护现场
LDP #0E0H
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位
ADD #PVECTORS ;加上外设中断入口地址
BACC ;跳到相应的中断服务子程序
T1PINT_ISR: ;通用定时器1中断入口
LDP #DP_EVA
SPLK #0,T1CNT
GISR2_RET: ;中断返回
恢复现场
CLRC INTM ;开总中断,因为一进中断就自动关闭总中断
RET
(3)假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -