STM32_CAN波特率计算

STM32_CAN波特率计算
STM32_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 波特率> 800K

80% when 波特率> 500K

87.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;//2

nominal 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_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_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 BS2

CAN_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 波特率> 800K

80% when 波特率> 500K

87.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%

个人见解, 仅供参考。

上边这个公式算出来的就是CAN的速率了

8051的串口波特率的计算(笔记版)

8051的串口波特率的计算 1、方式0的波特率,固定为晶振频率的十二分之一。 2、方式2的波特率,取决于PCON寄存器的SMOD位。PCON是一个特殊的寄 存器,吹了最高位SMOD位,其他位都是虚设的。计算方法如下: SMOD=0,波特率为晶振的1/64; SMOD=1,波特率为晶振的1/32. 3、方式1与方式3的波特率都是由定时器的溢出率决定的。 公式为: BR=(2SOMD/32)*(定时器TI的溢出率) 通常情况下,我们使用定时器的方式2,即比率发生器,自动重载计数常数。 溢出的周期为: T=(256-X)*12/fosc 溢出率为溢出周期的倒数,即 T1=1/T 所以: 式中:SMOD是所选的方式,fosc是晶振频率。X是初始值。 51单片机模拟串口波特率计算方法 1.计算波特率位间隔时间(即定时时间,其实就是波特率的倒数) 位间隔时间(us)=10(6)(us)/波特率(bps)

2.计算机单片机指令周期: 指令周期(us)=12/晶振频率(Mhz) 补充问题:做串口通信时,为什么要把晶振频率设为11.0592,为什么要把波特率设为9600? 先说波特率。波特率从300到115200都可以,甚至更高或更低。一般规范的波特率都是3的倍数,比如9600、19200、38400;但是并不是一定的,波特率也可以是10000或者10001、10002,只要你的设备能产生符合这个要求的频率,尤其是自己用时,波特率都是很随意的,没有限制。只是多数时候为了和电脑配合,波特率才规范为固定的几个值,且为了传输稳定,用9600。 用11.0592晶振的原因是51单片机的定时器导致的。通常用11.0592M晶振是为了得到标准的无误差的波特率。举例说来,如我们要得到的9600的波特率,晶振为11.0592M和12M,定制器1为2SMOD设为1,分别看看那所求的TH1为何值。代入公式: 11.0592M 9600=(2/32)*((11.0592M/12)(256-TH1)) TH 1=250 12M 9600=(2/32)*((12M/12)(256-TH1)) TH1=249.49

波特率计算公式

一、波特率概念 波特率即调制速率,指的是信号被调制以后在单位时间内的波特数,即单位时间内载波参数变化的次数。它是对信号传输速率的一种度量,通常以“波特每秒”(Bps)为单位。波特率表示每秒钟传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,1波特即指每秒传输1个符号。波特(Baud,单位符号:Bd)这一单位是以法国电讯工程师埃米尔·博多(英语:émile Baudot)(1845-1903)的姓氏来命名的,他是数位通讯的先驱之一,是电传与博多式电报机的发明人。 波特率有时候会同比特率混淆,实际上后者是对信息传输速率(传信率)的度量。波特率可以被理解为单位时间内传输码元符号的个数(传符号率),通过不同的调制方法可以在一个码元上负载多个比特信息。因此信息传输速率即比特率在数值上和波特率有这样的关系。 计算机内部采用二进制的方式计数,那么它为什么又能识别十进制数和各种字符、图形呢?其实,不论是数值数据还是文字、图形等,在计算机内部都采用了一种编码标准。通过编码标准可以把它转换成二进制数来进行处理,计算机将这些信息处理完毕再转换成可视的信息显示出来。常用的字符代码是ASCII码,它原来是美国的国家标准,1967年被定为国际标准。 二、波特率计算公式有哪些? 在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS—51串行口编程可约定四种工作方式。其

中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。 串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同。 1、方式0的波特率 方式0时,移位时钟脉冲由56(即第6个状态周期,第12个节拍)给出,即每个机器周期产生一个移位时钟,发送或接收一位数据。所以,波特率为振荡频率的十二分之一,并不受PCON寄存器中SMOD的影响,即:方式0的波特率=fosc/12 2、方式2的波特率 串行口方式2波特率的产生与方式0不同,即输入时钏源的频率不同,控制接收与发送的移位时钟由振荡频率Foec的第二节拍P2(即Foec/2)给出,所以,方式2波特率取决于PCON中SMOD 位的值,当SMOD=0时,波特率为Foec的六十四分之一;若SMOD=1,则波特率为Foec的三十二分之一,即:方式2的波特率=2smod/64*Foec。 3、方式l和方式3的波特率 方式1和方式3的移位时钟脉冲由定时器T1的溢出率决定,故波特宰由定时器T1的溢出率与SMOD值同时决定,即:方式1和方式3的波特率=2SMOD/32?T1溢出率。 其中,溢出率取决于计数速率和定时器的预置值。计数速率与TMOD寄存器中C/T的状态有关。当C/T=0时,计数速率=fosc/2;

51单片机串口通信及波特率设置

51单片机串口通信及波特率设置 MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。 1. 数据缓冲寄存器SBUF SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。 2. 状态控制寄存器SCON SCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。它的各个位定义如下: MSB LSB SM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。 SM0 SM1 工作方式功能波特率 0 0 0 8位同步移位寄存器Fosc/12 0 1 1 10位UART 可变 1 0 2 11位UART Fosc/64或Fosc/32 1 1 3 11位UART 可变 SM2在工作方式2和3中是多机通信的使能位。在工作方式0中,SM2必须为0。在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。此功能可用于多处理机通信。 REN为允许串行接收位,由软件置位或清除。置位时允许串行接收,清除时禁止串行接收。 TB8是工作方式2和3要发送的第9位数据。在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。在多处理机通信中,该位用于表示是地址帧还是数据帧。 RB8是工作方式2和3中接收到的第9位数据(例如是奇偶位或者地址/数据标识位),在工作方式1中若SM2=0,则RB8是已接收的停止位。在工作方式0中RB8不使用。 TI 为发送中断标志位,由硬件置位,软件清除。工作方式0中在发送第8位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。TI=1时,申请中断。CPU 响应中断后,发送下一帧数据。在任何工作方式中都必须由软件清除TI。 RI为接收中断标志位,由硬件置位,软件清除。工作方式0中在接收第8位末尾由硬件置位;在其他工作方式时,在接收停止位的中间由硬件置位。RI=1时,申请中断,要求CPU取走数据。但在工作方式1中,SM2=1且未接收到有效的停止位时,不会对RI置位。在任何工作方式中都必须由软件清除RI。 系统复位时,SCON的所有位都被清除。 控制寄存器PCON也是一个逐位定义的8位寄存器,目前仅仅有几位有定义,如下所示:MSB LSB

STM32单片机的串口通信波特率计算方法

STM32单片机的串口通信波特率计算方法 1. 什么是波特率 不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。 2. STM32波特率相关的寄存器 STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。 该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。 3. 波特率计算方法 STM32的数据手册给出了计算方法,有一个公式,如下图所示: 在这个公式上,共有三个变量,其中两个我们是知道的,Fck和Tx/Rx波特率这两个是已知的,USARTDIV是未知的。通过该公式的描述可以看出如果使用USART1的话,那Fck 就是PCLK2=72MHz,否则就是PCLK1=36MHz,Tx/Rx波特率这个参数是已知的。只需要计算出USARTDIV的值赋值给USART_BRR寄存器就可以了。以115200为例,将公式变形后得到:USARTDIV = 72×1000000/(16×115200) = 39.0625。即将39.0625写入USART_BRR即可。 前文说过,USART_BRR的前4位存放小数部分,后12位存放整数部分。 那小数部分DIV_Fraction = 0.0625×16 = 1 = 0x01;那整数部分DIV_Mantissa = 39 = 0x27;那USART_BRR = 0X271; 数据手册给我们提供了一张数据表: 在这张数据表上,已经算出了常用的波特率值,我们可以拿来直接用。但是如果我们想把

波特率计算

波特率选择 在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。 方式0 方式0的波特率固定为主振频率的1/12。 方式2 方式2的波特率由PCON 中的选择位SMOD 来决定,可由下式表示: 波特率=2的SMOD 次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc 3.方式1和方式3 定时器T1作为波特率发生器,其公式如下: 波特率=定时器T1溢出率 产生溢出所需的周期数/计数率T 132 2=溢出率T 1mod ?s 式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。 定时器T1工作于方式0:溢出所需周期数=8192-x 定时器T1工作于方式1:溢出所需周期数=65536-x 定时器T1工作于方式2:溢出所需周期数=256-x 因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。 当时钟频率选用11.0592MHZ 时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。 下表列出了定时器T1工作于方式2常用波特率及初值。 常用波特率 Fosc(MHZ) SMOD TH1初值 19200 11.0592 1 FDH 9600 11.0592 0 FDH 4800 11.0592 0 FAH 2400 11.0592 0 F4h 1200 11.0592 0 E8h 例如9600 11.0592 0 FDH 溢出率T 1定时时32 2 =波特率mod ?s T1溢出率= T1计数率/产生溢出所需的周期数 产生溢出所需的周期数=256-FD(253)=3 SMOD=0 11059200/12*3 *1/32=9600

单片机波特率的计算方法

51单片机波特率计算的公式和方法 51单片机芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。它的各个位的具体定义如下: SM0SM1SM2REN TB8RB8TI RI SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。 波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准9600不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是9600÷10=960字节。 51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。 模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率,就是说定时器1每溢出一次,串口发送一次数据。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。

上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2下定时器1溢出速率的计算公式如下: 溢出速率=(计数速率)/(256-TH1初值) 溢出速率=fosc/[12*(256-TH1初值)] 上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。通常用11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD 设为1,分别看看那所要求的TH1为何值。代入公式: 11.0592M 9600=(2÷32)×((11.0592M/12)/(256-TH1)) TH1=250

单片机与PC机串行通信中波特率的确定

单片机与PC机串行通信中波特率的确定 关键字:单片机 PC机串行通信波特率 1 单片机异步通信口的特点及波特率的选定 MSC51系列单片机有一个全双工的异步通信口,他利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。异步串行通信发送和接收数据的速率与移位脉冲同步。一般用51系列的T1定时器作为波特率发生器,T1的溢出率经二分频(或不分频)后又经十六分频作为串行发送或接收的移位脉冲,移位脉冲的速率即波特率。单片机的异步通信波特率与串行口的工作方式、主振频率Fosc及定时器T1的工作方式有关。一般通信中使T1工作于方式2(可重装时间常数方式),若Fosc取6 MHz,则波特率的计算公式如下: 其中:SMOD是可编程的(即PCON的第8位),由此公式计算出的波特率是不标准的波特率。? 2 PC机异步通信口及其波特率的设置 由于UART(通用异步接收/发送器)的产品型号很多,PC机和XT机都采用的是INS8250芯片, AT机采用的是NSI16450芯片,他们二者是兼容的。因此这里以8250芯片为例来说明PC机异步通信波特率的设定方法。PC机中有2个异步通信口,一个是COM1,其端口地址范围是3F8H~3 FFH,另一个是COM2,其端口地址是2F8H~2FFH。其与MODEM配合可以实现远距离通信。其波特率是标准波特率50~9 600 b/s。 8250内部有10个寄存器端口,其中有一个除数锁存器,可以通过编程除数的大小来确定异步通信的波特率。8250使用的频率是1843 2 MHz的基准时钟输入信号,所以必须用分频的方法产生所需要的波特率(移位脉冲)。除数锁存器的值必须在8250初始化时设置,即把通信线路控制器的最高位(DLAB)置1,然后分两次把除数锁存器的高8位和低8位分别写入端口地址3F8H和3F9H(COM1),8250传送或接收串行数据时使用的时钟信号的频率是数据传输波特率的16倍,即波特率=16×除数/1 843 200。由此公式可以计算出几种标准波特率与除数的对应值如下:对应于波特率为1 200 b/s的除数锁存器的低8位值为60H;对应于波特率为2 400 b/s的除数锁存器低8位的值为30H;对应于波特率为4 800 b/s的除数锁存器低8位的值为18H;对应于波特率为9 600 b/s的除数锁存器低8位的值为0CH。 3 用PC机的汇编语言设计的串行通信程序中波特率的设定 PC机的ROM BIOS串行通信管理程序为14H号中断处理程序,他可支持DTE与DCE间的通信,也能支持两个DTE间用MODEM连接方式的RS232C接口通信。BIOS串行通信管理程序的功能是:串行口初始化、发送数据字符、接收数据字符和取串行口状态。他是利用查询方式来实现数据字符的接收和发送,但当查询超时一定时间后就不再继续查询,而认为是线路故障或对方未准备好,并通过返回参数中的超时标志来表示操作失败。 BIOS INT 14H的中断功能调用的入口和出口参数如下: 例如要设计用COM1来发送字符,波特率为1200 b/s,8 个数据位,1个停止位,采用查询方式无效验位,则初始化程序如下: 4 利用Turbo C编写的PC机通信程序中波特率的设定 Turbo C函数库中提供了专门的调用BIOS串行软中断的函数Bioscom(int cmd,char byte,int pure),其中:参数cmd用来设置通信类型,cmd=0,初始化串行口pure;cmd=1,发送一个字符;cmd=2,接收一个字符;cmd=3返回串口当前状态。参数byte用来确定串行口的异步

STM32_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 波特率> 800K 80% when 波特率> 500K 87.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) ===================================================下面是我的计算:

计算机网络原理公式及计算题

计算机网络原理公式及计算题 第三章物理层 公式一:数据传输速率的定义和计算 每秒能传输的二进制信息位数,单位为位/秒(bits per second),记作bps或b/s R=1/T*Log2N(bps) T为一个数字脉冲信号的宽度(全宽码情况)或重复周期(归零码情况)单位为秒. N一个码元所取有效离散值个数,也称调制电平数,取2的整数次方值公式二: 信号传输速率(码元速率、调制速率或波特率)定义和计算单位时间内通过信道传输的码元个数,也就是信号经调制后的传输速率,单位为波特(Baud)。 B=1/T (Baud) 公式三:调制速率与数据传输速率的对应关系式 R=B*Log2N(bps) 公式四:奈奎斯特公式 奈奎斯特(Nyquist)定理奈奎斯特首先给出了无噪声情况下码元速率的极限值B与信息带宽H的关系 B=2*H H是信道的带宽,单位为Hz 信道传输能力的奈奎斯特公式: C=2*H*Log2N

公式五:香农公式 受随机噪声干扰的信道情况,给出了计算信道的香农公式: C=H*Log2(1+S/N)(bps) 其中,S表示信号功率,N为噪声功率,S/N则为信噪比。由于实际使用的信道的信噪比都要足够大,故常表示成10*log10 (S/N),以分贝(dB)为单位来计算,在使用时要特别注意 公式六:误码率 误码率是衡量数据通信系统在正常工作情况下的工作情况下的传输可靠性的指标,它定义为二进制数据传输出错的概率。设传输的二进制数据总数为N位,其中出错的位数为Ne,则误码率表示为; Pe= Ne/N 公式七:采样定律 采样定理 ?Fs(= 1/Ts )≥ 2Fmax 或Fs≥2Bs ?Fs是采样频率,Fmax 是原始信号最大频率,Ts 为采样周期,Bs(= Fmax- Fmin)为原始信号的带宽。 ?量化级是2的整数倍,用来生成每次采样的二进制码的个数,?2二进制码个数=量化级,比如量化级为128,则每次采样二进制码为7个 ?信号传输速率=采样频率*每次采样的二进制码个数 ?R(数据传输率)=1/T*log2N

MCS-51单片机串行口工作方式与波特率计算举例

MCS-51单片机串行口工作方式与波特率计算举例 1)方式0 方式0是外接串行移位寄存器方式。工作时,数据从RXD串行地输入/输出,TXD 输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。 实际应用在串行I/O口与并行I/O口之间的转换。 2)方式1 方式1是点对点的通信方式。8位异步串行通信口,TXD为发送端,RXD为 接收端。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。 在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。 (1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入 输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND 和DATA无效,发送停止位,一帧结束,置TI=1。 (2)接收:REN=1后,允许接收。接收器以所选波特率的16倍速率采样RXD 端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。此后: A、若RI=0、SM2=0,则8位数据装入SBUF,停止位入RB8,置RI=1。

波特率计算公式

在数字通信中的数据传输速率与调制速率是两个容易混淆的概念。数据传输速率(又称码率、比特率或数据带宽)描述通信中每秒传送数据代码的比特数,单位是bps。 当要将数据进行远距离传送时,往往是将数据通过调制解调技术进行传送的,即将数据信号先调制在载波上传送,如QPSK、各种QAM调制等,在接收端再通过解调得到数据信号。数据信号在对载波调制过程中会使载波的各种参数产生变化(幅度变化、相位变化、频率变化、载波的有或无等,视调制方式而定),波特率是描述数据信号对模拟载波调制过程中,载波每秒中变化的数值,又称为调制速率,波特率又称符号率。在数据调制中,数据是由符号组成的,随着采用的调制技术的不同,调制符号所映射的比特数也不同。符号又称单位码元,它是一个单元传送周期内的数据信息。如果一个单位码元对应二个比特数(一个二进制数有两种状态0和1,所以为二个比特)的数据信息,那么符号率等于比特率;如果一个单位码元对应多个比特数的数据信息(m个),则称单位码元为多进制码元。此时比特率与符号率的关系是:比特率=符号率*log2 m,比如QPSK调制是四相位码,它的一个单位码元对应四个比特数据信息,即m=4,则比特率=2*符号率,这里“log2 m”又称为频带利用率,单位是:bps/hz。 另外已调信号传输时,符号率(SR)和传输带宽(BW)的关系是:BW=SR(1+α),α是低通滤波器的滚降系数,当它的取值为0时,频带利用率最高,占用的带宽最小,但由于波形拖尾振荡起伏大(如图5-15b),容易造成码间干扰;当它的取值为1时,带外特性呈平坦特

性,占用的带宽最大是为0时的两倍;由此可见,提高频带利用率与"拖尾"收敛相互矛盾,为此它的取值一般不小于0.15。例如,在数字电视系统,当α=0.16时,一个模拟频道的带宽为8M,那么其符号率=8/(1+0.16)=6.896Ms/s。如果采用64QAM调制方式,那么其比特率=6.896*log2 64=6.896*6=41.376Mbps 波特率即调制速率,指的是信号被调制以后在单位时间内的波特数,即单位时间内载波参数变化的次数。它是对信号传输速率的一种度量,通常以“波特每秒”(Bps)为单位。波特率有时候会同比特率混淆,实际上后者是对信息传输速率(传信率)的度量。波特率可以被理解为单位时间内传输码元符号的个数(传符号率),通过不同的调制方法可以在一个码元上负载多个比特信息。

单片机实验报告 计算器

单片机原理及其应用实验报告基于51单片机的简易计算器的设计 班级:12电子1班 姓名:金腾达 学号:1200401123 2015年1月6日

摘要 一个学期的51单片机的课程已经随着期末的到来落下了帷幕。“学以致用”不仅仅是一句口号更应该是践行。本设计秉承精简实用的原则,采用AT89C51单片机为控制核心,4X4矩阵键盘作为输入,LCD1602液晶作为输出组成实现了基于51单片机的简易计算器。计算器操作方式尽量模拟现实计算器的操作方式,带有基本的运算功能和连续运算能力。并提供了良好的显示方式,与传统的计算器相比,它能够实时显示当前运算过程和上一次的结果,更加方便用户记忆使用。本系统制作简单,经测试能达到题目要求。 关键词:简易计算器、单片机、AT89C51、LCD1602、矩阵键盘

目录 一、系统模块设计......................................................................................... 错误!未定义书签。 1.1 单片机最小系统 (1) 1.2 LCD1602液晶显示模块 (1) 1.3 矩阵按键模块 (2) 1.4 串口连接模块 (1) 二、C51程序设计 (2) 2.1 程序功能描述及设计思路 (2) 2.1.1按键服务函数 (2) 2.1.2 LCD驱动函数 (2) 2.1.3 结果显示函数 (2) 2.1.4状态机控制函数 (2) 2.1.5串口服务函数 (2) 2.2 程序流程图 (3) 2.2.1系统总框图 (3) 2.2.2计算器状态机流程转换图 (3) 三、测试方案与测试结果 (4) 3.1测试方案 (4) 3.3 测试结果及分析 (7) 4.3.1测试结果(仿真截图) (7) 4.3.2测试分析与结论 (7) 四、总结心得 (7) 五、思考题 (8) 附录1:整体电路原理图 (9) 附录2:部分程序源代码 (10)

波特率计算来选择晶振频率

波特率计算 在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS—51串行口编程可约定四种工作方式。其中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。 串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同。一、方式0的波特率 方式0时,移位时钟脉冲由56(即第6个状态周期,第12个节拍)给出,即每个机器周期产生一个移位时钟,发送或接收一位数据。所以,波特率为振荡频率的十二分之一,并不受PCON寄存器中SMOD的影响,即: 方式0的波特率=fosc/12 三、方式l和方式3的波特率 方式1和方式3的移位时钟脉冲由定时器T1的溢出率决定,故波特宰由定时器T1的 溢出率与SMOD值同时决定,即: 方式1和方式3的波特率=2SMOD/32·T1溢出率 其中,溢出率取决于计数速率和定时器的预置值。计数速率与TMOD寄存器中C/T的状态有关。当C/T=0时,计数速率=fosc/2;当C/T=1时,计数速率取决于外部输入时钟频率。 当定时器Tl作波特率发生器使用时,通常选用可自动装入初值模式(工作方式2),在 工作方式2中,TLl作为计数用,而自动装入的初值放在THl中,设计数初值为x,则每过“256一x”个机器周期,定时器T1就会产生一次溢出。为了避免因溢出而引起中断,此时应禁止T1中断。这时,溢出周期为: 系统晶振频率选为11.0592MHZ就是为了使初值为整数,从而产生精确的波特率。 如果串行通信选用很低的波特率,可将定时器Tl置于工作方式0或工作方式1,但在 这种情况下,T1溢出时,需用中断服务程序重装初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的办法加以调整。 表6—2列出了各种常用的波特率及其初值。

51单片机定时计数器溢出率计算和串口的波特率之间的关系

51单片机定时计数器溢出率计算和串口的波特率之间的关系 作者:wang1jin | 来源:网络| 查看:128 次 51芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用 SCON 寄存器。它的各个位的具体定义如下: SM0 SM1 SM2 REN TB8 RB8 TI RI SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工 作模式设置。 SMO SM 檯式功能 0 0 0 同歩移位寄存器 1 1 8 位 UART 1 0 2 9位UART 1 1 3 9 位 UART 波特率在使用串口做通讯时,一个很重要的 参数就是波特率,只有上下位机的波特率一 样时才可以进行正常通讯。 波特率是指串行端口每秒内可以传输的波特位数。 这里所指的波 特率,如标准9600 不是每秒种可以传送 9600个字节,而是指每秒可以传送 9600 个二 进位,而一个字节要 8个二进位,如用串口模式 1来传输那么加上起始位和停止位,每个 数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是 9600 - 10 = 960 字节。 51芯片的串口工作模式 0的波特率是固定的,为 fosc/12 ,以一个12M 的晶振 来计算,那么它的波特率可以达到 1M 。模式2的波特率是固定在 fosc/64 或fosc/32 , 具体用那一种就取决于 PCON 寄存器中的SMOD 位,如SMOD 为0 ,波特率为 focs/64,SMOD 为 1,波特率为 focs/32 。 模式1和模式3的波特率是可变的,取决于定时器1或2 (52芯片)的溢出速率, 就是说定时器1每溢出一次,串口发送一次数据 。那么我们怎么去计算这两个模式的波特 率设置时相关的寄存器的值呢?可以用以下的公式去计算。 发布:2010-1-05 01:08 | 波特率 £osc/12 可变 fosc/32 或fosc/64 可变

CAN波特率设置时的参数计算

CAN波特率设置时的参数计算 CAN(Controller Area Network)总线最早由德国 BOSCH公司提出,主要用于汽车内部测量与控制中心之间的数据通信。由于其良好的性能,在世界范围内广泛应用于其他领域当中,如工业自动化、汽车电子、楼宇建筑、电梯网络、电力通讯和安防消防等诸多领域,并取逐渐成为这些行业的主要通讯手段。 Can 控制器器只需要进行少量的设置就可以进行通信,其中较难设置的部分就是通信波特率的计算。CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。实际上,CAN总线的波特率是一个范围。假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置)。 CAN波特率设置时需要计算几个参数,这些参数共同决定波特率大小,由于计算比较复杂,希望有一个简易步骤,本人经过研究,找到一个简易办法,现贴出来分享,不对的地方请留言指正。需要说明的是,本人使用的can控制器是AT89C51CC03单片机中的can 首先,确定一下各项参数的取值范围: 参数范围编程值说明 BRP [1..64] 0-63 定义时间量子(时间份额)的长度tq Sync_Seg 1 tq 固定长度,总线输入与系统时钟同步 Prog_Seg [1..8]tq 0-7 补偿物理延时时间 Phase_Seg1 [1..8]tq 0-7 可通过同步暂时延长 Phase_Seg2 [1..8]tq 0-7 可通过同步暂时缩短 TSJW [1..4]tq 0-3 不能比任何一相位缓冲段长 以上是参数的取值范围,编程值是实际往寄存器里写的值,为实际取值减1。下面说一下步骤: 1、首先计算CAN时钟和波特率的比值; 2、根据比值确定预分频器的分频值BRP,计算时间量子的数目,这个数值范围是8-25; 3、将时间量子数减1(去掉Sync_Seg)后在Prog_Seg Phase_Seg1 Phase_Seg2三个参数中分配;

STM32的CAN波特率计算

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;//2

nominal 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 tq=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_AWUM=DISABLE;

51单片机晶振与波特率的关系

51 单片机晶振与波特率的关系 在串行通信中, MCS — 51 串口可约定四种工作方式。其中,方式 0 和方式 2 的波特率是固定的,而方式 1 和方式 3 的波特率是可变的,由定时器 T1 的溢出率决定。波特率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准9600 不是每秒种可以传送 9600 个字节,而是指每秒可以传送9600 个二进位,而一个字节要 8 个二进位,如用串口模式 1 来传输,那么加上起始位和停止位,每个数据字节就要占用 10 个二进位, 9600 波特率用模式 1 传输时,每秒传输的字节数是9600 - 10=960字节。一、方式0 和方式 2的波特率 方式0的波特率是固定的,为fosc/12 ,以一个12M的晶振来计算,那么它的波特率可以达到 1M。 方式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于 PCON 寄存器中的 SMOD 位,如 SMOD 为 0,波特率为 focs/64,SMOD 为 1 ,波特率为 focs/32 。二、方式 1 和方式3 的波特率 模式 1 和模式 3 的波特率是可变的,取决于定时器 1 或 2(对于 52 芯片)的溢出速率,就是说定时器 1 每溢出一次,串口 发送一次数据。可以用以下的公式去计算:上式中如设置了 PCON 寄存器中的 SMOD 位为 1 时就可以把波特率提升 2 倍。通常会使用定时器 1工作在定时器工作模式 2 下,这时定时值中的 TL1

做为计数, TH1 做为自动重装值,这个定时模式下,定时器溢出后, TH1 的值会自动装载到 TL1 ,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式 2 下定时器 1 溢出速率的计算公式如下:溢出速率 =(计数速率 )/(256-TH1 初值 ) 溢出速率 =fosc/[12*(256-TH1 初值 )] 上式中的“计数速率”与所使用的晶体振荡器频率有关,在 51 芯片中定时器启动后会在每一个机器周期使定时寄存器 TH 的值加 1,一个机器周期等于十二个振荡周期,所以可以得知 51 芯片的计数速率为晶体振荡器频率的 1/12 ,一个 12M 的晶振用在 51 芯片上,那么 51 的计数速率就为 1M 。通常用 11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到 9600 的波特率,晶振为 11.0592M 和 12M ,定时器1 为模式 2,SMOD 设为 1 ,分别看看那所要求的 TH1 为何值。代入公式: 11.0592M : 9600=(2 + 32) X ((11.0592M/12)/(256-TH1)) TH1=250 12M : 9600=(2 + 32) X ((12M/12)/(256-TH1)) TH1? 249.49 上面的计算可以看出使用 12M 晶体的时候计算出来的 TH1 不为整数,而 TH1 的值只能取整数,这样它就会有一定的误差存在不能产生精确的 9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用 11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对

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;//2 nominal 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 tq=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);

相关文档
最新文档