打印
[国产单片机]

单片机应用入坑记录——AT32 CAN波特率计算

[复制链接]
508|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hoop|  楼主 | 2020-12-2 18:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近在研究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))
而我之前还一直都是按照Boudrate =Fpclk/((1+CAN_Prescaler)(3+ CAN_BS1+ CAN_BS2))这个公式来带入计算,所以必然出错
3.实际验证
当设定
SYSCLK=192M
APB1CLK=24M
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;
CAN_InitStructure.CAN_Prescaler = 2;时
按照前述计算方法可以算出Boudrate = 24M/((2)(1+3+8))=1000K,且实测也是1000K
4.总结
其实是比较简单的一个问题,Debug看看寄存器配置值就知道原因了。但是因为是新设计的硬件,所以当时调试的时候一直重点在怀疑我硬件电路问题。疏忽了,没有闪。。。。

使用特权

评论回复
评论
hoop 2020-12-2 20:43 回复TA
@xyz549040622 :确实,不然要走好多弯路 
xyz549040622 2020-12-2 20:21 回复TA
这告诉我们,方向很重要。 

相关帖子

沙发
crk889| | 2020-12-3 17:18 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

322

帖子

0

粉丝