(转载)STM32有数个串口,每个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的,由于STM32采用了分数波特率,所以STM32的串口波特率设置范围很宽,而且误差很小。
由上表可知:USART_BRR的最低4位(位[3:0])用来存放小数部分DIV_Fraction,紧接着的12位(位[15:4])用来存放整数部分DIV_Mantissa,最高16位保留。
STM32的串口波特率计算公式如下:
上式中,Fpclk是给串口的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1,以前说过,PCLK1是由系统时钟分频得来,最大36MHZ,PCLK2是直接由系统时钟得来,最大72MHZ。)
USARTDIV是一个无符号定点数,我们已知要设置的波特率及系统时钟,这样就可以算出USARTDIV的值,并把它的整数和小数分离开来,分别写入USART_BRR寄存器里的对应位就行了,假设我们的串口1要设置为115200的波特率,而PCLK2的时钟为72M。这样,我们根据上面的公式有:
USARTDIV=72000000/(115200*16)=39.0625
那么得到:
DIV_Fraction=16*0.0625=1=0X01;
DIV_Mantissa= 468=0X27;
这样,我们就得到了USART1->BRR的值为0X27。只要设置串口1的BRR寄存器值为
0X27就可以得到115200的波特率。 |