一、问题描述
以下是GD32F205 CAN0的配置代码,将CAN0的波特率设置为125kbps。其中影响波特率的几个关键参数为resync_jump_width、time_segment_1、time_segment_2和prescaler,下面就详细探讨下几个参数的关系。
can_parameter_struct can_parameter;
can_parameter.time_triggered = DISABLE;
can_parameter.auto_bus_off_recovery = DISABLE;
can_parameter.auto_wake_up = DISABLE;
can_parameter.no_auto_retrans = DISABLE;
can_parameter.rec_fifo_overwrite = DISABLE;
can_parameter.trans_fifo_order = DISABLE;
can_parameter.working_mode = CAN_LOOPBACK_MODE;
/* configure baudrate to 125kbps */
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_4TQ;
can_parameter.prescaler = 48;
can_init(CAN0, &can_parameter);
二、官方描述
GD32官方的描述入下,
![](https://img-blog.csdnimg.cn/b1bf36226bea4e8a9d3c2eaa4462692e.png)
简言之
![Baudrate=\frac{PCLK}{PSC*(SJW+BS1+BS2)}](https://latex.csdn.net/eq?Baudrate%3D%5Cfrac%7BPCLK%7D%7BPSC*%28SJW+BS1+BS2%29%7D)
因此
![PSC=\frac{PCLK}{Baudrate*(SJW+BS1+BS2)}](https://latex.csdn.net/eq?PSC%3D%5Cfrac%7BPCLK%7D%7BBaudrate*%28SJW+BS1+BS2%29%7D)
由于PSC要为整数,所以在确定的波特率下,要选择合适的SJW、BS1和BS2。SWJ的取值范围为1~4,BS1的取值范围为1~16,BS2的取值范围为1~8。关于SWJ、BS1和BS2这三个参数的描述入下,建议详细阅读。
![](https://img-blog.csdnimg.cn/4f12dc8842b642bda469bedfc8c0afae.png)
![](https://img-blog.csdnimg.cn/932768f8ec494f72a81613e7aed0c3f1.png)
三、例子
以下举几个例子
/*******************************************
* PCLK时钟为60MHz,配置波特率为125kbps
* 60000/((1+5+4)*48) = 125
*******************************************/
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_4TQ;
can_parameter.prescaler = 48;
can_init(CAN0, &can_parameter);
/*******************************************
* PCLK时钟为60MHz,配置波特率为250kbps
* 60000/((1+5+4)*24) = 250
*******************************************/
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_4TQ;
can_parameter.prescaler = 24;
can_init(CAN0, &can_parameter);
/*******************************************
* PCLK时钟为60MHz,配置波特率为500kbps
* 60000/((1+6+5)*10) = 500
*******************************************/
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_6TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_5TQ;
can_parameter.prescaler = 10;
can_init(CAN0, &can_parameter);