8071|14

375

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于LM3S8962 CAN中断处理 [复制链接]

为了能够对CAN中断做出处理,则必须为CAN安装一个中断处理程序

通过使用CANIntStatus()函数,处理程序就能确定是由哪一个条件而引起的中断。

unsigned long CANIntStatus (unsigned long ulBase, tCANIntStsReg eIntStsReg)

每个报文可配置为两种形式:

 

形式一 

<1> CANIntStatus (CAN0_BASE, CANI_INT_STS_CAUSE)

此时该函数返回值是如下寄存器(CANINT)的值

寄存器 5: CAN 中断(CANINT)寄存器

这个寄存器用来指示中断源。

如果多个中断被挂起,CAN 中断 (CANINT) 寄存器将指向优先级最高的挂起中断,而不用考虑它们

的时间顺序如何。中断会一直挂起,直至CPU将它清除

 

 

每帖限定字数20000 我只能这样回复来发完所有的内容

[ 本帖最后由 熊猫 于 2011-2-10 19:10 编辑 ]

最新回复

study...  详情 回复 发表于 2014-2-9 14:48
 
点赞 关注

回复
举报

375

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

此时在一般情况下函数的返回值有两种:

1、(挂起中断)0x0001~0x0020(即1~32);2、(状态中断)0x8000(即值:CAN_INT_INTID_STATUS)。

CAN_INT_STS_CAUSE返回控制器中断寄存器的值并表示中断产生的原因。如果原因是一个状态中断,那么它返回值是CAN_INT_INTID_STATUS。在这种情况下,应该使用CANStatusGet()函数读取状态寄存器。调用此函数读取状态寄存器也将会清除状态中断。如果返回的中断寄存器的值是1-32之间,那么即表示具有高优先级编号的报文对象正在挂起一个中断。通过使用CANIntClear()函数,或在一个接收到的报文情况下使用CANMessageGet()读取报文,都能清除报文对象中断。中断处理程序能再次读取中断状态,以确保在中断返回前清除全部挂起的中断。

中断处理代码如下

void CANIntHandler(void)

{

unsigned long ulStatus;

ulStatus = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);

 

     if(ulStatus == CAN_INT_INTID_STATUS)                      //原因是状态中断

     {

         ulStatus = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);  /          ulStatus = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL); //读取主控制器寄存器的值

/                                                               //并清除状态中断

     }

     else if(ulStatus == 3)         //原因是报文对象3的挂起中断,表明其报文接收已结束

{

     CANIntClear(CAN0_BASE, 3)                             //清除这个挂起中断

        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0x01);                   

                SimpleDelay();                                                               

GPIOPinW        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0);          //闪烁指示灯

       

    }

    else                                  //其他不可预料引发的中断(通常不可能发生)

    {

        // Spurious interrupt handling can go here.

}

}

 
 

回复

375

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

形式二

<2> CANIntStatus (CAN0_BASE, CANI_INT_STS_OBJECT)

此函数返回值是如下寄存器的值

寄存器 34: CAN报文1中断挂起(CANMSG1INT

寄存器 35: CAN报文2中断挂起(CANMSG2INT

 

CANMSG1INT CANMSG2INT 寄存器保存了32个报文对象的 IntPnd 位。通过读取这些位,

CPU可以找出挂起中断的报文对象。这两个寄存器的高16位保留不用,低16位每一位代表一个报文对象,该位置1则该位对应的报文是中断源,否则不是。

CANMSG1INT 寄存器包含报文RAM中编号为1~16号报文对象的 IntPnd 位,如位15对应16号报文,位0对应1号; CANMSG2INT 寄存器包含编号为17~32的报文对象的 IntPnd 位,如位15对应32号,位0对应17号。

 
 
 

回复

375

帖子

0

TA的资源

一粒金砂(中级)

4
 

寄存器CANMSG2INT16位保留,低16位的每位代表一个报文此时该函数的返回值是一能表示正在挂起中断报文的位屏蔽,此时的函数返回值就好比于将两个寄存器的低16位取出合成的一个新32位寄存器,返回值就是返回该寄存器的值,该寄存器的高16位就是CANMSG2INT的低16位,相应的低16位就是CANMSG1INT 的低16位。例如,19号报文引发挂起中断,则返回值是2^18,即2621440000 0000 0000 0100 0000 0000 0000 0000,位19)。

中断处理代码如下

void CANIntHandler (void)

{

    unsigned long ulStatus;

    ulStatus= CANIntStatus (CAN0_BASE, CAN_INT_STS_OBJECT);

 

    if (ulStatus==262144)

    {

        CANIntClear (CAN0_BASE, 19);                            //清除报文19的挂起中断

        CANIntClear (CAN0_BASE, CAN_INT_INTID_STATUS);          //清除报文19的状态中断

   

        UARTprintf ("messge int\n");                                  

    }

}

 

通常地,状态中断是通过使用CANStatusGet()来读取控制器状态而被清除的。而一个特定的报文对象通常是通过使用CANMessageGet()来读取报文对象而被清除的。

注:由于在Cortex-M3处理器包含有一个写入缓冲区,处理器可能要过几个时钟周期才能真正把中断源清除。因此,建议在中断处理程序中要早些把中断源清除掉(反对在最后的操作才清除中断源)以避免在真正清除中断源之前从中断处理程序中返回。如果操作失败可会能导致立即再次进入中断处理程序。(因为NVIC仍会把中断源看作是有效的)。
 
 
 

回复

375

帖子

0

TA的资源

一粒金砂(中级)

5
 

我还把上面的内容整理编辑成一个PDF文档,有兴趣的坛友捧捧场!!

如下:

关于LM3S8962CAN中断处理.pdf

209.63 KB, 下载次数: 340

赞赏

1

查看全部赞赏

 
 
 

回复

978

帖子

0

TA的资源

一粒金砂(高级)

6
 

回复 5楼 熊猫 的帖子

如果你先写在WORD里,在贴上来就会出现超出字数的问题
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢楼主,学习下先……
 
 
 

回复

2万

帖子

74

TA的资源

管理员

8
 
谢谢分享
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

802

帖子

23

TA的资源

五彩晶圆(中级)

9
 

回复 5楼 熊猫 的帖子

谢谢分享
 
个人签名生活在激情中 ... 希望 哈哈

https://home.eeworld.com.cn/?80086
 
 

回复

5979

帖子

8

TA的资源

版主

10
 
很不错的东西 下来学习一下
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
谢谢,之前在CAN中断这个地方纠结了一段时间,现在清楚多了
 
 
 

回复

337

帖子

0

TA的资源

纯净的硅(初级)

12
 
ding
 
 
 

回复

337

帖子

0

TA的资源

纯净的硅(初级)

13
 
讲的很好,容易让人明白
 
 
 

回复

7

帖子

2

TA的资源

一粒金砂(中级)

14
 
最近正在看CAN的知识,你写的东西很不错,让我学习很多!!
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

15
 
study...
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表