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

[复制链接]
718|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看看寄存器配置值就知道原因了。但是因为是新设计的硬件,所以当时调试的时候一直重点在怀疑我硬件电路问题。疏忽了,没有闪。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

@xyz549040622 :确实,不然要走好多弯路  发表于 2020-12-2 20:43
这告诉我们,方向很重要。  发表于 2020-12-2 20:21
crk889 发表于 2020-12-3 17:18 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

322

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部