STM32F4 CAN驱动配置,以及SEG1,SEG2的最佳配置

本文详细介绍了如何在MDK5环境下,使用STM32F407VG单片机和HAL库V1.8.1版本,配置CAN1接口在APB1时钟42MHz下工作于500KBps。主要步骤包括GPIO和CAN时钟的开启,CAN引脚配置,CAN初始化设置,以及过滤器和中断的配置。文章还提及了波特率计算和优化传输参数的重要性,尤其是采样点的选择,以确保最佳传输性能和距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、开发环境

平台:MDK5
单片机型号:STM32F407VG
HAL库版本:V1.8.1

二、配置程序

该程序在APB1时钟为42M速率的情况下,将CAN配置为500KBps.

void can_init(void)
{
		GPIO_InitTypeDef GPIO_InitStruct;
    
		// 开启GPIOA和CAN1时钟
		__HAL_RCC_GPIOA_CLK_ENABLE();
		__HAL_RCC_CAN1_CLK_ENABLE();
		
		// 配置PA11和PA12为CAN1模式
    GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
		// 配置CAN1
    hcan1.Instance = CAN1;
    hcan1.Init.Prescaler = 4;
    hcan1.Init.Mode = CAN_MODE_NORMAL;
    hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
    hcan1.Init.TimeSeg1 = CAN_BS1_12TQ;
    hcan1.Init.TimeSeg2 = CAN_BS2_8TQ;
    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();
    }

		// 配置CAN1过滤器
    CAN_FilterTypeDef sFilterConfig;
    sFilterConfig.FilterIdLow = 0x0000;
    sFilterConfig.FilterIdHigh = 0x0000;
    sFilterConfig.FilterMaskIdLow = 0x0000;
    sFilterConfig.FilterMaskIdHigh = 0x0000;
    sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    sFilterConfig.FilterBank = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterActivation = ENABLE;
    if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK) {
        Error_Handler(); // 可以自定义错误处理函数
    }

		// 使能CAN1
    if (HAL_CAN_Start(&hcan1) != HAL_OK) {
        Error_Handler(); // 可以自定义错误处理函数
    }

		// 使能CAN中断
		HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
}

三、关于波特率的计算

通过SystemClock_Config函数,将主频配置为168M(最大),APB1为42M(最大)。CAN的波特率=42M/(1 + TimeSeg1 + TimeSeg2) = 42M/(1+12+8)=500Kbps。

四、关于CAN传输参数的最佳配置

先附上参考链接
https://blog.youkuaiyun.com/qfmzhu/article/details/126892968
https://cloud.tencent.com/developer/article/1371907

CAN的Seg1和Seg2是有讲究的,特别是用于远距离传输的时候(我的参数配置并不是很好,不过我传的不远,影响不大)。使用最佳的采样点得到的配置,同速率下可以最大化传输距离。采样点=(1+TSEG1)/(1+TSEG1+TSEG2) ,最好在但不超过7/8位时间点上(87.5%)。如果对传输距离有要求,尽量往这个参数靠吧~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值