RS-CANFD模块有发送、接收和错误等几类中断。
本文从中断源分析、中断注册到模块中断使能设置进行全方位说明,并附有代码实现。
希望能帮助开发小伙伴完成RS-CANFD模块的中断设置。
PS:因为实际开发和调试过程中是RS-CANFD Channel 2所以部分截图为通道2的信息。
注意:CAN(FD)接收采用Receive FIFO形式,未采用Receive Buffer形式。
目录
RS-CANFD Global和Channel中断触发逻辑图
RS-CAN BusOff中断设置
中断源和中断向量号
【重要*】整理出Channel 2中断信息如下:
中断源 | 中断源描述 | 中断向量号 | |
1 | INTRCAN2TRX | CAN2发送中断 | 219 |
2 | INTRCANGRECC0 | CAN接收FIFO中断 | 23 |
3 | INTRCAN2ERR | CAN2错误中断 | 217 |
中断注册
分析完上述中断源后,需要在boot.asm文件中进行中断注册。
使用中断向量号完成中断服务函数ISR执行代码的添加:
接下来,在c文件中添加ISR:
#define NUMINTRSCAN2TRX 219 #define NUMINTRSCAN2ERR 217 #define NUMINTRSCANRECC 23
中断设置寄存器
主要使用到的中断有发送中断RCAN2TRX、接收中断RCANGRECC0和错误中断RCAN2ERR。涉及中断控制寄存器ICXXX(XXX=RCAN2TRX/GRECC0/RCAN2ERR)。
ICXXX寄存器基地址信息:
/* Interrupt Control registers*/ #define ICRCAN2_ERR (*((uint32 volatile * )0xFFFFB1B2UL)) #define ICRCAN2_REC (*((uint32 volatile * )0xFFFFB1B4UL)) #define ICRCAN2_TRX (*((uint32 volatile * )0xFFFFB1B6UL)) #define ICRCAN2_GRECC0 (*((uint32 volatile * )0xFFFEEA2EUL))
ICXXX寄存器定义:
最重要的设置位是中断使/禁能和中断标志位:
(1)中断使/禁能位:
Bit7 MKxxx:置位时禁能中断,清零时使能中断。
中断使能代码
/* ICXXX, MSK bit, 0:Enable interrupt; 1:Disable interrupt */ #define CAN_INT_MASK ((uint16)0x0080U) ICRCAN2_ERR &= ~CAN_INT_MASK; ICRCAN2_TRX &= ~CAN_INT_MASK; ICRCAN2_GRECC0 &= ~CAN_INT_MASK;
中断禁能代码
/* ICXXX, MSK bit, 0:Enable interrupt; 1:Disable interrupt */ #define CAN_INT_MASK ((uint16)0x0080U) ICRCAN2_ERR |= CAN_INT_MASK; ICRCAN2_TRX |= CAN_INT_MASK; ICRCAN2_GRECC0 |= CAN_INT_MASK;
(2)中断标志位:
Bit12 RFxxx:软件清零,清除中断标志位。
清楚中断标志位代码
/* ICXXX, RF bit, request flag */ #define CAN_INT_RF ((uint16)0x1000U) /* clear Busoff Interrupt flag */ ICRCAN2_ERR &= ~CAN_INT_RF; /* clear Tx Interrupt flag */ ICRCAN2_TRX &= ~CAN_INT_RF; /* clear Rx Interrupt flag */ ICRCAN2_GRECC0 &= ~CAN_INT_RF;
此外,也需要注意Bit15 CTxxx:
对于RS-CANFD而言,三类中断均为沿检测,CTxxx=0。
RS-CANFD Global和Channel中断触发逻辑图
RS-CAN TX和RX Buffer中断设置
除了上述ICXXX寄存器的设置外,RS-CANFD模块内部还有Buffer为单位的中断使/禁能设置寄存器。
主要涉及到的寄存器:
1、发送Buffer发送完成中断:
Bit TMIEp:置位使能,清零禁能。
2、接收FIFO Buffer完成中断:
Bit RFIE: 置位使能,清零禁能。
RS-CAN BusOff中断设置
Bus off entry interrupt enable
Bit BOEIE:置位使能,清零禁能。