一、开发环境
平台: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文章来源:https://www.toymoban.com/news/detail-486105.html
CAN的Seg1和Seg2是有讲究的,特别是用于远距离传输的时候(我的参数配置并不是很好,不过我传的不远,影响不大)。使用最佳的采样点得到的配置,同速率下可以最大化传输距离。采样点=(1+TSEG1)/(1+TSEG1+TSEG2) ,最好在但不超过7/8位时间点上(87.5%)。如果对传输距离有要求,尽量往这个参数靠吧~文章来源地址https://www.toymoban.com/news/detail-486105.html
到了这里,关于STM32F4 CAN驱动配置,以及SEG1,SEG2的最佳配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!