硬汉嵌入式论坛

 找回密码
 立即注册
查看: 957|回复: 5
收起左侧

[有问必答] 407的can接收中断异常

[复制链接]

31

主题

76

回帖

169

积分

初级会员

积分
169
发表于 2022-7-14 14:16:20 | 显示全部楼层 |阅读模式
407芯片,产品在运行过程中(几个小时到十几个小时不等),会一直卡死在CAN接收中断里,只使能了CAN1的接收中断,有大佬遇到这种情况吗,救救孩子吧
回复

使用道具 举报

31

主题

76

回帖

169

积分

初级会员

积分
169
 楼主| 发表于 2022-7-14 14:22:47 | 显示全部楼层
屏幕截图 2022-07-14 141925.png

void can_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        CAN_InitTypeDef   CAN_InitStructure;
        NVIC_InitTypeDef  NVIC_InitStructure;               
       
       
        /* CAN GPIOs 配置*/
        /* 使能GPIO时钟 */
        RCC_AHB1PeriphClockCmd(CAN_GPIO_TX_CLK|CAN_GPIO_RX_CLK, ENABLE);

        /* 引脚映射为CAN功能  */
        GPIO_PinAFConfig(CAN_GPIO_RX_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
        GPIO_PinAFConfig(CAN_GPIO_TX_PORT, CAN_TX_SOURCE, CAN_AF_PORT);

        /* 配置 CAN RX 和 TX 引脚 */
        GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(CAN_GPIO_RX_PORT, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin =CAN_TX_PIN ;
        GPIO_Init(CAN_GPIO_TX_PORT, &GPIO_InitStructure);

        /* CAN配置*/  
        /* 使能CAN时钟 */
        RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

        /* 复位CAN寄存器 */
        CAN_DeInit(CAN1);
       
        /*
                TTCM = time triggered communication mode
                ABOM = automatic bus-off management
                AWUM = automatic wake-up mode
                NART = no automatic retransmission
                RFLM = receive FIFO locked mode
                TXFP = transmit FIFO priority               
        */
        CAN_InitStructure.CAN_TTCM = DISABLE;                        /* 禁止时间触发模式(不生成时间戳), T  */
        CAN_InitStructure.CAN_ABOM = DISABLE;                        /* 禁止自动总线关闭管理 */
        CAN_InitStructure.CAN_AWUM = DISABLE;                        /* 禁止自动唤醒模式 */
        CAN_InitStructure.CAN_NART = DISABLE;                        /* 禁止仲裁丢失或出错后的自动重传功能 */
        CAN_InitStructure.CAN_RFLM = DISABLE;                        /* 禁止接收FIFO加锁模式 */
        CAN_InitStructure.CAN_TXFP = DISABLE;                        /* 禁止传输FIFO优先级 */
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;        /* 设置CAN为正常工作模式 */
       
        /*
                CAN 波特率 = RCC_APB1Periph_CAN1 / Prescaler / (SJW + BS1 + BS2);       
                SJW = synchronisation_jump_width
                BS = bit_segment               
                CAN 波特率 = 420000000 / 20 / (1 + 12 + 8) / = 1 MBps                        */
        /* 波特率 = 100kHz */
        CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
        CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
        CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
        CAN_InitStructure.CAN_Prescaler = 20;
        CAN_Init(CAN1, &CAN_InitStructure);
       
        /* 设置CAN滤波器0 */
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;
        CAN_FilterInitStructure.CAN_FilterNumber = 0;                /* 滤波器序号,0-13,共14个滤波器 */
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;                /* 滤波器模式,设置ID掩码模式 */
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;        /* 32位滤波 */
        CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;                                        /* 掩码后ID的高16bit */
        CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;                                        /* 掩码后ID的低16bit */
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;                                /* ID掩码值高16bit */
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;                                /* ID掩码值低16bit */
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;                /* 滤波器绑定FIFO 0 */
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                                /* 使能滤波器 */
        CAN_FilterInit(&CAN_FilterInitStructure);
       
        /* 配置CAN中断 */       
        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;        //数字越小,优先级越高
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        /* CAN FIFO0 消息接收中断使能 */
        CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);                               
}   
回复

使用道具 举报

31

主题

76

回帖

169

积分

初级会员

积分
169
 楼主| 发表于 2022-7-14 14:25:02 | 显示全部楼层
程序没有进入硬件异常,就一直卡在can接收中断,比can中断优先级高的定时器中断一直在正常运行
回复

使用道具 举报

3

主题

1223

回帖

1232

积分

至尊会员

积分
1232
发表于 2022-7-14 16:51:32 | 显示全部楼层
感觉是某些错误标志没有清除。  你使用HAL库,会好点,里面处理的比较全面。
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
发表于 2024-2-27 13:21:26 | 显示全部楼层
有后续吗?
回复

使用道具 举报

0

主题

29

回帖

29

积分

新手上路

积分
29
发表于 2024-3-1 13:06:30 | 显示全部楼层
ISR 没看到清除中断请求标志。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 20:20 , Processed in 0.166184 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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