这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» 单片机应用入坑记录——AT32CAN波特率计算

共6条 1/1 1 跳转至

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

菜鸟
2020-12-01 20:09:15 打赏

最近在研究AT32F403A的CAN,发现CAN波特率计算公式计算出来的结果总是不对。花了点时间研究总结了一遍,具体成果如下:

1.问题

RM上介绍的算法如下图

波特率=1/正常的位时间

正常的位时间=1*tq+tBS1+tBS2

简化后的波特率公式为: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看看寄存器配置值就知道原因了。但是因为是新设计的硬件,所以当时调试的时候一直重点在怀疑我硬件电路问题。疏忽了,没有闪。。。。




关键词: CAN 波特率 单片机

工程师
2020-12-01 22:18:33 打赏
2楼

感谢分享


管理员
2020-12-03 17:11:53 打赏
3楼

就喜欢这样的技术文,赞
1606986685602631.jpg


院士
2020-12-06 20:13:44 打赏
4楼

谢谢分享,学习了。


院士
2020-12-10 11:18:17 打赏
5楼

好久没有使用过AT的单片机了


院士
2020-12-13 11:08:08 打赏
6楼

您这么一说,还真是的。

近期中美关系的大环境,的确是中国本土MCU发力的好机会。


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]