以STM32F767为例:
- 时间量子 (Tq) =
Prescaler/APB1_Clock - 总 Tq 数 =
1 (Sync_Seg)+BS1+BS2 - 波特率 =
APB1_Clock/ (Prescaler×总Tq数) - 采样点 =
(1 + BS1)/总Tq数
其中,APB1_Clock默认为54Mhz,
波特率=1/【(分频数/APB1周期)*(1+BS1+BS2)】
采样点=(1+BS1)/(1+BS1+BS2)
注意,上面的参数不是实际寄存器的参数,对应HAL库宏定义的参数。
例如以下代码:
hcan1.Init.Prescaler = 18;
hcan1.Init.SyncJumpWidth = CAN_SJW_2TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_8TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;
波特率=1/【(18/54)*(1+8+3)】 = 0.25Mbps=250Kbps
采样点=(1+8)/(1+8+3)=75%
常用参数组:
//500K
hcan1.Init.Prescaler = 9;
hcan1.Init.SyncJumpWidth = CAN_SJW_2TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_8TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;
//1M
hcan1.Init.Prescaler = 3;
hcan1.Init.SyncJumpWidth = CAN_SJW_2TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_13TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_4TQ;
//250K
hcan1.Init.Prescaler = 18;
hcan1.Init.SyncJumpWidth = CAN_SJW_2TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_8TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;