OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3658|回复: 15

关于CAN接收中断

[复制链接]

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
发表于 2018-5-30 16:13:10 | 显示全部楼层 |阅读模式
1金钱
参考原子的例程,写了个CAN的发送接收程序,采用的是中断接收,实际过程中发送没问题,可以一接收到CAN数据,程序就一直停留在CAN中断里面出不来,不执行主函数

主函数
[mw_shl_code=c,true]  while(1)
        {
               
                CAN_Transmit(CAN1, &temp_Tx);
                printf("t:%d\r\n",t);
                delay_ms(500);
                t++;
        }         [/mw_shl_code]

中断函数:
[mw_shl_code=c,true]void USB_LP_CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage ;
        int i=0;
       
  CAN_Receive(CAN1, 1, &RxMessage);
       
        for(i=0;i<8;i++)
       
        printf("rxbuf[%d]:%x\r\n",i,RxMessage.Data);
}[/mw_shl_code]

CAN初始化部分
[mw_shl_code=c,true]        CAN_FilterInitStructure.CAN_FilterNumber=0;        //1y&#194;&#203;&#198;÷0
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//CAN_FilterMode_IdList;         //
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;         //32&#206;&#187;&#191;í
        CAN_FilterInitStructure.CAN_FilterIdHigh=((uint16_t)(0x01<<5));        //
        CAN_FilterInitStructure.CAN_FilterIdLow=(uint16_t)0x0|CAN_ID_STD;
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00;//
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x00;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//1y&#194;&#203;&#198;÷01&#216;áaμ&#189;FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//&#188;¤&#187;&#238;1y&#194;&#203;&#198;÷0

        CAN_FilterInit(&CAN_FilterInitStructure);                        //&#194;&#203;2¨&#198;÷3&#245;ê&#188;&#187;ˉ

        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);                                //FIFO0&#207;&#251;&#207;¢1òo&#197;&#214;D&#182;&#207;&#212;êDí.                    

        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;     // &#214;÷ó&#197;&#207;è&#188;&#182;&#206;a1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;            // ′&#206;ó&#197;&#207;è&#188;&#182;&#206;a0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

变成这样CAN_Receive(CAN1, 0, &RxMessage);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-9-18
在线时间
97 小时
发表于 2018-5-30 16:13:11 | 显示全部楼层
变成这样CAN_Receive(CAN1, 0, &RxMessage);
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-30 16:16:57 | 显示全部楼层
你把printf("rxbuf[%d]:%x\r\n",i,RxMessage.Data[i]);注释掉试试。
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
 楼主| 发表于 2018-5-30 16:18:56 | 显示全部楼层
kvdong 发表于 2018-5-30 16:16
你把printf("rxbuf[%d]:%x\r\n",i,RxMessage.Data);注释掉试试。

不行,还是一直中断,出不去,应该是中断标志没清除的问题,可以原子的例程也没清除标志啊
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
 楼主| 发表于 2018-5-30 16:20:05 | 显示全部楼层
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
 楼主| 发表于 2018-5-30 16:22:02 | 显示全部楼层
中断里面添加的这行代码还是不行

CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2016-1-26
在线时间
150 小时
发表于 2018-5-30 16:23:55 | 显示全部楼层
断点在can中断里面。查看32寄存器手册看看can中断具体是哪个中断引起的
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
 楼主| 发表于 2018-5-30 16:33:14 | 显示全部楼层
无休 发表于 2018-5-30 16:23
断点在can中断里面。查看32寄存器手册看看can中断具体是哪个中断引起的

CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
这个中断
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
 楼主| 发表于 2018-5-30 16:37:40 | 显示全部楼层
[mw_shl_code=c,true]        CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
       
        CAN_ClearFlag(CAN1,CAN_FLAG_FMP0);[/mw_shl_code]

这两个代码我都试过了,还是一直卡在中断里面出不去
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
 楼主| 发表于 2018-5-30 16:43:10 | 显示全部楼层
附上源码,望各位大大指教

DEMO.zip

6.3 MB, 下载次数: 10680

回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-30 16:52:38 | 显示全部楼层
CAN_Receive(CAN1, 1, &RxMessage);
你再把这句也注释掉,看看能不能出中断。
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
 楼主| 发表于 2018-5-30 16:54:36 | 显示全部楼层
kvdong 发表于 2018-5-30 16:52
CAN_Receive(CAN1, 1, &RxMessage);
你再把这句也注释掉,看看能不能出中断。

不能
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-30 16:57:47 | 显示全部楼层
那就把中断里所有操作全注释掉,然后添加关闭CAN接收,再看看
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
 楼主| 发表于 2018-5-30 17:05:56 | 显示全部楼层
yangongbei 发表于 2018-5-30 17:01
变成这样CAN_Receive(CAN1, 0, &RxMessage);

唉,粗心了我,非常感谢
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-9-18
在线时间
97 小时
发表于 2018-5-30 17:07:00 | 显示全部楼层
最后还要加上CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-9-18
在线时间
97 小时
发表于 2018-5-30 17:08:22 | 显示全部楼层
marcus 发表于 2018-5-30 17:05
唉,粗心了我,非常感谢

因为你初始化用的是过滤器0
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-5 12:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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