历史上的今天
返回首页

历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2019年10月08日 | STM32 CAN 波特率、采样点设置

2019-10-08 来源:eefocus

为了总结在STM32上设置CAN波特率和采样点,所以整理自己的理解如下:


一,CAN波特率


1.CAN位时序

2.公式推导


这里Tpclk理解成CAN时钟的周期(实际上CAN使用APB1时钟)


根据图中公式有:


(1)  正常的位时间(Tnbt) = (1+Tbs1 + Tbs2)*Tq


(2)  Tq = (BRP+1)*Tpclk 


设CAN时钟频率为Fpclk,则有


(3)  Tq = (BRP+1)/Fpclk


由(1),(3)有:


(4)  Tnbt =(1+Tbs1 + Tbs2)* (BRP+1) / Fpclk


由(4)知CAN输出波特率(Fcan = 1 / Tnbt )为:


Fcan = Fpclk / ( (1+Tbs1 + Tbs2)* (BRP[9:0]+1) )


3.程序配置


a.预备知识:


在stm32手册中BTR寄存器内容如下:


公式:Fcan = Fpclk / ( (1+Tbs1 + Tbs2)* (BRP[9:0]+1) )结合上表有:


Fcan = Fpclk  / ( (1 + (TS1[3:0] + 1) + (TS2[2:0] + 1) ) * (BRP[9:0]+1))


在 stm32f10x.h中有:


    /*******************  Bit definition for CAN_BTR register  ********************/

#define  CAN_BTR_BRP                         ((uint32_t)0x000003FF)        /*!< Baud Rate Prescaler */

#define  CAN_BTR_TS1                         ((uint32_t)0x000F0000)        /*!< Time Segment 1 */

#define  CAN_BTR_TS2                         ((uint32_t)0x00700000)        /*!< Time Segment 2 */

#define  CAN_BTR_SJW                         ((uint32_t)0x03000000)        /*!< Resynchronization Jump Width */

#define  CAN_BTR_LBKM                        ((uint32_t)0x40000000)        /*!< Loop Back Mode (Debug) */

#define  CAN_BTR_SILM                        ((uint32_t)0x80000000)        /*!< Silent Mode */


在stm32f10x_can.h中有:


#define CAN_BS1_1tq                 ((uint8_t)0x00)  /*!< 1 time quantum */

#define CAN_BS1_2tq                 ((uint8_t)0x01)  /*!< 2 time quantum */


...


#define CAN_BS2_1tq                 ((uint8_t)0x00)  /*!< 1 time quantum */

#define CAN_BS2_2tq                 ((uint8_t)0x01)  /*!< 2 time quantum */


...


由上可知表示值比实际值大1,Tbs1 = Tq*(TS1[3:0] + 1) 等价于 Tbs1 = Tq*CAN_BS1_xtq,CAN_BS1_xtq即为表示值




在stm32f10x_can.c中CAN_Init接口中设置BTR部分有:


        /* Set the bit timing register */

        CANx->BTR = ( uint32_t )(( uint32_t )CAN_InitStruct->CAN_Mode << 30 ) |

                    (( uint32_t )CAN_InitStruct->CAN_SJW << 24 ) |

                    (( uint32_t )CAN_InitStruct->CAN_BS1 << 16 ) |

                    (( uint32_t )CAN_InitStruct->CAN_BS2 << 20 ) |

                    (( uint32_t )CAN_InitStruct->CAN_Prescaler - 1 );


由上边代码可知BTR的BRP[9:0]的值为CAN_Prescaler - 1


从2中所推导的公式可知:


CAN波特率 = CAN时钟/( (1 + CAN_BS1 + CAN_BS2)  * CAN_Prescaler)




举个例子:


/* CAN cell init */


CAN_InitStructure.CAN_TTCM=DISABLE;


CAN_InitStructure.CAN_ABOM=DISABLE;


CAN_InitStructure.CAN_AWUM=DISABLE;


CAN_InitStructure.CAN_NART=DISABLE;


CAN_InitStructure.CAN_RFLM=DISABLE;


CAN_InitStructure.CAN_TXFP=DISABLE;


CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;


CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;


CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;


CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;


CAN_InitStructure.CAN_Prescaler=5;


CAN_Init(&CAN_InitStructure);100k


 


/* CAN cell init */CAN_Interrupt


CAN_InitStructure.CAN_TTCM=DISABLE;


CAN_InitStructure.CAN_ABOM=DISABLE;


CAN_InitStructure.CAN_AWUM=DISABLE;


CAN_InitStructure.CAN_NART=DISABLE;


CAN_InitStructure.CAN_RFLM=DISABLE;


CAN_InitStructure.CAN_TXFP=DISABLE;


CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;


CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;


CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;


CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;


CAN_InitStructure.CAN_Prescaler=1;


CAN_Init(&CAN_InitStructure);//500k


 


如果CAN时钟为8M, CAN_BS1 = 8,CAN_BS2 = 7,CAN_Prescaler = 5


那么波特率就是=8M/(1+8+7)/5=100K



二,CAN采样点


有上面可知得到相同的波特率  CAN_BS1,CAN_BS2会有多种组合,而采样点由这2个参数确定,计算公式为:


sample = ( 1 +  CAN_BS1) /  (1 +  CAN_BS1 +  CAN_BS2)


参看这篇文章,采样点设置在80%到80.75%之间比较好。




参考资料:


http://lib.csdn.net/article/embeddeddevelopment/29438


http://www.61ic.com/Technology/embed/201103/31046.html


 《ISO 11898-1-2003》


《STM32_RM_CH_V10_1》

推荐阅读

史海拾趣

EETools公司的发展小趣事

EETools公司成立于1992年,当时正值微处理器开发工具行业蓬勃发展的时期。公司创始人凭借对嵌入式系统产品的深刻理解和市场需求的敏锐洞察,决定投身于这一领域。EETools在硅谷的电子和计算机行业中心设立总部,迅速成为该地区的一颗新星。

在初创阶段,EETools专注于嵌入式系统产品的咨询和分销业务。通过与多家知名半导体厂商建立合作关系,EETools成功将各种高性能的嵌入式系统产品引入市场,满足了客户多样化的需求。同时,公司还积极研发自主品牌的嵌入式开发工具,为客户提供更为全面和专业的服务。

富满电子(FM)公司的发展小趣事

EETools始终坚持以客户为中心的服务理念。公司深入了解不同行业客户的需求和痛点,为他们提供定制化的嵌入式系统解决方案。无论是医疗设备、汽车电子还是工业自动化等领域,EETools都能为客户提供高效、可靠的嵌入式开发工具和服务。这种以客户需求为导向的服务模式不仅赢得了客户的信任和好评,还为公司赢得了更多的商业机会。

e2v technologies公司的发展小趣事

在医疗领域,e2v也积极发挥其作用。公司针对放射治疗系统提供了价格合理、易于运输和安装的国内制造设备,支持中国各地医院和诊所的放射治疗工作。这些设备不仅提高了放射治疗的效果和效率,也为患者带来了更好的治疗体验。

Ford Aerospace & Communications Corp公司的发展小趣事

随着航空业的逐渐发展,福特汽车公司意识到航空通信技术的重要性。在20世纪30年代,福特开始投资研发航空无线电通信系统,旨在提高飞行中的通信效率和安全性。这一举措不仅促进了福特在航空技术领域的进一步拓展,也为后来的航空通信标准制定提供了参考。

Dynex公司的发展小趣事

在汽车制造领域,福特一直是技术创新的领导者。20世纪60年代,福特开始将电子设备集成到汽车中,包括车载电话、导航系统以及早期的娱乐系统。这些创新不仅提升了驾驶的便捷性和舒适性,也预示着未来汽车电子化、智能化的趋势。虽然这些技术并不直接属于航空通信范畴,但它们展示了福特在电子技术应用方面的前瞻性和实力。

ELMEC Technology Of America Inc公司的发展小趣事

随着环保意识的不断提高,ELMEC开始关注企业的环保责任。他们采用环保材料替代传统材料,减少生产过程中的污染排放。同时,公司还积极开展绿色能源研发和应用,降低能耗和碳排放。这些措施不仅为公司赢得了良好的社会声誉,也为推动电子行业的可持续发展做出了积极贡献。

问答坊 | AI 解惑

6410跑WINCE60系统,可以跑起来,但跑不了几下就报异常,然后就挂了

6410能正常的跑WINCE60,如果不进行操作,到没有异常,能正常运行,只要进行一些操作,系统就报异常,串口打印异常,不知道原因在哪里。 我分析一下可能的原因:     1.最有可能就是DDR的问题,但为什么系统能正常完全的跑起来(证明DD ...…

查看全部问答>

读取 windows mobile flash 上存储的数据

各位高手: 在wm5中,怎么区分数据是存储在RAM中还是存储在flash闪存中?我要读取存在flash中的所有数据应该如何做? 我弄了很久还是没搞清楚数据在wm中是怎么存储的。…

查看全部问答>

ce platform builder 5.0怎样设置warning level??回贴有分

编译时老是有warning as error出现.请问设置warning level可以解决吗? 如果可以请说明设置方法.谢谢…

查看全部问答>

求救

谁能推荐我些 关于底层的 详细阐述wince中断的书籍给我? …

查看全部问答>

关于sqlite的问题

Win32 下写入sqlite 数据库(Delphi),把这个sqlite 数据库拷贝到 WINCE 上 中文读不出来(Vs2005)? 大家怎么解决? 另谁有ACCESS转Sqlite的工具 发我一个 4840258@163.com 谢谢!!…

查看全部问答>

在wince4.2下用TCP做服务器端通讯,数据量大,wince 就不能再通讯,除非重启wince,这是为什么呀?

在wince4.2下用TCP做服务器端通讯,数据量大,wince 就不能再通讯,除非重启wince,这是为什么呀? 我用的开发板是远峰2410的,请哪位大哥知道的,不防指导小弟一般!…

查看全部问答>

UMC_18_CMOS库中电容MIMCAPM_MM版图连线

本人初涉模拟版图碰到这种形状的版图不知如何连接,它的接触孔分成两部分,其中一部分有MMC另一部分没有,请问是连其中一个还是全部都要连在一起,金属5,6中间有通孔岂不是短路啦,多谢!…

查看全部问答>

【求助】F449驱动12位数字玻璃液晶,用手按住晶振就稳定显示,松开后显示几乎看不到

F449驱动玻璃液晶片,用手按住晶振就稳定显示,松开后显示几乎看不到。 以下几种方法无效。 1.晶振接30pF电容。 2.晶振外壳接地。 3。在r03/r13/r23/r33接对地电容。 4。改变程序中的频率。 注:某次,发现在程序中修改FLL_CTL0 = XCAP18PF为 ...…

查看全部问答>

为什么串口接收中断会反复被触发执行

void UART1_ISR(void) {     unsigned long ulStatus;     ulStatus=UARTIntStatus(UART1_BASE,true);     //   读取当前中断状态     UARTIntClear(UART1_BASE,ulStatus);//&n ...…

查看全部问答>

要MSP430的开发板

为了团购开发板…

查看全部问答>