STM32_CAN波特率计算
- 格式:doc
- 大小:148.00 KB
- 文档页数:8
STM32 单片机的串口波特率计算方法
1. 什幺是波特率
不管是什幺单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。
什幺是波特率:波特率就是每秒传送的字节数。
双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。
下面以STM32 单片机为例,讲解一下串口波特率的计算方法。
2. STM32 波特率相关的寄存器
STM32 单片机设置波特率的寄存器只有一个:USART_BRR 寄存器,如下图所示。
该寄存器的有效位数为16 位,前4 位用于存放小数部分,后12 位用于存放整数部分。
将波特率算出来后,数值填入这个波特率就可以了。
下面介绍。
can 波特率计算公式波特率是指单位时间内传输的信号次数,通常以每秒钟传输的位数来表示。
在计算机通信领域,波特率的计算非常重要,因为它决定了数据的传输速率和通信效率。
波特率计算的公式如下:波特率 = 总传输比特数 / 传输时间其中,总传输比特数表示在指定时间内要传输的比特数,传输时间为完成传输所需的时间。
在实际应用中,波特率的计算可以用于帮助确定合适的通信速率,从而提高数据传输的效率。
下面将详细介绍如何根据公式计算波特率。
首先,确定要传输的数据量。
这可以是文件的大小或数据包的数量,根据实际情况来决定。
然后,确定传输所需的时间。
这取决于系统的传输速率以及传输距离。
常见的传输速率单位有Mbps(兆比特每秒)或Kbps(千比特每秒),传输距离单位有米(m)或千米(km)。
接下来,根据数据量和传输时间,使用上述的公式进行计算。
将总传输比特数除以传输时间,即可得到所需的波特率。
在计算波特率时,还需要考虑数据传输过程中的误码率。
误码率是指传输过程中出现错误比特的比率。
通常情况下,为了保证数据传输的可靠性,会在计算波特率时留出一部分比特用于冗余校验和纠错码。
此外,波特率的计算还与数据传输的传输协议和信号编码方式有关。
常见的传输协议有RS-232、RS-485等,常见的信号编码方式有非归零码、曼彻斯特编码等。
在计算波特率时,需要根据具体的协议和编码方式来选择合适的公式和参数。
总之,波特率计算是计算机通信中非常重要的一部分。
通过合理计算波特率,可以提高数据传输的速率和效率,从而提升整个通信系统的性能。
因此,在实际应用中,要认真研究波特率计算的公式和相关参数,以确保数据传输的可靠性和稳定性。
500K/S的计算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;每一位的Tq数目= 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16 如果CAN时钟是8 MHz : (8M / 1 ) / 16 = 500K其中:1 为分频系数16 为每一位的Tq数目为了设置为100K, 把分频系数改为5即可, BS1 BS2 不变每一位的Tq数目= 1 (固定) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是8 MHz : (8M / 5 ) / 16 = 100K如果想得到1M 的波特率,CAN时钟仍然是8 MHz的情况下,分频系数不变应该改变BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的Tq数目= 1 (固定) + 5 (BS1) + 2 (BS2) = 8如果CAN时钟是8 MHz : (8M / 1 ) / 8 = 1000K另外尽可能的把采样点设置为CiA 推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于100K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于500K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于1000K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+5) / (1+5+2) = 75%个人见解, 仅供参考。
STM32CAN波特率设置及采样点设置
⼀、CAN波特率
STM32 位时间定义:
●同步段(SYNC_SEG):通常期望位的变化发⽣在该时间段内。
其值固定为1
个时间单元(1 x tCAN)。
●时间段1(BS1):定义采样点的位置。
它包含CAN 标准⾥的 PROP_SEG 和
PHASE_SEG1。
其值可以编程为1 到16 个时间单元,但也可以被⾃动延
长,以补偿因为⽹络中不同节点的频率差异所造成的相位的正向漂移。
●时间段2(BS2) :定义发送点的位置。
它代表CAN 标准⾥的
PHASE_SEG2。
其值可以编程为1 到8 个时间单元,但也可以被⾃动缩短
以补偿相位的负向漂移
BRP[9:0]: 波特率分频器
PCLK1 = 36M
bps = 36M/(BRP[9:0]*(BS1+BS2+SYNC_SEG))
其中SYNC_SEG固定为1个时间单元所以 bps = 36M/(BRP[9:0]*(BS1+BS2+1)),此时注意跟同步跳转宽度SJW没关系,尽管他也⼀直设置为1.
⼆、CAN采样点
采样点位于时间段1和时间段2之间。
根据CIA推荐采样点,最好设置在85%~90%。
在⽹上查了好多,基本上都是这么计算(BS1+1)/(1+BS1+BS2),得出的结果就是BS1⽐较⼤⽽BS2⽐较⼩基本上为1.。
STM32_CAN波特率计算在STM32中,可以使用以下公式来计算CAN总线的波特率:波特率 = APB1_CLK / (prescaler * (sjw + bs1 + bs2 + 1))其中,APB1_CLK 是STM32的外设时钟频率,可以通过RCC_ClocksTypeDef 结构体获取。
prescaler 是一个16位的数,取值范围是1-1024、sjw (同步跳转宽度)、bs1 (位段1长度) 和 bs2 (位段2长度) 取值范围为0-15通常,CAN总线的波特率设置取决于硬件限制和所需的通信速度。
下面是一些常见的波特率计算示例:1. 125 kbps:APB1_CLK = 72 MHz,prescaler = 6,sjw = 1,bs1 = 11,bs2 = 42. 250 kbps:APB1_CLK = 72 MHz,prescaler = 3,sjw = 1,bs1 = 11,bs2 = 43. 500 kbps:APB1_CLK = 72 MHz,prescaler = 3,sjw = 1,bs1 = 7,bs2 = 4 4. 1 Mbps:APB1_CLK = 72 MHz,prescaler = 3,sjw = 1,bs1 = 3,bs2 = 4需要注意的是,上述示例中的波特率计算公式假设CAN_BS2=1,可以根据实际需要进行调整。
在实际应用中,还需要根据硬件布线、传输距离和抗干扰能力等因素对波特率进行调整和优化。
同时,还应考虑位定时误差和失败重传等问题,以确保可靠的通信。
因此,在使用STM32_CAN时,建议参考ST提供的相关文档和应用注释,根据实际需求进行波特率计算和配置。
STM32CAN发送接收的简单测试can接⼝相对是⼀种常⽤的串⾏接⼝,但是不像spi、i2c、uart等接⼝都有主从的关系,can可以任何⼀个节点主动发送数据,并且假如出现总线冲突会有硬件来处理。
can和rs485⼜有些类似,都是把ttl信号转换成了差分信号。
所以在stm32 使⽤can的时候会有⼀个can收发器。
STM32 CAN 发送的简单测试从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。
所以假如我们要测试can的发送,是不是只接can tx脚就可以了?我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样⾏不通的。
因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对⽐,是不是⼀致就知道总线有没有冲突。
所以在正常情况(这⾥意味着⾮正常情况下也可以)下can rx不接就到这发送出去的数据⽆法收到从⽽硬件⾃动判断为发送失败。
所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。
硬件上就这些主要注意点,接下来就主要是软件的配置了。
⼀般stm32 配置can有以下⼏⼤步骤:can的初始化(cubemx直接可以⽣成代码)can的启动can滤波器的设置(⽤来接收的,发送的时候可以不⽤配置它)can执⾏发送数据请求我们只测试can的发送,所以就只⽤关系1、2、4步骤就可以了。
第⼀步,配置stm32cubemxSTM32 CAN 发送的简单测试如上图所⽰,最关键主要配置如下三个参数,分频数我这⾥配置48,下⾯的time Quantum值就会⾃动计算出来。
因为can时钟是48mhz经过48分频后,⼀个单位时间就是1us=1000ns。
因为我想要100k波特率,然后填写下⾯的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。
那么具体波特率该怎么计算还是要看看官⽅⼿册的描述:STM32 CAN 发送的简单测试根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。
STM32CAN波特率计算在STM32系列微控制器中,CAN(Controller Area Network)的波特率计算可以使用以下公式:波特率=(APB1时钟频率)/(CAN分频器x(1+BSG1+BSG2))其中,APB1时钟频率是TIMx对应的APB1总线的时钟频率(单位为Hz)。
CAN分频器是BRP寄存器的值,用于将APB1时钟分频为CAN时钟。
BSG1和BSG2分别是SJW和BS1计数器和BS2计数器的值,用于确定CAN位定时器的时间段。
具体的计算步骤如下:1.确定APB1时钟频率。
在使用CAN之前,需要先设置APB1总线的时钟频率。
可以通过查阅STM32的参考手册或芯片数据手册来获取APB1时钟频率的值。
2.确定CAN分频器的值。
根据需要的波特率,以及APB1时钟频率,可以计算出CAN分频器的值。
公式如下:CAN分频器=(APB1时钟频率)/(波特率x(1+BSG1+BSG2))通常情况下,CAN分频器的值范围为1到10243.确定BSG1和BSG2的值。
BS1和BS2的值通常介于1到16之间。
它们的和(BS1+BS2)确定了CAN位定时器的长度。
其中,BS1用于传输的时间段,包括同步段、传输段和前部分的惯例部分。
而BS2用于接收的时间段,包括后部分的惯例部分和重同步段。
通常情况下,可以选择BS1和BS2的值为84.计算波特率。
将得到的CAN分频器、BSG1和BSG2的值带入公式:波特率=(APB1时钟频率)/(CAN分频器x(1+BSG1+BSG2))即可计算出所需的波特率。
需要注意的是,以上公式是用于计算CAN的时钟频率,实际的波特率可能会稍有偏差。
如果精确的波特率很关键,则可以进一步对BRP和BS1/BS2进行微调来达到所需的精度。
这是一个简化的波特率计算方法。
对于更复杂或特定的应用场景,建议参考STMicroelectronics提供的CAN计算器工具或查阅相关资料来进行具体的计算。
一般设置CAN_SJW = 1,总结程序发现!!!can时钟是RCC_APB1PeriphClock(APB1从APB2而来,分频系数不同,导致APB1不同,mini版中一般是APB2为72Mhz,APB1是36MHz),你要注意CAN时钟频率CAN波特率=RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler ;另外尽可能的把采样点设置为CiA 推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于100K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%CAN波特率计算—网友总结STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用.bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟:APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图:有了上边的这个图,基本就清楚了.总线时钟MHz (3+TS1+TS2)*(BRP+1)===================================================下面是我的计算:CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;(lyp发现大部分都是设置这个SJW为1tq,导致一些人把这个当做一个系数,这是错误的,因为这个公式里的1tq是固定的同步段(SYNC_SEG),与SJW无关!!!)CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;CAN_InitStructure.CAN_Prescaler = 4;//2nominal bit time(3+5+1)tq=9tq关于分频系数查看system_stm32f10x.c下面的static void SetSysClockTo72(void) 函数/* HCLK = SYSCLK *//* PCLK2 = HCLK *//* PCLK1 = HCLK/2 */所以can时钟72MHZ/2/4=9 Mhz????????============================================================================================= void CAN_Configuration(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;/* CAN register init */CAN_DeInit();CAN_StructInit(&CAN_InitStructure);/* 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_Normal;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;CAN_InitStructure.CAN_Prescaler=200;CAN_Init(&CAN_InitStructure);/* CAN filter init */CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMa sk;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);}注意//#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */拨特率10K,公式:72MHZ/2/200/(1+9+8)=0.01,即10K,和SJA1000测试通过================================================120欧姆电阻要加上!!!哦确实是CAN->BTR = (u32)((u32)CAN_InitStruct->CAN_Mode << 30) | ((u32)CAN_InitStruct->CAN_SJW << 24) |((u32)CAN_InitStruct->CAN_BS1 << 16) |((u32)CAN_InitStruct->CAN_BS2 << 20) |((u32)CAN_InitStruct->CAN_Prescaler - 1);总结一下Fpclk=36M 时can波特率为250k 的配置为/* 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=9;CAN_Init(&CAN_InitStructure); 250k======================================的:将can总线波特率设置为250k在官方的can例程上给出了100k 查询和500k 中断方式的例子分别设置如下:CAN_Polling:/* 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_InterruptCAN_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_SJW = 1,总结程序发现!!!can时钟是RCC_APB1PeriphClock(APB1从APB2而来,分频系数不同,导致APB1不同,mini版中一般是APB2为72Mhz,APB1是36MHz),你要注意CAN时钟频率CAN波特率=RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler; 如果CAN时钟为8M,CAN_SJW = 1,CAN_BS1 = 8,CAN_BS2 =7,CAN_Prescaler = 2那么波特率就是=8M/(1+8+7)/2=250K=========================================得到500Kb/s的波特率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;每一位的Tq数目= 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是8 MHz : (8M / 1 ) / 16 = 500K其中:1 为分频系数16 为每一位的Tq数目为了设置为100K, 把分频系数改为5即可, BS1 BS2 不变每一位的Tq数目= 1 (固定) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是8 MHz : (8M / 5 ) / 16 = 100K如果想得到1M 的波特率,CAN时钟仍然是8 MHz的情况下,分频系数不变应该改变BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的Tq数目= 1 (固定) + 5 (BS1) + 2 (BS2) = 8如果CAN时钟是8 MHz : (8M / 1 ) / 8 = 1000K另外尽可能的把采样点设置为CiA 推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于100K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于500K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于1000K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+5) / (1+5+2) = 75%个人见解, 仅供参考。
s t m32_c a n波特率设置指南STM32的CAN波特率计算STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用.bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟:APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图:有了上边的这个图,基本就清楚了.总线时钟MHz (3+TS1+TS2)*(BRP+1)===================================================下面是我的计算:CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;注意//#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;CAN_InitStructure.CAN_Prescaler = 4;//2nominal bit time(3+5+1)tq=9tq关于分频系数查看 system_stm32f10x.c下面的static void SetSysClockTo72(void) 函数/* HCLK = SYSCLK *//* PCLK2 = HCLK *//* PCLK1 = HCLK/2 */所以can时钟 72MHZ/2/4=9 Mhztq=1/36Mhz波特率为 1/nominal bit time= 9/9=1MHZ=========================================-----------------------------------------------==================================================== void CAN_Configuration(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;/* CAN register init */CAN_DeInit();CAN_StructInit(&CAN_InitStructure);/* CAN cell init */CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;CAN_InitStructure.CAN_Prescaler=200;CAN_Init(&CAN_InitStructure);/* CAN filter init */CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);}注意//#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */拨特率10K,公式:72MHZ/2/200/(1+9+8)=0.01,即10K,和SJA1000测试通过================================================120欧姆电阻要加上!!!哦确实是CAN->BTR = (u32)((u32)CAN_InitStruct->CAN_Mode<< 30) |((u32)CAN_InitStruct->CAN_SJW << 24) |((u32)CAN_InitStruct->CAN_BS1 << 16) | ((u32)CAN_InitStruct->CAN_BS2 << 20) |((u32)CAN_InitStruct->CAN_Prescaler - 1);总结一下Fpclk=36M 时 can波特率为250k 的配置为/* 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_Prescaler=9;CAN_Init(&CAN_InitStructure); 250k======================================的:将can总线波特率设置为250k在官方的can例程上给出了100k 查询和500k 中断方式的例子分别设置如下:CAN_Polling:/* 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_InterruptCAN_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); //500kcan时钟是RCC_APB1PeriphClock,你要注意CAN时钟频率CAN波特率 =RCC_APB1PeriphClock/CAN_SJW+CAN_BS1+CAN_BS2/CAN_Prescaler; 如果CAN时钟为8M, CAN_SJW = 1,CAN_BS1 = 8,CAN_BS2 = 7,CAN_Prescaler = 2那么波特率就是=8M/(1+8+7)/2=250K=========================================得到500Kb/s的波特率CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;每一位的Tq数目 = 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是 8 MHz : (8M / 1 ) / 16 = 500K其中:1 为分频系数16 为每一位的Tq数目为了设置为 100K, 把分频系数改为5即可, BS1 BS2 不变每一位的Tq数目 = 1 (固定) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是 8 MHz : (8M / 5 ) / 16 = 100K如果想得到 1M 的波特率, CAN时钟仍然是 8 MHz的情况下,分频系数不变应该改变 BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的Tq数目 = 1 (固定) + 5 (BS1) + 2 (BS2) = 8如果CAN时钟是 8 MHz : (8M / 1 ) / 8 = 1000K另外尽可能的把采样点设置为CiA推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于 100K 的波特率(假定使用 8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于 500K 的波特率(假定使用 8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于 1000K 的波特率(假定使用 8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+5) / (1+5+2) = 75%个人见解, 仅供参考。
stm32f407CAN配置-2020-11-021、虽然stm32f4系列具有两个CAN控制器,但是stm32f407只有⼀个CAN。
2、CAN_Prescaler最终值是等于设置值加⼀,存储于BRP寄存器⾥,Fpclk1是APB1总线的时钟,最⼤值为APB2总线时钟84MHz/2=42MHz。
3、CAN波特率=Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler),举例:CAN波特率=42MHz/((7tq+6tq+1)*6)=500kbps。
4.0、CAN_InitStruct关键成员的含义如下:4.1、CAN_Prescaler控制时间⽚tq的长度;4.2、CAN_Mode包括正常模式、回环模式、静默模式、回环静默模式;4.3、CAN_SJW⽤于设置极限长度,即重新同步时单次可增加或缩短的最⼤长度,范围为1~4tq;4.4、CAN_BS1、CAN_BS2位时序,前者范围1~16tq,后者1~8tq;4.5、FunctionalState使能或失能某些的状态;4.6、CAN_TICM是否使⽤为时间触发的功能;4.7、CAN_ABOM是否使⽤⾃动离线管理,使能后可在节点离线后⾃动恢复⽽不需要软件来⼲预;4.8、CAN_AWUM是否使⽤⾃动唤醒功能,使能后可在监测到总线活动后⾃动唤醒;4.9、CAN_NART是否使⽤⾃动重传功能,使能后会⼀直发送报⽂直到成功为⽌;4.10、CAN_RFLM是否使⽤锁定接收FIFO,如果使能锁定,那么当FIFO溢出后就会丢弃新的数据,否则就是使⽤新的数据覆盖原有数据;4.11、CAN_TXFP⽤于设置发送报⽂的优先级⽅法,使能之后将以报⽂存⼊邮箱的先后顺序来发送,否则按照报⽂的ID的优先级进⾏发送;5.0、CAN_FilterInitStruct的关键成员含义如下:5.1、CAN_FilterMaskId有两种情况,当筛选器处于标识符列表模式下时,和CAN_FilterId类似,都是存储要筛选的ID,⽽当筛选器⼯作在掩码模式下,存储的是CAN_FilterId对应的掩码;5.2、CAN_FilterFIFOAssignment⽤于设置当报⽂通过筛选器以后存储到哪⼀个接收的FIFO⾥,范围为FIFO0或FIFO1;5.3、CAN_FilterNumber的范围为0~27,⼀共28个筛选器;5.4、CAN_FilterMode可设置成列表模式和掩码模式;5.5、CAN_FilterScale⽤于设置筛选器的位宽,可选16位或32位;5.6、CAN_FilterActivation⽤于设置是否激活该筛选器;6、CAN_IT_FMPO:消息挂号允许中断7.0、CanTxMsg结构体关键成员含义如下:7.1、StdId存储报⽂的11位标准标识符,范围为0x0~0x7FF;7.2、ExtId存储报⽂的29位扩展标识符;7.3、IDE⽤于配置选择使⽤StdId还是ExtId;7.4、RTR是⽤于存储报⽂类型的标志,可配置选择为数据帧还是遥控帧,通常配置成使⽤数据帧,因为遥控帧没有数据段,所以Data[8]中的成员是没有内容的;7.5、DLC⽤于存储数据帧的数据长度,范围0~8字节,如果已配置成遥控帧,该参数可配置为0;8、CanRxMsg结构体中的FMI⽤于存储筛选器的编号,也表⽰了是经过哪个FIFO进⾏接收的,可⽤于简化软件处理。
STM32_STM8CAN波特率设置计算器CAN总线的波特率是由总线速度和传输协议决定的。
对于STM32和STM8微控制器,可以使用以下公式来计算CAN总线的波特率:BS1 = (tbs1 - 1) (tbs1的范围为[1,16])BS2 = (tbs2 - 1) (tbs2的范围为[1,8])时间量化器单位时间为(1 + tbs1 + tbs2)个时间单元以下是一个使用Python编写的STM32和STM8 CAN波特率设置计算器的示例代码:```pythonimport mathBS1 = tbs1 - 1BS2 = tbs2 - 1quanta_per_bit = tbs1 + tbs2 + tbs3 + 1BRP=BRP-1while BRP > 0x3FF:quanta_per_bit *= 2BRP/=2return (int(BRP), quanta_per_bit, BS1, BS2)tbs1 = 9tbs2 = 4tbs3 = 4print("BRP:", result[0])print("Quanta per bit:", result[1])print("BS1:", result[2])print("BS2:", result[3])```在这个示例中,假设APB1时钟频率为36MHz,每个位时间为125个时钟周期,同步段为9个时间单元,时间段1为4个时间单元,时间段2为4个时间单元,CAN控制器的时钟频率为36MHz。
运行这个示例代码,将会得到以下的输出:BRP:11Quanta per bit: 20BS1:8BS2:3输出结果表示波特率分频器的分频系数BRP为11,每个位时间的时钟周期数为20个时钟周期,同步段时间为9个时间单元,时间段1时间为8个时间单元,时间段2时间为3个时间单元。
STM32的CAN波特率计算
CAN(Controller Area Network)总线是一种用于通信和控制的串行总线协议,常用于汽车、工业控制等领域。
在STM32微控制器中,包含了内置的CAN控制器,可以方便地实现对CAN总线的数据收发。
CAN总线的波特率是指每秒钟传输的位数,通常以Kbps(千位/秒)来表示。
STM32提供了多个时钟源以供CAN控制器使用,根据时钟源的不同,可以选择不同的分频系数来计算波特率。
以下是STM32的CAN波特率计算公式:
CAN波特率=时钟频率/(分频系数+1)/(时间段1+时间段2+同步跳转长度)
其中,时钟频率为CAN控制器使用的时钟频率,分频系数是用于将时钟频率分频得到一个合适的数值。
时间段1、时间段2和同步跳转长度是CAN总线规范中定义的参数,可以根据具体的应用选择合适的数值。
对于示波器采样点数为(时间段1+时间段2)*采样点数频率之间的差值应尽量小于等于0.2
以下是一个例子,说明如何计算STM32的CAN波特率:
假设使用的时钟频率为80MHz,分频系数为10,时间段1为6,时间段2为7,同步跳转长度为1
CAN波特率 = 80 MHz / (10 + 1)/(6 + 7 + 1)= 800 Kbps
可以根据该公式,选择不同的参数来计算得到不同的CAN波特率。
需要注意的是,由于CAN波特率的计算与多个参数的组合相关,所以需要根据具体的应用需求进行调整和优化,以保证数据的可靠传输和通信的稳定性。
总结:STM32的CAN波特率计算是根据时钟频率、分频系数、时间段1、时间段2和同步跳转长度这些参数进行计算的。
可以根据具体的应用需求合理选择这些参数,以实现合适的CAN波特率。
STM32之串⼝波特率计算
1.1 波特率结构框图
1.2 波特率寄存器⽰意图
1.3 波特率计算公式⽰意图
两图看出,串⼝波特率寄存器是⼀个32位,只⽤低16位,低16位⼜划分,低4位⽤来装⼩数,其他⽤来装整数。
波特率计算公式:Tx/Rx 波特率 = fCK/(8*(2- OVER8 )* USARTDIV)
USARTDIV = fCK/8*(2- OVER8 )/TxRx 波特率
Tx/Rx 波特率已知值 //就是我们我们平常说设置的115200Hz.
fCK是已知值 //串⼝时钟84MHz
OVER8通过CR1寄存器设置
USARTDIV的值是写⼊到BRR寄存器,需要计算的值。
如下列:
void Usart1_Init(u32 baudRate)//假设baudRate=115200Hz
{
float USARTDIV;
u16 Mantissa;
/****设置波特率***/
//USARTDIV = fCK/8*(2- OVER8 )/TxRx 波特率
//USARTDIV= Mantissa+(Fraction/8*(2-OVER8 ))
USARTDIV = (float)84000000/8/baudRate;//设OVER8 =1;fck=84000000Hz Mantissa = (int)USARTDIV;//取整数部分
Fraction = (u8)((USARTDIV-Mantissa)*16);//把⼩数部分整成16位整数
USART1->BRR = Mantissa<<4 | Fraction;
}。
Stm32 CAN波特率设置+MCP2515波特率比较得到500Kb/s的波特率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;每一位的Tq数目 = 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16 如果CAN时钟是 8 MHz : (8M / 1 ) / 16 = 500K其中:1 为分频系数16 为每一位的Tq数目为了设置为 100K, 把分频系数改为5即可, BS1 BS2 不变每一位的Tq数目 = 1 (固定) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是 8 MHz : (8M / 5 ) / 16 = 100K如果想得到 1M 的波特率, CAN时钟仍然是 8 MHz的情况下,分频系数不变应该改变 BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的Tq数目 = 1 (固定) + 5 (BS1) + 2 (BS2) = 8如果CAN时钟是 8 MHz : (8M / 1 ) / 8 = 1000K另外尽可能的把采样点设置为 CiA 推荐的值:75% when 波特率 > 800K80% when 波特率 > 500K87.5% when 波特率 <= 500K所以对于 100K 的波特率(假定使用 8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于 500K 的波特率(假定使用 8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于 1000K 的波特率(假定使用 8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; (1+5) / (1+5+2) = 75%MCP2515最关键是参考数据手册。
STM32CAN波特率计算CAN总线的波特率是根据CAN基准时钟频率(CANCLK)和总线长度来计算的。
在STM32微控制器中,CANCLK的频率通常由APB1总线时钟(PCLK1)提供,而PCLK1则由系统时钟(SYSCLK)分频得到。
具体计算公式为:波特率(bps)= CANCLK频率 /((BRP+1)* (SJW+BS1+BS2))其中,BRP表示位时间(BITTIME)分频器的比例因子,范围为1到1024;SJW表示同步跳转宽度,范围为1到4;BS1表示位时间分割1的时间段,BS2表示位时间分割2的时间段。
对于STM32的CAN控制器,BRP、SJW、BS1和BS2的设置可以通过CAN_BTR寄存器来进行配置。
BRP的计算公式为:BRP=(CANCLK频率/波特率)/((SJW+BS1+BS2))以下是计算波特率的步骤:1.确定CAN基准时钟频率(CANCLK)。
CANCLK的频率一般为APB1总线时钟(PCLK1)的一半。
例如,如果PCLK1频率为72MHz,则CANCLK频率为36MHz。
2.确定位时间(BITTIME)。
根据CAN规范,位时间由同步跳转宽度(SJW)、位时间分割1(BS1)和位时间分割2(BS2)组成。
这些参数的取值范围由CAN控制器的具体型号决定。
3.确定位时间分频器比例因子(BRP)。
BRP的计算公式为:BRP=(CANCLK频率/波特率)/((SJW+BS1+BS2))注意,BRP的范围为1到1024,因此需要根据BRP计算结果进行调整。
4.使用BRP、SJW、BS1和BS2的值来配置CAN_BTR寄存器。
将BRP值写入CAN_BTR寄存器的BRP字段,将SJW、BS1和BS2值写入相应的字段。
5.根据计算得到的波特率,对其他CAN节点进行相应的配置。
以上就是计算STM32CAN波特率的步骤。
需要注意的是,波特率的计算中要考虑到CAN总线的长度和其他节点的配置,以确保通信的稳定和可靠性。
can总线波特率和距离公式Can总线波特率和距离公式Can总线是一种常用的数据通信协议,被广泛应用于汽车电子、工业控制等领域。
在Can总线中,波特率和通信距离是两个重要的参数。
本文将围绕这两个参数展开讨论,并介绍Can总线波特率和距离的公式计算方法。
一、Can总线波特率Can总线的波特率是指每秒钟传输的位数,通常以bps(bits per second)为单位。
波特率的选择需要考虑数据传输的速率和稳定性。
Can总线的波特率公式为:波特率 = (1 / (n + tseg1 + tseg2)) * fclk其中,n为时间段数量,tseg1为时间段1的长度,tseg2为时间段2的长度,fclk为时钟频率。
Can总线的波特率取决于时钟频率和时间段的长度。
时间段数量n 通常为20,可以根据实际情况进行调整。
时间段1的长度tseg1和时间段2的长度tseg2需要满足一定的关系,以保证数据传输的稳定性。
二、Can总线距离Can总线的通信距离是指信号能够传输的最大距离。
通信距离的选择需要考虑信号衰减、噪声干扰等因素。
Can总线的距离公式为:距离 = 速度 * 传输时间其中,速度是信号在传输介质中的传播速度,传输时间是信号从发送端到接收端的传输时间。
Can总线的传输介质通常是双绞线,其传播速度约为2/3光速。
根据传输时间和传播速度,可以计算出Can总线的通信距离。
三、波特率和距离的关系Can总线的波特率和通信距离存在一定的关系。
较高的波特率可以实现更快的数据传输速率,但通信距离较短;较低的波特率可以实现较远的通信距离,但数据传输速率较慢。
在实际应用中,需要根据具体的通信需求来选择合适的波特率和通信距离。
如果需要实现高速数据传输,可以选择较高的波特率,但需要注意通信距离的限制;如果需要实现较远的通信距离,可以选择较低的波特率,以保证数据传输的稳定性。
总结:Can总线是一种常用的数据通信协议,波特率和距离是其中两个重要的参数。
STM32下波特率计算详解于APB2,USART 2-5 的时钟来源于APB1。
在STM32 中,有个波特率寄存器USART_BRR,如下:STM32 串口波特率通过USART_BRR 进行设置,STM32 的波特率寄存器支持分数设置,以提高精确度。
USART_BRR 的前4 位用于表示小数,后12 位用于表示整数。
但是它还不是我们想要设置的波特率,想要设置我们串口的波特率大小还需要进行计算。
其实有关波特率的计算是下面这一条表达式:从上面的表达式,我们引入了一个新量USARTDIV,它表示对串口的时钟源fck进行分频。
假设我们已知道了波特率和fck 时钟频率的大小,那么通过上式便可以计算出USARTDIV 的具体大小,然后再通过USART 的值大小对波特率寄存器进行设置。
USARTDIV 通过上面的表达式得出,是一个带有小数的浮点数(如27.75)。
将小数部分和整数部分分开,分别得到一个整数值n(如27)和一个小数值m(如0.75)。
有了这两个值我们便可以填写USART_BRR 寄存器进而设置我们串口波特率大小了。
将整数部分m(27 = 0x1B)直接写入USART_BRR 的后12 位部分;将小数部分n 乘以16 后得到的整数值(如0.75x 16 = 12 = 0xC)写入USART_BRR 前4 位部分,最后USART_BRR 的值为0x1BC。
注意:如果小数部分乘以16 之后仍带有小数,则要四舍五入去除小数部分得到一个新的整数,再将其写入USART_BRR 的前四位。
为什么在计算波特率的公式中要乘以16?我们知道串口通信是通过TXD 和RXD 这两条线进行通信的,当接收器的RXD 连接着发送器的TXD,接收器的TXD 连接着发送器的RXD,接收器和发送器可以通过RXD 和TXD 互传数据。
当接收器检测到RXD 这条线的电平被拉为低电平,立即开始接收发送器发送过来的数据,刚刚那个低电平只是一个告知接收器可以接收数据的起始位而已。
STM32单片机的串口通信波特率计算方法串口通信的波特率计算方法是根据串口通信协议来确定的,对于STM32单片机来说,常用的串口通信协议是RS232和UART。
1.RS232协议:对于STM32单片机的串口通信,可以通过设置UART的波特率寄存器来实现波特率的设置。
STM32单片机的UART波特率寄存器是一个16位的寄存器,可以设置的波特率范围为300bps到3Mbps。
以下是计算方法:波特率=时钟频率/(16×(USARTDIV+1))其中,时钟频率为STM32单片机的时钟频率,USARTDIV为波特率除以时钟频率再减1得到的值。
例如,如果我们需要设置波特率为9600bps,而STM32单片机的时钟频率为72MHz,则计算方法如下:USARTDIV=(72MHz/(16×9600))-1=468.75因为USARTDIV是一个整数,所以需要取整数部分,即USARTDIV=468所以,设置STM32单片机的UART波特率寄存器为468,即可实现波特率为9600bps的串口通信。
2.UART协议:对于STM32单片机的UART通信,同样可以通过设置UART的波特率寄存器来实现波特率的设置。
STM32单片机的UART波特率寄存器计算方法同RS232协议一样。
例如,如果我们需要设置波特率为9600bps,而STM32单片机的时钟频率为72MHz,则计算方法如下:USARTDIV=(72MHz/(16×9600))-1=468.75因为USARTDIV是一个整数,所以需要取整数部分,即USARTDIV=468所以,设置STM32单片机的UART波特率寄存器为468,即可实现波特率为9600bps的串口通信。
需要注意的是,计算的结果应该是整数,如果计算得到的结果是小数,则需要取整数部分。
同时,波特率的准确性也受到系统时钟的精度和误差的影响,因此在实际应用中,可以通过示波器或者其他工具进行波特率的频率测量和校准。
一般设置CAN_SJW = 1,总结程序发现!!!can时钟是RCC_APB1PeriphClock(APB1从APB2而来,分频系数不同,导致APB1不同,mini版中一般是APB2为72Mhz,APB1是36MHz),你要注意CAN时钟频率CAN波特率=RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler ;另外尽可能的把采样点设置为CiA 推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于100K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%CAN波特率计算—网友总结STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用.bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟:APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图:有了上边的这个图,基本就清楚了.总线时钟MHz (3+TS1+TS2)*(BRP+1)===================================================下面是我的计算:CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;(lyp发现大部分都是设置这个SJW为1tq,导致一些人把这个当做一个系数,这是错误的,因为这个公式里的1tq是固定的同步段(SYNC_SEG),与SJW无关!!!)CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;CAN_InitStructure.CAN_Prescaler = 4;//2nominal bit time(3+5+1)tq=9tq关于分频系数查看system_stm32f10x.c下面的static void SetSysClockTo72(void) 函数/* HCLK = SYSCLK *//* PCLK2 = HCLK *//* PCLK1 = HCLK/2 */所以can时钟72MHZ/2/4=9 Mhz????????============================================================================================= void CAN_Configuration(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;/* CAN register init */CAN_DeInit();CAN_StructInit(&CAN_InitStructure);/* 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_Normal;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;CAN_InitStructure.CAN_Prescaler=200;CAN_Init(&CAN_InitStructure);/* CAN filter init */CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMa sk;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);}注意//#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */拨特率10K,公式:72MHZ/2/200/(1+9+8)=0.01,即10K,和SJA1000测试通过================================================120欧姆电阻要加上!!!哦确实是CAN->BTR = (u32)((u32)CAN_InitStruct->CAN_Mode << 30) | ((u32)CAN_InitStruct->CAN_SJW << 24) |((u32)CAN_InitStruct->CAN_BS1 << 16) |((u32)CAN_InitStruct->CAN_BS2 << 20) |((u32)CAN_InitStruct->CAN_Prescaler - 1);总结一下Fpclk=36M 时can波特率为250k 的配置为/* 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=9;CAN_Init(&CAN_InitStructure); 250k======================================的:将can总线波特率设置为250k在官方的can例程上给出了100k 查询和500k 中断方式的例子分别设置如下:CAN_Polling:/* 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_InterruptCAN_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_SJW = 1,总结程序发现!!!can时钟是RCC_APB1PeriphClock(APB1从APB2而来,分频系数不同,导致APB1不同,mini版中一般是APB2为72Mhz,APB1是36MHz),你要注意CAN时钟频率CAN波特率=RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler; 如果CAN时钟为8M,CAN_SJW = 1,CAN_BS1 = 8,CAN_BS2 =7,CAN_Prescaler = 2那么波特率就是=8M/(1+8+7)/2=250K=========================================得到500Kb/s的波特率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;每一位的Tq数目= 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是8 MHz : (8M / 1 ) / 16 = 500K其中:1 为分频系数16 为每一位的Tq数目为了设置为100K, 把分频系数改为5即可, BS1 BS2 不变每一位的Tq数目= 1 (固定) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是8 MHz : (8M / 5 ) / 16 = 100K如果想得到1M 的波特率,CAN时钟仍然是8 MHz的情况下,分频系数不变应该改变BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的Tq数目= 1 (固定) + 5 (BS1) + 2 (BS2) = 8如果CAN时钟是8 MHz : (8M / 1 ) / 8 = 1000K另外尽可能的把采样点设置为CiA 推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于100K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于500K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于1000K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+5) / (1+5+2) = 75%个人见解, 仅供参考。