社区导航

 
查看: 5826|回复: 14

[原创] 关于LM3S8962 CAN中断处理

[复制链接]

403

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-2-10 18:57:56 | 显示全部楼层 |阅读模式

为了能够对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 编辑 ]
此帖出自最爱TI M4论坛

403

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2011-2-10 19:00:28 | 显示全部楼层

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

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.

}

}


回复 支持 反对

使用道具 举报

403

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2011-2-10 19:01:44 | 显示全部楼层

形式二

<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号。


回复 支持 反对

使用道具 举报

403

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2011-2-10 19:02:19 | 显示全部楼层

寄存器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仍会把中断源看作是有效的)。

回复 支持 反对

使用道具 举报

403

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2011-2-10 19:06:45 | 显示全部楼层

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

如下:

关于LM3S8962CAN中断处理.pdf

209.63 KB, 下载次数: 332

评分

1

查看全部评分


回复 支持 反对

使用道具 举报

1039

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-2-10 21:20:57 | 显示全部楼层

回复 5楼 熊猫 的帖子

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

回复 支持 反对

使用道具 举报

24

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-2-11 09:05:47 | 显示全部楼层
谢谢楼主,学习下先……

回复 支持 反对

使用道具 举报

2万

TA的帖子

61

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2011-2-11 09:32:11 | 显示全部楼层
谢谢分享
2017,加油!继续为中国电子行业做出小小的贡献吧!
QQ 1206973913

回复 支持 反对

使用道具 举报

843

TA的帖子

26

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2011-2-11 10:40:12 | 显示全部楼层

回复 5楼 熊猫 的帖子

谢谢分享
生活在激情中 ... 希望 哈哈

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

回复 支持 反对

使用道具 举报

6161

TA的帖子

4

TA的资源

版主

Rank: 6Rank: 6

发表于 2011-2-11 13:05:31 | 显示全部楼层
很不错的东西 下来学习一下
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰

回复 支持 反对

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-11-30 17:40:38 | 显示全部楼层
谢谢,之前在CAN中断这个地方纠结了一段时间,现在清楚多了

回复 支持 反对

使用道具 举报

390

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2012-4-16 11:31:41 | 显示全部楼层
ding

回复 支持 反对

使用道具 举报

390

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2012-4-17 09:53:08 | 显示全部楼层
讲的很好,容易让人明白

回复 支持 反对

使用道具 举报

7

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2013-6-20 13:53:54 | 显示全部楼层
最近正在看CAN的知识,你写的东西很不错,让我学习很多!!

回复 支持 反对

使用道具 举报

58

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-2-9 14:48:03 | 显示全部楼层
study...

回复 支持 反对

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-8-24 14:52 , Processed in 0.496270 second(s), 21 queries , Redis On.

快速回复 返回顶部 返回列表