IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 28335 CAN 接受邮箱中断配置,解决进不了中断函数的问题 -> 正文阅读

[嵌入式]28335 CAN 接受邮箱中断配置,解决进不了中断函数的问题

上一篇将到了如何配置28335的发送寄存器,本篇讲如何配置CAN接受中断。

上一篇的链接:

28335 CAN 通讯寄存器配置标准步骤流程_追火青木的博客-CSDN博客

CAN接受中断配置,不可以盲目信任从网上copy过来的code,因为开发板硬件环境可能不同。举个例子,copy过来的code如果是ECanaRegs,但你的硬件CAN输出只是连接了一个对CAN输出GPIO,而该GPIO对应的是CANB,那无论你怎么配置都是错误的。

另外,需要注意的是,28335的CAN中断必须按照28335的手册进行配置,而不能随意配置。这点对于没有硬件编程经验的人可能会踩坑。举例如下,28335的中断分为32个中断源,其中留给用的专断有12个,每个又分为8组,因此共有96组外设级中断可供用户配置使能。但问题是虽然看似这么多,但其实芯片出厂时已经给你固定了96个能配置成什么样子。从28335手册中截图如下:

从上面手册可知,如果你自己的板子电路只使用了CANB,那接受中断就只能使用TNT9.7、或者INT9.8,配置为别的都会是错误的。关键代码如下:

?PieVectTable.ECAN1INTB = &Ecana_isr1;//把中断入口函数写入中断向量表ECAN1INTB对应的中断上

?PieCtrlRegs.PIEIER9.bit.INTx8 = 1; //CANB的中断1?

上面红色字体都是关键点,需要格外注意,避免踩坑。

附配置接受CAN中断的代码:

static void CANB_RX_Config(void)
{
?? ?struct ECAN_REGS ECan_Reg_Shadow;
?? ?ECan_Reg_Shadow.CANME.all = ECanbRegs.CANME.all;
?? ?ECan_Reg_Shadow.CANME.bit.ME1 = 0;//不使能邮箱1
?? ?ECan_Reg_Shadow.CANME.bit.ME31 = 0;//不使能邮箱31
?? ?ECanbRegs.CANME.all = ECan_Reg_Shadow.CANME.all;
?? ?/*----------以下代码是配置接受邮箱的相关代码------------*/
?? ?//邮箱1相关配置
?? ?ECanbMboxes.MBOX1.MSGCTRL.bit.DLC = 8;//配置数据长度,应该是没意义的;
?? ?ECanbMboxes.MBOX1.MSGID.all = 0x0123C;//设置接收消息的有效ID
?? ?ECanbMboxes.MBOX1.MSGID.bit.AME =1;//屏蔽使能位,
?? ?ECanbMboxes.MBOX1.MSGID.bit.IDE = CAN_ID_EXT;
?? ?/*
?? ??? ?LAM[28:0]
?? ??? ?这些位启用一个进入消息的任意标识符位的屏蔽。
?? ??? ?1 针对接受到的标识符的相应位, 接受一个 0 或 1( 无关) 。
?? ??? ?0 接收到的标识符位值必须与 MSGID 寄存器的相应标识符位相匹配。
?? ?*/

?? ?ECanbLAMRegs.LAM1.all = 0x000000F;//
?? ? /*
?? ??? ?LAMI 本地接受屏蔽标识符扩展位
?? ??? ?1 可以接收标准和扩展帧。 在扩展帧的情况下, 标识符的所有 29 位被存储在邮箱中, 本地接受屏蔽寄
?? ??? ?存器的所有 29 位被过滤器使用。 在一个标准帧的情况下, 只有标识符的头 11 个位( 28 至 18 位)
?? ??? ?和本地接受屏蔽被使用。
?? ??? ?0 存储在邮箱中的标识符扩展位决定了哪些消息应该被接收到
?? ?*/
?? ?ECanbLAMRegs.LAM1.bit.LAMI = 1;
?? ?//邮箱31相关配置
?? ?ECanbMboxes.MBOX31.MSGCTRL.bit.DLC = 8;//配置数据长度,应该是没意义的;
?? ?ECanbMboxes.MBOX31.MSGID.all = 0x07909ABC;//设置接收消息的有效ID
?? ?ECanbMboxes.MBOX31.MSGID.bit.AME =1;//屏蔽使能位,
?? ?ECanbMboxes.MBOX31.MSGID.bit.IDE = CAN_ID_EXT;
?? ?/*
?? ??? ?LAM[28:0]
?? ??? ?这些位启用一个进入消息的任意标识符位的屏蔽。
?? ??? ?1 针对接受到的标识符的相应位, 接受一个 0 或 1( 无关) 。
?? ??? ?0 接收到的标识符位值必须与 MSGID 寄存器的相应标识符位相匹配。
?? ?*/

?? ?ECanbLAMRegs.LAM31.all = 0x0000000;//
?? ? /*
?? ??? ?LAMI 本地接受屏蔽标识符扩展位
?? ??? ?1 可以接收标准和扩展帧。 在扩展帧的情况下, 标识符的所有 29 位被存储在邮箱中, 本地接受屏蔽寄
?? ??? ?存器的所有 29 位被过滤器使用。 在一个标准帧的情况下, 只有标识符的头 11 个位( 28 至 18 位)
?? ??? ?和本地接受屏蔽被使用。
?? ??? ?0 存储在邮箱中的标识符扩展位决定了哪些消息应该被接收到
?? ?*/
?? ?ECanbLAMRegs.LAM31.bit.LAMI = 1;
?? ?ECanbRegs.CANRMP.all ? ? ?= 0xFFFFFFFF;
?? ?ECan_Reg_Shadow.CANMD.all ? ? = ECanbRegs.CANMD.all;
?? ?ECan_Reg_Shadow.CANMD.bit.MD1 = 1;
?? ?ECan_Reg_Shadow.CANMD.bit.MD31 = 1;
?? ?ECanbRegs.CANMD.all ? ? ? = ECan_Reg_Shadow.CANMD.all;

?? ?ECan_Reg_Shadow.CANME.all ? ? ? = ECanbRegs.CANME.all;
?? ?ECan_Reg_Shadow.CANME.bit.ME1 ? = 1;//使能邮箱1
?? ?ECan_Reg_Shadow.CANME.bit.ME31 ?= 1;//使能邮箱1
?? ?ECanbRegs.CANME.all ? ? ? ? = ECan_Reg_Shadow.CANME.all;
}

void CAN_Rx_IT_Concig(void)
{
?? ?EALLOW;
?? ?ECanbRegs.CANMIM.bit.MIM31 = 1;//使能中断邮箱31的中断;
?? ?ECanbRegs.CANMIL.bit.MIL31 = 1;//将中断31连接至中断1;
?? ?ECanbRegs.CANGIM.bit.I1EN = 1;//使能中断1;
?? ?EDIS;
}

? //配置中断
? ? PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
? ? PieCtrlRegs.PIEIER9.bit.INTx8 = 1; //CANB的中断1
? ? IER |= M_INT9;
? ? IER |= M_INT1;
? ? EINT;
? ? // Enable Global interrupt INTM
? ? ERTM;

__interrupt void Ecana_isr1(void)
{
? ? DINT;
?? ?if(ECanbRegs.CANGIF1.bit.GMIF1 == 1)
?? ?{
?? ??? ?if(ECanbRegs.CANRMP.bit.RMP31 == 1)
?? ??? ?{
?? ??? ??? ?can_rx_msg.rx_update = UPDATE;
?? ??? ??? ?can_rx_msg.MBox_num = ECanbRegs.CANGIF1.bit.MIV1;
?? ??? ??? ?can_rx_msg.DLC = ECanbMboxes.MBOX31.MSGCTRL.bit.DLC;
?? ??? ??? ?can_rx_msg.IDE = ECanbMboxes.MBOX31.MSGID.bit.IDE;
?? ??? ??? ?if(can_rx_msg.IDE == CAN_ID_EXT)
?? ??? ??? ?{
?? ??? ??? ??? ?can_rx_msg.ExtId = ECanbMboxes.MBOX31.MSGID.all&0x1FFFFFFF;
?? ??? ??? ??? ?can_rx_msg.SAE_J1939_ID.id = can_rx_msg.ExtId;
?? ??? ??? ?}
?? ??? ??? ?else if(can_rx_msg.IDE == CAN_ID_STD)
?? ??? ??? ?{
?? ??? ??? ??? ?can_rx_msg.StdId = ECanbMboxes.MBOX31.MSGID.bit.STDMSGID;
?? ??? ??? ?}
?? ??? ? ? can_rx_msg.CAN_Rx_msg_data.msg_Byte.byte0 = ECanbMboxes.MBOX31.MDL.byte.BYTE0;
?? ??? ? ? can_rx_msg.CAN_Rx_msg_data.msg_Byte.byte1 = ECanbMboxes.MBOX31.MDL.byte.BYTE1;
?? ??? ? ? can_rx_msg.CAN_Rx_msg_data.msg_Byte.byte2 = ECanbMboxes.MBOX31.MDL.byte.BYTE2;
?? ??? ? ? can_rx_msg.CAN_Rx_msg_data.msg_Byte.byte3 = ECanbMboxes.MBOX31.MDL.byte.BYTE3;
?? ??? ? ? can_rx_msg.CAN_Rx_msg_data.msg_Byte.byte4 = ECanbMboxes.MBOX31.MDH.byte.BYTE4;
?? ??? ? ? can_rx_msg.CAN_Rx_msg_data.msg_Byte.byte5 = ECanbMboxes.MBOX31.MDH.byte.BYTE5;
?? ??? ? ? can_rx_msg.CAN_Rx_msg_data.msg_Byte.byte6 = ECanbMboxes.MBOX31.MDH.byte.BYTE6;
?? ??? ? ? can_rx_msg.CAN_Rx_msg_data.msg_Byte.byte7 = ECanbMboxes.MBOX31.MDH.byte.BYTE7;
?? ??? ? ? ECanbRegs.CANRMP.bit.RMP31 = 1;
?? ??? ?}
?? ?}
?? ?PieCtrlRegs.PIEACK.bit.ACK9 = 1;
?? ?//ECanbRegs.CANGIF1.bit.GMIF1 = 1;
?? ?EINT;

}
?

以上代码实测可用,希望能帮到后来者。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 19:08:40  更:2022-05-21 19:09:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:31:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码