打印
[STM32H7]

STM32H743IIT6配置CAN如何同时接收标准帧和扩展帧?

[复制链接]
237|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2024-9-2 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32H743IIT6配置CAN如何同时接收标准帧和扩展帧?

使用特权

评论回复
沙发
yiyigirl2014| | 2024-9-2 20:59 | 只看该作者
在STM32H743IIT6上配置CAN同时接收标准帧和扩展帧,可以通过以下步骤实现:

1. 初始化CAN外设
首先,配置CAN外设的初始化结构体CAN_HandleTypeDef。在初始化过程中,需要配置CAN模式、波特率等参数。以下是一个基本的初始化示例:
CAN_HandleTypeDef hcan1;

void CAN1_Init(void)
{
    hcan1.Instance = CAN1;
    hcan1.Init.Prescaler = 16; // 设置波特率分频器
    hcan1.Init.Mode = CAN_MODE_NORMAL; // 正常模式
    hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
    hcan1.Init.TimeSeg1 = CAN_BS1_8TQ;
    hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;
    hcan1.Init.TimeTriggeredMode = DISABLE;
    hcan1.Init.AutoBusOff = DISABLE;
    hcan1.Init.AutoWakeUp = DISABLE;
    hcan1.Init.AutoRetransmission = ENABLE;
    hcan1.Init.ReceiveFifoLocked = DISABLE;
    hcan1.Init.TransmitFifoPriority = DISABLE;

    if (HAL_CAN_Init(&hcan1) != HAL_OK)
    {
        // 初始化失败处理
        Error_Handler();
    }
}

使用特权

评论回复
板凳
yiyigirl2014| | 2024-9-2 20:59 | 只看该作者
2. 配置CAN过滤器
为了同时接收标准帧和扩展帧,您需要设置CAN过滤器以允许这两种帧格式。可以配置一个过滤器来接收所有标准帧和扩展帧:
void CAN_FilterConfig(void)
{
    CAN_FilterTypeDef sFilterConfig;

    sFilterConfig.FilterBank = 0; // 使用过滤器0
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterIdHigh = 0x0000; // ID高位
    sFilterConfig.FilterIdLow = 0x0000; // ID低位
    sFilterConfig.FilterMaskIdHigh = 0x0000; // 掩码高位
    sFilterConfig.FilterMaskIdLow = 0x0000; // 掩码低位
    sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; // 选择接收FIFO0
    sFilterConfig.FilterActivation = ENABLE;
    sFilterConfig.SlaveStartFilterBank = 14; // 对于单CAN设置为14

    if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
    {
        // 配置过滤器失败处理
        Error_Handler();
    }
}

此配置允许CAN接收所有标准帧和扩展帧,无论其ID是什么。可以根据需要调整FilterIdHigh、FilterIdLow、FilterMaskIdHigh和FilterMaskIdLow来设置特定的过滤器规则。

使用特权

评论回复
地板
yiyigirl2014| | 2024-9-2 21:00 | 只看该作者
3. 启动CAN并启用中断接收
配置完成后,启动CAN,并启用接收中断:
void CAN_Start(void)
{
    if (HAL_CAN_Start(&hcan1) != HAL_OK)
    {
        // 启动失败处理
        Error_Handler();
    }

    if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
    {
        // 启用中断失败处理
        Error_Handler();
    }
}

4. 接收CAN消息
在CAN中断处理函数中,接收消息并处理:
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
    CAN_RxHeaderTypeDef RxHeader;
    uint8_t RxData[8];

    if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
    {
        // 接收消息失败处理
        Error_Handler();
    }

    // 根据RxHeader.StdId或RxHeader.ExtId处理不同的ID
    if (RxHeader.IDE == CAN_ID_STD)
    {
        // 处理标准帧
    }
    else if (RxHeader.IDE == CAN_ID_EXT)
    {
        // 处理扩展帧
    }
}

使用特权

评论回复
5
yiyigirl2014| | 2024-9-2 21:00 | 只看该作者
这样,你就能够在STM32H743IIT6上同时接收标准帧和扩展帧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1478

主题

4232

帖子

6

粉丝