目录
本人萌新小白,请各位大佬多多指教。
代码未经实践,且主包经验不足,代码请忽略。
手册链接:https://www.ti.com.cn/cn/lit/pdf/spruiw9 本章对应手册的28.5 Interrupt Functionality
1.中断概述
CAN 模块提供了两种中断线(CAN0INT 和 CAN1INT),这些中断线可以通过设置 CAN 控制寄存器(CAN_CTL)中的 IE0 和 IE1 位来启用。中断可以由以下三组中断源触发:
a. 消息对象中断:由消息对象的事件触发
b. 状态变化中断:由 CAN 模块的状态变化触发
c. 错误中断:由 CAN 总线错误事件触发
2. 中断源识别
中断寄存器(CAN_INT)中的 Int0ID 和 Int1ID 字段用于指示中断源。每个中断线保持活跃状态,直到相应的中断原因被清除或中断使能位(IE0 和 IE1)被重置。
中断寄存器(CAN_INT)
Int0ID:指示 CAN0INT 中断线的中断源。
Int1ID:指示 CAN1INT 中断线的中断源。
中断优先级
状态变化中断具有最高优先级。
消息对象中断的优先级根据消息对象编号递减,消息对象 1 优先级最高。
3. 消息对象中断
消息对象中断由消息对象的事件触发。每个消息对象可以配置为在发送或接收成功时触发中断。
触发条件
发送成功:如果设置了 TxIE 位,消息对象的 IntPnd 位在成功发送后被设置。
接收成功:如果设置了 RxIE 位,消息对象的 IntPnd 位在成功接收后被设置。
中断处理
中断服务程序可以通过读取消息对象的 IntPnd 位来确定中断源。
清除 IntPnd 位可以同时读取消息对象的数据,并重置中断请求。
4. 状态变化中断
状态变化中断由 CAN 模块的状态变化触发。例如,成功接收或发送消息后,状态变化中断可以通知 CPU。
触发条件:
接收成功(RxOk):成功接收消息后,RxOk 位被设置。
发送成功(TxOk):成功发送消息后,TxOk 位被设置。
最后错误代码(LEC):指示最后的错误类型。
中断处理:
通过设置 CAN 控制寄存器中的 SIE 位来启用状态变化中断。
5. 错误中断
错误中断由 CAN 总线错误事件触发。例如,总线关闭、错误计数器溢出或警告条件。
触发条件:
总线关闭(BOff):CAN 模块进入总线关闭状态。
错误警告(EWarn):错误计数器达到警告阈值。
奇偶错误(PER):消息 RAM 数据出现奇偶错误。
中断处理:
通过设置 CAN 控制寄存器中的 EIE 位来启用错误中断。
6. 中断拓扑结构
CAN 模块支持灵活的中断拓扑结构,允许将不同类型的中断路由到不同的中断线:
消息对象中断:可以路由到 CAN0INT 或 CAN1INT。
状态变化中断和错误中断:只能路由到 CAN0INT。
### 图片取自于用户手册


7. 中断处理流程
i 中断触发:
当某个中断源的条件满足时,相应的中断线(CAN0INT 或 CAN1INT)被激活。
ii 中断识别:
CPU 读取中断寄存器(CAN_INT)中的 Int0ID 或 Int1ID 字段,确定中断源。
iii 中断服务:
根据中断源类型,执行相应的中断服务程序。
iv 中断清除:
清除中断原因(例如,清除消息对象的 IntPnd 位或读取错误状态寄存器)。
如果需要,重置中断使能位(IE0 或 IE1)。
8. 中断配置的示例
i 启用中断线
CAN_CTL.BIT.IE0 = 1; // 启用 CAN0INT 中断线
CAN_CTL.BIT.IE1 = 1; // 启用 CAN1INT 中断线
ii 配置消息对象中断
// 配置消息对象 1 为接收中断
CAN_IF1MCTL.BIT.RxIE = 1;
CAN_IF1MCTL.BIT.IntPnd = 1;
// 将消息对象 1 的中断路由到 CAN0INT
CAN_IP_MUX21.BIT.IntMux[0] = 0;
iii 中断服务程序
void CAN0_ISR(void) {
uint16_t intId = CAN_INT.BIT.Int0ID;
if (intId >= 1 && intId <= 32) {
// 处理消息对象中断
CAN_MessageObject *obj = &CAN_MessageObjects[intId - 1];
if (obj->IntPnd) {
// 读取消息对象数据
CAN_ReadMessage(intId);
// 清除中断
obj->IntPnd = 0;
}
} else if (intId == 0x8000) {
// 处理状态变化中断
CAN_ES.BIT.RxOk = 0; // 清除 RxOk 状态
CAN_ES.BIT.TxOk = 0; // 清除 TxOk 状态
}
}
1175

被折叠的 条评论
为什么被折叠?



