1 位时间特性
为了掌握如何设置STM32 CAN的波特率,首先我们得先了解一下位时间特性。
位时间特性逻辑通过采样来监视串行的CAN总线,并且通过跟帧起始位的边沿进行同步,及通过跟后面的边沿进行重新同步,来调整其采样点。
它的操作可以简单解释为,如下所述把名义上的每位的时间分为3段:
● 同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x tCAN)。
● 时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
● 时间段2(BS2):定义发送点的位置。它代表CAN标准里的PHASE_SEG2。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。
● 重新同步跳跃宽度(SJW):定义了在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。
● 有效跳变:被定义为,当bxCAN自己没有发送隐性位时,从显性位到隐性位的第1次转变。
如果在时间段1(BS1)而不是在同步段(SYNC_SEG)检测到有效跳变,那么BS1的时间就被延长最多SJW那么长,从而采样点被延迟了。相反如果在时间段2(BS2)而不是在SYNC_SEG检测到有效跳变,那么BS2的时间就被缩短最多SJW那么长,从而采样点被提前了。为了避免软件的编程错误,对位时间特性寄存器(CAN_BTR)的设置,只能在bxCAN处于初始化状态下进行。
注: 关于CAN位时间特性和重同步机制的详细信息,请参考ISO11898标准。
图1
特别注意上图下方的几个公式.可以得出的结论是:
CAN波特率=APB总线频率/BRP分频器/(1+tBS1+tBS2)
2 与CAN波特率有关的寄存器
CAN位时间特性寄存器 (CAN_BTR)
地址偏移量: 0x1C
复位值: 0x0123 0000
注: 当CAN处于初始化模式时,该寄存器只能由软件访问。
图2
位31 | SILM: 静默模式(用于调试) 0: 正常状态; 1: 静默模式。 |
位30 | LBKM: 环回模式(用于调试) 0: 禁止环回模式; 1: 允许环回模式。 |
位29:26 | 保留位,硬件强制为0。 |
位25:24 | SJW[1:0]: 重新同步跳跃宽度 为了重新同步,该位域定义了CAN硬件在每位中可以延长或缩短多少个时间单元的上限。 tRJW = tCAN x (SJW[1:0] + 1)。 |
位23 | 保留位,硬件强制为0。 |
位22:20 | TS2[2:0]: 时间段2 该位域定义了时间段2占用了多少个时间单元 tBS2 = tCAN x (TS2[2:0] + 1)。 |
位19:16 | TS1[3:0]: 时间段1 该位域定义了时间段1占用了多少个时间单元 tBS1 = tCAN x (TS1[3:0] + 1) |
位15:10 | 保留位,硬件强制其值为0。 |
位9:0 | BRP[9:0]: 波特率分频器 该位域定义了时间单元(tq)的时间长度 tq = (BRP[9:0]+1) x tPCLK |
3 如何在代码中配置波特率
配置波特率是在CAN模块初始化时配置,代码示例如下:
//CAN1 register init
CAN_DeInit(CAN1);
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 = ENABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //tBS1=6个tCAN时钟周期
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; //tBS2=8个tCAN时钟周期
CAN_InitStructure.CAN_Prescaler = 4; //ABP总线时钟时钟4分频
//CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)
//所以这里CANbps=APB1总线频率30000000/4/(8+6+1))=500k bps
//总体配置方向: Tseg1>=Tseg2 Tseg2>=tq; Tseg2>=2TSJW
if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED)
{
return _ERROR;
}
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);//打开FMP0中断
总体配置保持tBS1>=tBS2 tBS2>=1个CAN时钟周期 tBS2>=2tSJW
关键字:STM32 CAN 配置波特率
引用地址:
STM32之CAN---配置波特率
推荐阅读最新更新时间:2024-03-16 15:27
基于STM32的旋转编码器
..\..\SYSTEM\usart\usart.c(1): error: #5: cannot open source input file sys.h : No such file or directory #include ..\sys\sys.h 这样就可以找到路径了 再次编译出现了问题 ..\..\SYSTEM\usart\..\sys\sys.h(3): error: #5: cannot open source input file stm32f10x_lib.h : No such file or directory没有stm32f10x_lib.h这个库函数 怎么办??? 上网查了很多资料,都
[单片机]
stm32---SPI与内部flash
STM32F1 的闪存(Flash)模块由:主存储器、信息块和闪存存储器接口寄 存器等 3 部分组成。 主存储器:存放代码和数据常数 , (BOOT0,BOOT1)= (0,0) 信息块:分为两个小部分,其中启动程序代码存储stm的自带的启动程序用于串口下载(1,0)。其中用户选择字节,则一般用于配置写保护、读保护等功能。 闪存存储器接口寄存器:该部分用于控制闪存读写等,是整个闪存模块的 控制机构。 同样,STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是 被擦除了的(也就是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存 器的 PGERR 位将得到一个警告。 flash配
[单片机]
STM32+ESP8266获取网络时间和天气
先给出两个可以获取天气和时间的网站 https://www.seniverse.com/docs 可以获取天气 http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1 可以获取时间 接下来简单说说怎么通过AT指令的方式去获取天气及时间信息 1:连网 首先,ESP8266肯定是需要连上网才能访问这些信息。所以,第一步要做的就是让ESP8266连接上wifi热点,可以是路由器,也可以是手机热点。下面写出重要的步骤 1:使用串口发送指令AT+CWMOD
[单片机]
基于CAN总线的机械电子式制动系统电控单元的实现
1、引言
随着机电技术的发展,电子技术也渗入到了汽车制动系统中,出现了称为“电子制动系统”的新技术。与传统的汽车制动系统不同,电子制动系统以电子元件替代了大部分液压和机械元件,减少了制动系统机械传动的滞后时间。它根据驾驶员进行制动操作时,踏板行程传感器探知驾驶员的制动意图,进而对各轮制动力进行精确的控制,缩短了制动距离,从而增加了交通安全性 。
2、EMB
线控制动系统目前分为两种类型,一种为电液制动系统EHB (Electro-hydraulic Brake),另一种为电子机械制动系统EMB (Electro-Mechanical Brake) 。本文主要讨论的内容是后者。
相比传统制动控制系统,电子机械式制动
[电源管理]
STM8 CAN外部时钟控制寄存器
STM8 CAN外部时钟控制寄存器(CLK_CANCCR) 地址偏移值:0x0B 复位值:0x00 位7:3 保留。始终为0。 位2:0 CANDIV :外部CAN时钟分频值 由软件写入,用于指定外部CAN时钟的分频值。详情请参见章节23.9 000:外部CAN时钟=fHSE/1(复位值) 001:外部CAN时钟=fHSE/2 010:外部CAN时钟=fMASTER/4 … 111:外部CAN时钟=fMASTER/8
[单片机]
stm32-串口接受不定长数据方法(3种)
方法1:串口接受数据,定时器来判断超时是否接受数据完成。 方法2:DMA接受+IDLE中断 实现思路:采用STM32F103的串口1,并配置成空闲中断IDLE模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是200个字节,那么在单片机接收到一个字节的时候并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。当整帧数据发送完毕之后串口才会产生一次中断,此时可以利用DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。 应用对象:适用于各种串口相关的通信协议,如:MODBUS,PPI ;还有类似于
[单片机]
基于PIC单片机的CAN总线扩展技术
引 言 CAN总线是一种串行多主站局域网总线,被广泛应用于汽车控制系统、自动控制、楼宇自动化、医学设备等各个领域。其传输距离远,最远可达10 km,传输速率高,最高可达1 Mb/s,容错性能好,可靠性能高。但是由于CAN驱动器的驱动能力有限,CAN总线能够驱动的节点数有限,一般在100个左右,同时会随着传输距离的增加,最高传输速率会下降,如果距离过长会引起信号丢失、反射等故障。在实验室条件下测得在5 Kb/s的通信速率下最远通信距离能达到10 km;在18 Kb/s的通信速率下最远通信距离只能达到2 km;而在42 b/s的通信速率下,最远通信距离只能达到1 km。测试条件:线缆采用线径为0.75 mm2的屏蔽双绞线,线缆为
[嵌入式]
开漏输出和推挽输出
概述 在STM32或者GD32中,普通的输出GPIO输出方式主要是开漏输出和推挽输出,下面我们开始讲解这2种模式的区别。 下图是GPIO内部的结构示意图。 在上图中,P-MOS带了一个⚪,说明是低电平导通。 上图是GPIO的示意图,有输入和输出,如果简化为输出,则如下所示。 模拟文件下载 https://download.csdn.net/download/qq_24312945/85250172 推挽输出 推挽输出的内部电路大概是下图这个样子,由一个P-MOS和一个N-MOS组合而成,同一时间只有一个管子能够进行导通。 当输出高电平时候,P-MOS导通,N-MOS截至,此时电源电流入R5。 当输出低电平时
[单片机]