硬汉嵌入式论坛

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

[CAN/FDCAN] H7的FDCAN接收中断,在打断点后失效。

[复制链接]

25

主题

233

回帖

308

积分

高级会员

积分
308
QQ
发表于 2024-5-30 09:41:56 | 显示全部楼层 |阅读模式

初始化部分和中断处理参考安富莱例程,接收回调也仅作了数据入栈处理,程序正常跑的时候收发处理正常.
基于STM32H7的双CANFD通信案例(2022-06-30) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)
当我在程序任意处断点调试,FDCAN的接收中断就再也进不去了,但是发送是正常的,CAN总线上仍然有大量的数据收发,只是H743这边没有正确接收了.
查看FDCAN寄存器没有看出端倪,有好厚米知道这个咋解决吗?>
CAN总线数据监控.png

[C] 纯文本查看 复制代码
    /*      CANFD1部分      */
    /* 绑定配置结构体 */
    tCanfd1.CanfdConfig.Canfd  = &hfdcan1; // CAN1内部通信
    tCanfd1.CanfdConfig.Filter = &sFilterConfig1;
    tCanfd1.CanfdConfig.Tx     = &g_Can1TxHeader;
    tCanfd1.CanfdConfig.Rx     = &g_Can1RxHeader;
    /* 设置基础过滤器 */
    tCanfd1.CanfdConfig.Filter->IdType       = FDCAN_EXTENDED_ID;                  // 设置标准ID或者扩展ID
    tCanfd1.CanfdConfig.Filter->FilterIndex  = 0;                                  // 用于过滤索引,如果是标准ID,范围0到127。如果是扩展ID,范围0到64
    tCanfd1.CanfdConfig.Filter->FilterType   = FDCAN_FILTER_MASK;                  // 过滤器采样屏蔽位模式
    tCanfd1.CanfdConfig.Filter->FilterConfig = FDCAN_FILTER_TO_RXFIFO0;            // 如果过滤匹配,将数据保存到Rx FIFO 0
    tCanfd1.CanfdConfig.Filter->FilterID1    = 0x00000000;                         // 屏蔽位模式下,FilterID1是消息ID
    tCanfd1.CanfdConfig.Filter->FilterID2    = 0x00000000;                         // 屏蔽位模式下,FilterID2是消息屏蔽位
    HAL_FDCAN_ConfigFilter(tCanfd1.CanfdConfig.Canfd, tCanfd1.CanfdConfig.Filter); // 配置过滤器
    /* 设置基础发送头 */
    tCanfd1.CanfdConfig.Tx->Identifier          = 0x00000000;         // 初始化发送帧ID
    tCanfd1.CanfdConfig.Tx->IdType              = FDCAN_EXTENDED_ID;  // 配置为拓展帧
    tCanfd1.CanfdConfig.Tx->TxFrameType         = FDCAN_DATA_FRAME;   // 配置为数据帧
    tCanfd1.CanfdConfig.Tx->DataLength          = FDCAN_DLC_BYTES_8;  // 初始化发送数据长度
    tCanfd1.CanfdConfig.Tx->ErrorStateIndicator = FDCAN_ESI_ACTIVE;   // 设置错误状态指示(供接收端了解发送端状态)
    tCanfd1.CanfdConfig.Tx->BitRateSwitch       = FDCAN_BRS_OFF;      // 不可变bit率
    tCanfd1.CanfdConfig.Tx->BitRateSwitch       = FDCAN_CLASSIC_CAN;  // 经典can
    tCanfd1.CanfdConfig.Tx->TxEventFifoControl  = FDCAN_NO_TX_EVENTS; // 用于发送事件FIFO控制, 不存储
    tCanfd1.CanfdConfig.Tx->MessageMarker       = 0;                  // 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF
    /* 开启接收通道,以及外设功能 */
    HAL_FDCAN_ConfigFifoWatermark(tCanfd1.CanfdConfig.Canfd, FDCAN_CFG_RX_FIFO0, 1);           // 设置Rx FIFO0的watermark为1,有消息立即通知
    HAL_FDCAN_ActivateNotification(tCanfd1.CanfdConfig.Canfd, FDCAN_IT_RX_FIFO0_WATERMARK, 0); // 激活RX FIFO0的watermark通知中断,位开启Tx Buffer中断
    HAL_FDCAN_Start(tCanfd1.CanfdConfig.Canfd);                                                // 启动FDCAN1



[C] 纯文本查看 复制代码
/*          供CNFD中断调用的综合处理        */
/**
 * @brief 定义覆盖HAL库中,CAN中断处理的回调函数
 *          Rx FIFO 0 callback.
 * @param hfdcan 触发的CAN口,对应的HAL_CAN结构体
 * @param RxFifo0ITs 标识哪个fifo发出中断信号的组合量
 */
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
    if(hfdcan == &hfdcan1)
    {
        if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != RESET)
        {
            /* 从RX FIFO0读取数据 */
            HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, tCanfd1.CanfdConfig.Rx, tCanfd1.CanfdExist.RxDataBuffer);

            /* 激活Rx FIFO0 watermark notification */
            HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0);

            /* 入待处理数据栈(更换平台需更改) */
            CanMailRead1(&tCanfd1);
            // CanClassicWrite(&tCanfd1, tCanfd1.CanfdConfig.Rx->Identifier, tCanfd1.CanfdExist.RxDataBuffer, 8);
        }
    }

    if(hfdcan == &hfdcan2)
    {
        if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != RESET)
        {
            /* 从RX FIFO0读取数据 */
            HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, tCanfd2.CanfdConfig.Rx, tCanfd2.CanfdExist.RxDataBuffer);

            /* 激活Rx FIFO0 watermark notification */
            HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0);

            /* 入待处理数据栈(更换平台需更改) */
            CanMailRead2(&tCanfd2);
            // CanClassicWrite(&tCanfd1, tCanfd2.CanfdConfig.Rx->Identifier, tCanfd2.CanfdExist.RxDataBuffer, 8);
        }
    }
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-5-31 08:40:09 | 显示全部楼层
以实际运行为准,实际运行正常就行。
回复

使用道具 举报

25

主题

233

回帖

308

积分

高级会员

积分
308
QQ
 楼主| 发表于 2024-9-2 20:39:22 | 显示全部楼层
顶一下自己,今天稍微尝试一下失败了。不用断点只靠Trace太痛苦了。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-9-14 10:55:46 | 显示全部楼层
楼主找到原因了吗,我也遇到这个问题了。使用FDCAN_IT_RX_FIFO0_WATERMARK中断打断点后就失效了,使用FDCAN_IT_RX_FIFO0_NEW_MESSAGE中断又是正常的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-9-15 08:47:04 | 显示全部楼层
Vermouth350 发表于 2024-9-14 10:55
楼主找到原因了吗,我也遇到这个问题了。使用FDCAN_IT_RX_FIFO0_WATERMARK中断打断点后就失效了,使用FDCAN ...

可以比参考下我这个,我这个是正常的。FDCAN_IT_RX_FIFO0_WATERMARK和FDCAN_IT_RX_FIFO0_NEW_MESSAGE都有使用

BSP视频教程第26期:CAN/CANFD/CANopen专题,CANFD整个运行机制精讲,图文并茂,配合综合实战演练(2023-05-15)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=119189
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 17:33 , Processed in 0.042727 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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