这里以STM32F103为例
已知:
1. CAN1挂载在APB1时钟线上,查看时钟配置得到APB1的外设时钟为36M
2. 目标波特率为 125k
3. 采样率设置在80%-90%为佳,最佳为87.5%
计算公式
波特率 = (APB1时钟频率)/(Prescaler *( SW1+BS1+BS2))
采样点 = (1+BS1)/(1+BS1+BS2)
可以看出最佳采样点设置规律BS1=7 BS2=1,这样采样点刚好为87.5%,但是往往事与愿违,这个时候得到的波特率不尽如意,这里就要根据目标波特率,修改BS1和BS2使其采样点为80% - 90%为佳;
另外再多说一下,这里CAN的分频系数设置不用减1,也就是分频系数为1 则不进行分频,分频系数为2 则进行2分频,这里与定时器的分频设置有区别,定时器设置分频系数为0则不进行分频,分频系数为1则为2分频
简单的说:can分频 = 分频系数 timer分频 = 分频系数+1
查看源码可以看到区别
/* CAN分频源码 */
MX_CAN_Init()
HAL_CAN_Init(&hcan)
WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode |
hcan->Init.SJW |
hcan->Init.BS1 |
hcan->Init.BS2 |
(hcan->Init.Prescaler - 1U)));
/* Timer分频源码 */
MX_TIM4_Init()
HAL_TIM_Base_Init(&htim4)
TIM_Base_SetConfig(htim->Instance, &htim->Init)
TIMx->PSC = (uint32_t)Structure->Prescaler;