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

一、开发环境

平台: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.csdn.net/qfmzhu/article/details/126892968
https://cloud.tencent.com/developer/article/1371907

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

你可能感兴趣的:(stm32,单片机,嵌入式硬件)