搜索
bottom↓
回复: 15

哪位大神帮忙看一下STM32F1 can通讯会死机的问题

[复制链接]

出0入0汤圆

发表于 2015-10-19 08:28:35 | 显示全部楼层 |阅读模式
单片机为STM32F103,CAN通讯波特率设置为250Kbps,使用库函数做的。

正常小数据通讯的时候没有问题,但是大量帧数据连续下发的时候,CAN有时候就收不到数据,这是怎么回事呢?哪位大婶帮帮忙。

以下是初始化程序
void CAN_Config(void)//初始化配置
{
        GPIO_InitTypeDef GPIO_InitStructure;
        CAN_InitTypeDef CAN_InitStructure;
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 ,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
       
        GPIO_PinRemapConfig(GPIO_Remap2_CAN1,ENABLE);

        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);
        CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_ABOM = DISABLE;
        CAN_InitStructure.CAN_AWUM = DISABLE;
        CAN_InitStructure.CAN_NART = DISABLE;
        CAN_InitStructure.CAN_RFLM = DISABLE;
        CAN_InitStructure.CAN_TXFP = DISABLE;
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
        CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
        CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
        CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
        CAN_InitStructure.CAN_Prescaler = 9;
        CAN_Init(CAN1,&CAN_InitStructure);
       
        CAN_FilterInitStructure.CAN_FilterNumber = 0;
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
        CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
        CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
        CAN_FilterInit(&CAN_FilterInitStructure);
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
}
以下是CAN中断程序:
void CAN1_RX0_IRQHandler(void)
{
        u8 i;
        CAN_Receive(CAN1,CAN_FIFO0,&CAN_Rr_Message);
        ID_Source = (CAN_Rr_Message.ExtId)>>21;
        ID_aim                = (CAN_Rr_Message.ExtId)>>13;
        ID_cnt                 =        (CAN_Rr_Message.ExtId)>>5;
        if((ID_Source ==  0x01 || ID_Source ==  0x00)        && ID_aim == 0xff)
        {
                for(i=0;i<CAN_Rr_Message.DLC;i++)
                {
                        USART1Buffer[i+8*ID_cnt]=CAN_Rr_Message.Data[i];
                }
                if(USART1Count > 2000)USART1Count = 0;       
                if((8*ID_cnt+CAN_Rr_Message.DLC)>USART1Count)USART1Count=8*ID_cnt + CAN_Rr_Message.DLC;
                if((CAN_Rr_Message.ExtId & 0x10)==0)
                {
                        CAN_Data_Handler();//此处为协议处理
                }
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-10-19 09:03:21 | 显示全部楼层
检查 USART1Buffer 数组是否越界了

出0入0汤圆

发表于 2015-10-19 09:03:53 | 显示全部楼层
错误处理一下

出0入0汤圆

 楼主| 发表于 2015-10-19 09:21:34 | 显示全部楼层
venus5712 发表于 2015-10-19 09:03
检查 USART1Buffer 数组是否越界了

没有越界,2048字节了

出0入0汤圆

 楼主| 发表于 2015-10-19 09:25:07 | 显示全部楼层

关键是家里模拟不出现象,现场才能模拟出来

出0入0汤圆

发表于 2015-10-19 17:09:00 | 显示全部楼层
在中断里不要做很多事情

出0入0汤圆

发表于 2015-10-19 17:20:28 | 显示全部楼层

在中断里不要做很多事情

出0入0汤圆

发表于 2015-10-19 17:29:33 | 显示全部楼层
CAN_InitStructure.CAN_ABOM = DISABLE;  这个ENABLE试试,现场有干扰达到一定的错误后总线会自动关闭,这个打开总线在进入错误后会自动恢复通信。

出0入0汤圆

 楼主| 发表于 2015-10-20 13:12:54 | 显示全部楼层
zhenglingo 发表于 2015-10-19 17:29
CAN_InitStructure.CAN_ABOM = DISABLE;  这个ENABLE试试,现场有干扰达到一定的错误后总线会自动关闭,这个 ...

好,我试试

出0入0汤圆

发表于 2015-10-20 14:51:25 | 显示全部楼层
楼主的问题解决了吗?我很想知道结果和过程。

出0入0汤圆

 楼主| 发表于 2015-10-22 08:00:33 | 显示全部楼层
NanceMichael 发表于 2015-10-20 14:51
楼主的问题解决了吗?我很想知道结果和过程。

还没呢,等售后过去再去试,如果解决了,发上来告诉你。

出0入0汤圆

发表于 2016-5-28 14:25:25 | 显示全部楼层
snailmoving 发表于 2015-10-22 08:00
还没呢,等售后过去再去试,如果解决了,发上来告诉你。


楼主,问题解决了没?????????????????
等着你分享呢
我也遇到类似的问题添加看门狗还是依然会死机!!!

出0入0汤圆

 楼主| 发表于 2016-6-1 16:57:53 | 显示全部楼层
苹果520 发表于 2016-5-28 14:25
楼主,问题解决了没?????????????????
等着你分享呢
我也遇到类似的问题添加看门狗还是 ...

我的问题,很奇怪,我初始化了CAN接收中断,没有配置NVIC,但我也没有使用CAN中断。结果就死机,然后我把NVIC配置了就可以了。

出0入0汤圆

 楼主| 发表于 2016-6-1 16:59:04 | 显示全部楼层
NanceMichael 发表于 2015-10-20 14:51
楼主的问题解决了吗?我很想知道结果和过程。

初始化了CAN接收中断,但没有使用,也没有配置NVIC。我现在把NVIC配置上去就可以了

出0入0汤圆

发表于 2016-6-2 08:38:03 | 显示全部楼层
snailmoving 发表于 2016-6-1 16:59
初始化了CAN接收中断,但没有使用,也没有配置NVIC。我现在把NVIC配置上去就可以了 ...

哦,can死机是指运行一段时间后。它才开始死机的。
当前我的运行了2天了。还没有死机!!!!!!

出0入0汤圆

发表于 2018-10-26 18:47:43 | 显示全部楼层
苹果520 发表于 2016-6-2 08:38
哦,can死机是指运行一段时间后。它才开始死机的。
当前我的运行了2天了。还没有死机!!!!!! ...

求问,现在问题有解决吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 13:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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