📄 新建 文本文档 (3).txt
字号:
全中文注释DSPIC CAN总线汇编程序,包括中断跳转(够酷吧).
.include "p30f4011.inc"
.text
.global __reset
__reset:
;; 在上电复位时获取控制权
MOV #__SP_init,w15 ; 初始化堆栈指针
MOV #__SPLIM_init,w0 ; 和堆栈界限寄存器
MOV w0,SPLIM ;//设置堆栈指针和指针最大值
;------------------------------------------------------
;------------------------------------------------------
;设置输出引脚
mov #0x0000,w0
mov w0,TRISE
mov #0x0004,w0
mov w0,LATE
;------------------------------------------------------
;------------------------------------------------------
;设置定时器
clr TMR1
mov #0xEE00,W0 ;TMR1 interrupts every 0.5 Sec
mov W0,PR1
bclr IFS0,#T1IF ; clr interrupt flag
mov #0x8030,W0 ; Fosc/4, 1:8 prescale, start TMR1
mov W0,T1CON
bset IEC0,#T1IE ; enable interrupt
;------------------------------------------------------
;-------------------------------------------------------
;配置CAN1引脚
BCLR TRISF,#TRISF0 ;设置C1TX/RF0为输出
BSET TRISF,#TRISF1 ;设置C1RX/RF1为输入
;-------------------------------------------------------
MYCAN1:; CAN工作模式选择
MOV #0B0000010010000000,W1
MOV W1,C1CTRL; 设置为配置模式
MOV #0B0000010010000000,W0
;-------------------------------------------------------
PDPZ1:
AND C1CTRL, WREG
CPSEQ W0,W1
GOTO PDPZ1; 判断是否进入配置模式
;--------------------------------------------------------
MOV #0B0001111111111100,W0; 接收过滤器0标准标识符
MOV W0,C1RXF0SID
MOV #0B0001111111111101,W0; 接收过滤器屏蔽器0,1标准标识符
MOV W0,C1RXM0SID
MOV W0,C1RXM1SID
MOV #0B0000000000000100,W0; 接收缓冲器0状态和控制寄存器
MOV W0,C1RX0CON
MOV #0B0000000000000000,W0; 接收缓冲器1状态和控制寄存器
MOV W0,C1RX1CON
MOV #0B0000000000000001,W0; 波特率配置寄存器1
MOV W0,C1CFG1
MOV #0B0100001010010000,W0; 波特率配置寄存器2
MOV W0,C1CFG2
;-----------------------------------------------------
;设置中断
CLR C1INTF; 清除中断标志寄存器
MOV #0B0000000000111111,W0; 中断使能寄存器
MOV W0,C1INTE
BCLR IFS1,#C1IF; 清除中断标记
BSET IEC1,#C1IE; 使能CAN1中断
;------------------------------------------------------
MOV #0B1111100011111110,W0; 发送缓冲器0标准标识符
MOV W0,C1TX0SID
MOV #0B0000001110000000,W0; 发送缓冲器0数据长度控制
MOV W0,C1TX0DLC
MOV #0B1000001001000000,W1; 设置为环回模式
MOV W1,C1CTRL
MOV #0B1000001001000000,W0
;------------------------------------------------------
PDPZ2:
AND C1CTRL, WREG
CPSEQ W0,W1
GOTO PDPZ2; 判断是否进入环回模式
;-------------------------------------------------------
MOV #0B0000000000001011,W0; 发送缓冲器0状态和控制寄存器
MOV W0,C1TX0CON
;-------------------------------------------------------
;-------------------------------------------------------
GOGO:
NOP
NOP
NOP
NOP
GOTO GOGO
;-------------------------------------------------------
;-------------------------------------------------------
.global __C1Interrupt
__C1Interrupt:
;判断中断类型
MOV #0B0000000000001110,W0
AND C1CTRL,WREG
BRA W0
GOTO CANInterruptReturn
GOTO CANErrInterrupt
GOTO CANTXB2Interrupt
GOTO CANTXB1Interrupt
GOTO CANTXB0Interrupt
GOTO CANRXB1Interrupt
GOTO CANRXB0Interrupt
;------------------------------------------------------
;功能函数
CANInterruptReturn:;处理完全后返回
BCLR IFS1,#C1IF ; 清除中断标记
RETFIE;由中断返回
;------------------------------------------------------
CANErrInterrupt:;错误中断处理
BCLR C1INTE,#ERRIF
MOV #0B0000000000001110,W0
AND C1CTRL,WREG
BRA W0
GOTO CANInterruptReturn
GOTO CANErrInterrupt
GOTO CANTXB2Interrupt
GOTO CANTXB1Interrupt
GOTO CANTXB0Interrupt
GOTO CANRXB1Interrupt
GOTO CANRXB0Interrupt
;------------------------------------------------------
GOTO CANRXB0Interrupt
CANTXB2Interrupt:;发送缓冲器2中断处理
BCLR C1INTE,#TX2IF
MOV #0B0000000000001110,W0
AND C1CTRL,WREG
BRA W0
GOTO CANInterruptReturn
GOTO CANErrInterrupt
GOTO CANTXB2Interrupt
GOTO CANTXB1Interrupt
GOTO CANTXB0Interrupt
GOTO CANRXB1Interrupt
GOTO CANRXB0Interrupt
;-----------------------------------------------------
CANTXB1Interrupt:;发送缓冲器1中断处理
BCLR C1INTE,#TX1IF
MOV #0B0000000000001110,W0
AND C1CTRL,WREG
BRA W0
GOTO CANInterruptReturn
GOTO CANErrInterrupt
GOTO CANTXB2Interrupt
GOTO CANTXB1Interrupt
GOTO CANTXB0Interrupt
GOTO CANRXB1Interrupt
GOTO CANRXB0Interrupt
;----------------------------------------------------
CANTXB0Interrupt:;发送缓冲器0中断处理
BTG LATE,#RE0
BCLR C1INTE,#TX0IF
MOV #0B0000000000001110,W0
AND C1CTRL,WREG
BRA W0
GOTO CANInterruptReturn
GOTO CANErrInterrupt
GOTO CANTXB2Interrupt
GOTO CANTXB1Interrupt
GOTO CANTXB0Interrupt
GOTO CANRXB1Interrupt
GOTO CANRXB0Interrupt
;---------------------------------------------------
CANRXB1Interrupt:;接收缓冲器1中断处理
BCLR C1INTE,#RX1IF
MOV #0B0000000000001110,W0
AND C1CTRL,WREG
BRA W0
GOTO CANInterruptReturn
GOTO CANErrInterrupt
GOTO CANTXB2Interrupt
GOTO CANTXB1Interrupt
GOTO CANTXB0Interrupt
GOTO CANRXB1Interrupt
GOTO CANRXB0Interrupt
;---------------------------------------------------
CANRXB0Interrupt:;接收缓冲器0中断处理
BTG LATE,#RE1
BCLR C1INTE,#RX0IF
MOV #0B0000000000001110,W0
AND C1CTRL,WREG
BRA W0
GOTO CANInterruptReturn
GOTO CANErrInterrupt
GOTO CANTXB2Interrupt
GOTO CANTXB1Interrupt
GOTO CANTXB0Interrupt
GOTO CANRXB1Interrupt
GOTO CANRXB0Interrupt
;-------------------------------------------------------
;-------------------------------------------------------
.global __T1Interrupt
__T1Interrupt:
BTG LATE,#RE3
MOV #0B0000000000000100,W0; 接收缓冲器0状态和控制寄存器
MOV W0,C1RX0CON
MOV #0B0000001110000000,W0; 发送缓冲器0数据长度控制
MOV W0,C1TX0DLC
MOV #0B0000000000001011,W0; 发送缓冲器0状态和控制寄存器
MOV W0,C1TX0CON
BCLR IFS0,#T1IF ; 清除中断标记
RETFIE;由中断返回
;-------------------------------------------------------
;-------------------------------------------------------
.global __DefaultInterrupt
__DefaultInterrupt:
;; 服务于所有其它的中断 & 陷阱
reset ; 并且复位器件
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -