📄 can.asm
字号:
CAN_FLAG .usect ".data0",1 ;CAN 标志寄存器
ST0_TEMP .usect ".data0",1
ST1_TEMP .usect ".data0",1
DP_USER .set 0 ;DP_B2,DP指向000h~0080h单元
.include "F2407REGS.H" ;引用头部文件
.def _c_int0
.def GISR5
.sect ".vectors" ;定义主向量段
RSVECT B _c_int0 ;PM 0 Reset Vector 1
INT1 B PHANTOM ;PM 2 Int level 1 4
INT2 B PHANTOM ;PM 4 Int level 2 5
INT3 B PHANTOM ;PM 6 Int level 3 6
INT4 B PHANTOM ;PM 8 Int level 4 7
INT5 B GISR5 ;PM A Int level 5 8
INT6 B PHANTOM ;PM C Int level 6 9
RESERVED B PHANTOM ;PM E (Analysis Int) 10
SW_INT8 B PHANTOM ;PM 10 User S/W int -
SW_INT9 B PHANTOM ;PM 12 User S/W int -
SW_INT10 B PHANTOM ;PM 14 User S/W int -
SW_INT11 B PHANTOM ;PM 16 User S/W int -
SW_INT12 B PHANTOM ;PM 18 User S/W int -
SW_INT13 B PHANTOM ;PM 1A User S/W int -
SW_INT14 B PHANTOM ;PM 1C User S/W int -
SW_INT15 B PHANTOM ;PM 1E User S/W int -
SW_INT16 B PHANTOM ;PM 20 User S/W int -
TRAP B PHANTOM ;PM 22 Trap vector -
NMI B PHANTOM ;PM 24 Non maskable Int 3
EMU_TRAP B PHANTOM ;PM 26 Emulator Trap 2
SW_INT20 B PHANTOM ;PM 28 User S/W int -
SW_INT21 B PHANTOM ;PM 2A User S/W int -
SW_INT22 B PHANTOM ;PM 2C User S/W int -
SW_INT23 B PHANTOM ;PM 2E User S/W int -
SW_INT24 B PHANTOM ;PM 30 User S/W int -
SW_INT25 B PHANTOM ;PM 32 User S/W int -
SW_INT26 B PHANTOM ;PM 34 User S/W int -
SW_INT27 B PHANTOM ;PM 36 User S/W int -
SW_INT28 B PHANTOM ;PM 38 User S/W int -
SW_INT29 B PHANTOM ;PM 3A User S/W int -
SW_INT30 B PHANTOM ;PM 3C User S/W int -
SW_INT31 B PHANTOM ;PM 3E User S/W int -
.sect ".pvecs" ;定义子向量段
PVECTORS
B PHANTOM ;Reserved pvector addr offset-0000h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0005h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-000ah
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0010h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0015h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-001Ah
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0020h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0025h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;pvector addr offset 0x027h - T1PINT中断
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-002Ah
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;pvector addr offset 0x02f - T3PINT
B PHANTOM ;Reserved pvector addr offset-0030h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0035h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-003aAh
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-003Fh
B CANMBX_ISR ;pvector addr offset 0x040h - CAN接收中断
B PHANTOM ;Reserved pvector addr offset-0041h
.text
_c_int0
CALL SYSINIT ;系统初始化程序
LDP #DP_USER
SPLK #00H, CAN_FLAG ;清CAN用户标志, CAN_FLAG=01
;表示接收到数据
CALL CAN_INIT ;CAN初始化程序
CLRC INTM ;开总中断
LOOP: LDP #DP_USER
BIT CAN_FLAG, BIT0 ;判是否接收到数据, 如接收到则更新邮箱3
BCND LOOP1, NTC
SPLK #00H, CAN_FLAG ;清用户接收标志
LDP #DP_CAN
SPLK #0000H, MDER ;邮箱不使能
SPLK #0100H, MCR ;CDR=1, 数据改变请求
LDP #DP_CAN2 ;DP → 7200h
LACL MBX2A ;更新邮箱3
SACL MBX3A ;把邮箱2的数据移入到邮箱3
LACL MBX2B
SACL MBX3B
LACL MBX2C
SACL MBX3C
LACL MBX2D
SACL MBX3D
LDP #DP_CAN
SPLK #0480H, MCR ;DBO=1, CDR=0, ABO=1, STM=0
SPLK #04CH, MDER ;ME2=ME3=1, MBX2接收, MBX3发送
LOOP1: LDP #DP_CAN
SPLK #0020h, TCR ;邮箱3发送请求
W_TA3: LDP #DP_USER
BIT CAN_FLAG, BIT0 ;判是否接收到新数据
BCND LOOP2, TC
LDP #DP_CAN
BIT TCR, 2
BCND W_TA3, NTC ;等待发送应答
LOOP2: LDP #DP_CAN
SPLK #2000h, TCR ;清 TA3 和MIF3标志位
WAIT: NOP
B LOOP
SYSINIT:
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #0E0H
SPLK #81FEH, SCSR1 ;4倍频CLKIN=10 M, CLKOUT=40 M
SPLK #0E8h, WDCR
LDP #0
SPLK #10h, IMR ;开中断优先级5
SPLK #0FFFFh, IFR ;清中断标志
RET
CAN_INIT:
LDP #DP_PF2
LACL MCRB ;配置 CAN 引脚
OR #0C0H ;IOPC6, IOPC7 配置为特殊功能: CANRX, CANTX
SACL MCRB
NOP
NOP
;~~~~~~~~~~~~~~ CAN 位定时器配置 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LDP #DP_CAN
SPLK #0040H, MDER ;MD2=1, MBX2为发送方式
SPLK #0FFFFH, CAN_IFR ;清全部CAN中断标志
SPLK #07FFFH, LAM1_H ;设置邮箱2、3的屏蔽ID寄存器
SPLK #0FFFFH, LAM1_L ;0则ID必须匹配
NOP
NOP
SPLK #1000H, MCR ;CCR=1 改变配置请求
W_CCE BIT GSR, BIT4 ;等待改变配置使能
BCND W_CCE, NTC ;当CCE=1 时即可配置 BCR2、BCR1 寄存器
SPLK #03H, BCR2 ;波特率预分频寄存器, BRP = 3
SPLK #0065H, BCR1 ;波特率设置为500K (40M系统时钟)
LACL MCR
AND #0EFFFH
SACL MCR ;CCR=0 改变配置结束请求
W_NCCE BIT GSR, BIT4 ;等待改变配置不使能
BCND W_NCCE, TC ;只有当CEE=0时, BCR2、BCR1
;寄存器配置成功
;~~~~~~~~~~~~~~~写 CAN 邮箱内容前寄存器设置~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LDP #DP_CAN
SPLK #0040H, MDER ;不使能邮箱, 邮箱2设为接收方式
SPLK #0103H, MCR ;CDR=1, 数据区改变请求
;~~~~~~~~~~~~~~~写 CAN 邮箱内容~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LDP #DP_CAN2
SPLK #2447H, MSGID2H ;设置邮箱2的控制字及ID
;IDE=0, AME=0, AAM=0
;标准方式为MSGID2H[12~2]
SPLK #0FFFFH, MSGID2L
SPLK #08H, MSGCTRL2 ;设置控制域
;数据长度DCL = 8, RTR=0 数据帧
SPLK #00000H, MBX2A ;邮箱2信息初始化
SPLK #00000H, MBX2B
SPLK #00000H, MBX2C
SPLK #00000H, MBX2D
SPLK #2447H, MSGID3H ;设置邮箱3的标识符
SPLK #0FFFFH, MSGID3L
SPLK #08H, MSGCTRL3 ;RTR=0, DCL=8
SPLK #02211h, MBX3A ;邮箱3信息初始化
SPLK #04433h, MBX3B
SPLK #06655h, MBX3C
SPLK #08877h, MBX3D
;~~~~~~~~~~~~~~~写 CAN 邮箱内容后寄存器设置~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LDP #DP_CAN
SPLK #0480H, MCR ;DBO=1, ABO=1, STM=0
SPLK #04CH, MDER ;ME3=1, MBX3 发送, ME2=1 接收
SPLK #0F7FFH, CAN_IMR ;中断MBX3不使能, MBX2使能,
;中断优先级
SPLK #0FFFFH, CAN_IFR ;清全部中断标志
RET
GISR5: ;优先级INT5中断人口
SST #0, ST0_TEMP ;保护现场
LDP #0E0H
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR), 并左移一位
ADD #PVECTORS ;加上外设中断人口地址
BACC ;跳到相应的中断服务子程序
CANMBX_ISR: ;CAN接收中断程序
LDP #DP_CAN
SPLK #0040h, RCR ;复位 RMP2 和 MIF2
LDP #DP_USER
SPLK #01H, CAN_FLAG ;置用户接收标志
GISR5_RET: ;中断返回
LST #0, ST0_TEMP ;恢复现场
CLRC INTM ;开总中断, 因为一进中断就自动关闭总中断
RET
PHANTOM
;SST #0, ST0_TEMP
;KICK_DOG ;复位看门狗
;LST #0, ST0_TEMP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -