本帖最后由 hoopzhao 于 2020-12-2 10:20 编辑
最近在研究AT32F403A的CAN,发现CAN波特率计算公式计算出来的结果总是不对。花了点时间研究总结了一遍,具体成果如下: 1.问题 RM上介绍的算法如下图
简化后的波特率公式为:Boudrate =Fpclk/((BRP[9:0] + 1)(3 + BS1[3:0] + BS2[2:0])) 但是实际使用BSP库的时候发现,拿结构体配置的CAN_BS1、CAN_BS2以及CAN_Prescaler的配置直接带进去计算出来的波特率时钟永远不对 2.问题原因 深入研究结构体配置与寄存器值关系后,发现 BRP[9:0]为BSP代码中CAN_InitStructure.CAN_Prescaler的设定值减1; BS1[3:0]为BSP代码中CAN_InitStructure.CAN_BS1的设定值减1; BS2[2:0]为BSP代码中CAN_InitStructure.CAN_BS2的设定值减1。 因此从BSP库函数的角度出发,波特率公式应该为:Boudrate =Fpclk/((CAN_Prescaler)(1+ CAN_BS1+ CAN_BS2)) 3.实际验证 SYSCLK=192M CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; CAN_InitStructure.CAN_Prescaler = 2;时 4.总结 其实是比较简单的一个问题,Debug看看寄存器配置值就知道原因了。但是因为是新设计的硬件,所以当时调试的时候一直重点在怀疑我硬件电路问题。疏忽了,没有闪。。。。
|