|
全中文注释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 ; 并且复位器件
初学DSPIC的汇编,中间有不足欢迎大家指教,一开始我把C1CTRL里的中断标志编码作为内存的偏移量,把跳转地址保存在内存中,执行周期是相同的,但程序不够直观,假如想省点程序空间,程序可改一下,把重复再做个跳转.
|